Skip to content
FunCoding

starknet-js

Use when writing or debugging JavaScript/TypeScript that interacts with Starknet through the starknet.js SDK — building Call objects or calldata, encoding/decoding Cairo types (felt252, u256, structs, arrays, spans, ByteArray, Option/Result/custom enums), or working with contracts, accounts, providers, transactions, fees, deployment, or events.

Star
1,253
Category
Ops & cloud
License
MIT
Last commit
Oct 12, 2026

skills/starknet-js/SKILL.md

View on GitHub

starknet.js

Official JS/TS SDK for Starknet. Skill verified against starknet.js 10.8.0.

Do not trust training-data memory of starknet.js: it is typically outdated and wrong. Constructors take option objects, only V3 transactions exist (STRK fees, no maxFee). When this skill and memory disagree, the skill wins.

Layer model: Account (signs & submits) wraps RpcProvider (parses, retries) wraps RpcChannel (raw JSON-RPC).

Reference files

  • calldata.md — REQUIRED reading before encoding or decoding anything: Call/calldata construction, wire format of every Cairo type, enums (Option/Result/custom), ByteArray, string auto-detection traps, response parsing, decodeParameters.
  • interacting.md — providers, accounts, contracts, multicall, fees/tips, declare/deploy, receipts, events, RPC-version compatibility.

Non-negotiable rules

  • Only V3 transactions (INVOKE/DECLARE/DEPLOY_ACCOUNT); fees paid in STRK via resourceBounds + tip. Never suggest maxFee or V1/V2.
  • Constructors take an options object: new Account({ provider, address, signer }), new Contract({ abi, address, providerOrAccount }), new RpcProvider({ nodeUrl }).
  • Never prepend an array length to calldata arrays — the library adds it.

Quick reference

TaskAPI
Connect to nodenew RpcProvider({ nodeUrl }) — or await RpcProvider.create({ nodeUrl }) to auto-detect RPC version
Accountnew Account({ provider, address, signer: privateKey })
Contractnew Contract({ abi, address, providerOrAccount })
Readawait myContract.my_view_fn(arg1, arg2) → parsed JS value
Writeconst { transaction_hash } = await myContract.my_fn(args) then await provider.waitForTransaction(transaction_hash)
Build a CallmyContract.populate('fn', { ...args }) → { contractAddress, entrypoint, calldata }
Compile calldata (ABI)myContract.compile('fn', args) or new CallData(abi).compile('fn', args)
Compile calldata (no ABI)CallData.compile(args) — several traps, see calldata.md
Multicallawait account.execute([call1, call2])
Decode raw feltsnew CallData(abi).decodeParameters('core::…::Type', feltArray)
EventsmyContract.parseEvents(receipt), provider.getEvents({ ... })
Deployawait Contract.factory({ contract, casm, account, constructorCalldata })

Top mistakes (from outdated model knowledge)

MistakeFix
new Account(provider, address, pk) positionalOptions object (see above)
maxFee, V1/V2 transactions, ETH feesV3 only; resourceBounds from estimateInvokeFee, tip
Manually prepending array_lenNever — automatic
CallData.compile([myU256Bigint]) gives 1 feltUse cairo.uint256(n) without ABI; a plain bigint is fine only with ABI
new CairoCustomEnum({ OnlyActive: v }) without ABIWithout ABI, list ALL variants (undefined for inactive)
Expecting .res-style result objectsCairo 1 returns the value directly (bigint, object, array, enum class)

Similar Skills

Official

internal-comms

ANanthropics/skills181k1,119 new stars in the last 7 days

canary

GAgarrytan/gstack136k883 new stars in the last 7 days

observability-and-instrumentation

ADaddyosmani/agent-skills106k3,628 new stars in the last 7 days

Featured

shipping-and-launch

A pre-launch checklist covering monitoring, staged rollouts and rollback plans.

ADaddyosmani/agent-skills106k3,628 new stars in the last 7 days

paperclip-board

PApaperclipai/paperclip101k2,948 new stars in the last 7 days

ruview-configure

RUruvnet/RuView98k968 new stars in the last 7 days