Repository navigation
v2.6.0 — Full-skill accuracy pass
[2.6.0] — 2026-09-03
Full-skill accuracy pass. Every module was re-verified against live mainnet ABIs and tables, the current npm packages (@proton/cli 0.1.99, @proton/web-sdk 5.1.0-rc-4 / 4.4.2, @proton/js 30.1.0, proton-tsc 0.3.58, @proton/vert 0.3.24, @xpr-agents/openclaw 0.5.4, @xpr-agents/sdk 0.2.7, @eosrio/hyperion-stream-client 4.0.0-rc.3), upstream sources (Hyperion 4.1.0, Leap 5.0.3, proton.contracts, alcor-ui, alcor-v2-sdk), docs.metalx.com and xpragents.com/llms.txt, and ~200 URLs. About 75 confirmed inaccuracies fixed across 24 files; nothing unverified was changed. MINOR bump: substantial corrections.
Fixed — proton-tsc / contracts (smart-contracts.md, testing-debugging.md, examples.md, safety-guidelines.md, troubleshooting.md, token-creation.md, oracles-randomness.md)
Singleton.get()never returnsnull(returns a default instance); existence checks now usegetOrNull().TableStorehas nogetAll()/getBySecondaryIndex(); secondary lookups usegetBySecondaryU64(value, index)(single row or null).InlineActiontakes only the action name; sending is.act(contract, permission).send(data). Fixed in three places.- No
sendInline,formatAsset,getCaller,transfer,currentBlock,printI/printU,getRamUsage, orContract.requireRecipient— replaced withsendTransferToken(proton-tsc/token),Asset,hasAuth-based admin lookup,currentBlockNum,printi/printui, and the freerequireRecipient. - Oracle table in contracts: use
Data/DataVariantfromproton-tsc/oracles(aggregate.f64Value); a plainf64field mis-deserializes the variant. Off-chaindatarows have notimestamp— freshness comes frompoints[].time. - Build outputs are named after the source file (
mycontract.contract.wasm/.abi); the.contract.tsname is a convention, not a compiler requirement. @proton/vert:blockchain.createContract(name, folder)(noloadContract);addTimetakes aTimePointSec; bundledeosio.tokenlives inproton-tsc/external/eosio.token.proton actionhas no--verbose;stakexprparams arefrom, receiver, stake_xpr_quantity.- Real nodeos error texts for expired / CPU / RAM failures, with exception names;
unable to find keyis C++ CDT text, not proton-tsc. pricebattle:resolve(challenge_id, resolver)takes no price;Challengehasexpires_at; the deployed contract exposes no secondary index (frontend query now scans and filters);protonratingadmin pattern rewritten without a caller API.- Hyperion
get_actionsis GET-only (safety checklist curl fixed).localStoragecleanup clears everyproton-storage-*key. - Appending a trailing
BinaryExtension<T>field is the one supported additive table change; documented as the exception to the golden rule.
Fixed — CLI / SDK / backend (cli-reference.md, web-sdk.md, backend-patterns.md, accounts-permissions.md)
- CLI store is one
proton-cli.jsonunder the OS config dir (~/Library/Preferences/@proton/cli-nodejs/on macOS,~/.config/@proton/cli-nodejs/on Linux);~/.proton-clidoes not exist. proton account:createis the free Metal-identity flow with no flags; paid creation isaccount:create-funded -c -k -r.proton transaction:pushtakes unsigned{actions}JSON and signs from the keychain; bareproton transaction '<json>'does not parse its argument (still broken in 0.1.99).msig:proposetakes a JSON array of actions; msig example expiration is now computed (the old literal date had passed).key:listhides private keys by default but--reveal-privateprints them.- The
XPR_PRIVATE_KEYrefusal lives in thecreate-xpr-agentstarter'sstart.sh, not in@xpr-agents/openclaw(fixed in three files). session.link.transact({ actions })takes one argument; the two-arg form belongs tocreateCliApi().api.JsSignatureProvideris exported by@proton/js(noeosjsimport).@proton/web-sdk: the documented options are the 4.x shape;latestis 5.1.0-rc-4 withuiOptions.appInfo/uiOptions.themeand a two-fieldselectorOptions. Installs now pin@4,@proton/linkmust match web-sdk's major (not3.2.3-x),chainIdis fetched fromget_infowhen omitted,backButtondoes not exist (requestStatusdoes),removeSessiontakes(identifier, auth, chainId), and "Unknown Requestor" meansrequestAccountis unset.
Fixed — RPC / Hyperion / Light API / streaming (rpc-queries.md, real-time-events.md, resources.md, node-operation.md, hyperion-setup.md, hyperion-operations-caveats.md)
- All-numeric account names: appending
"."tolower_bound/upper_boundis rejected (chain_type_exception) on current nodeos — use the u64 encoding orkey_type: "name".get_table_by_scopebounds have the same integer-first bug. Helper unified assafeName(). /v2/history/get_transfersdoes not exist in Hyperion at all (not merely undeployed).get_transactionresponse shape (trx_id, lib, cached_lib, executed, actions[]…),get_accountstate shape (nestedaccount), andget_tokensamount: numbercorrected.- Light API:
tokenbalanceandusercountreturn text/plain numbers;keylookup is/api/key/{key}keyed by network;topholdersreturns[account, amount]pairs withlimit10–1000;decimalsis a string. - Streaming: stream objects emit
message, notdata(the doc's handlers never fired); unscoped requests are ackedstatus: FAIL, reason: invalid request; Hyperion 3.x servers deliver the handshake as amessage, 4.x as ahandshakeevent; bloxprod advertisestraces:false.block-streamis not on npm (clone the repo). control_portis read fromconnections.json, not the chain config. Snapshot mirror cited ashttps. Stream client 4.0.0-rc.3 is published under thelatesttag.- Dropped two closed neftyblocks P2P peers; nodeos version guidance now says Leap 5.0.3 (final Leap) or Spring 1.2.x, matching mainnet's v5.0.0–v5.0.3. Anchor URL is
anchorwallet.io.
Fixed — DeFi / DEX (metalx-dex.md, defi-trading.md, alcor-dex.md, simpledex.md, loan-protocol.md, staking-governance.md)
- MetalX DEX
order_typeis 1 limit / 2 stop-loss / 3 take-profit (per docs.metalx.com);show_error_msgisbool?; leaderboard takes repeatedmarket_ids=(bracketed form is a 400). - Alcor: mainnet market-creation fee is 2,000 XPR (×2 if base ≠ XPR; 50,000 XPR is testnet), paid by transfer with a
new_market|…memo; the API'sbase_currency/target_currencyare swapped relative to the on-chain table;accounttable is an order index, not balances; no/account/{name}/ordersendpoint; route endpoint is/swapRouter/getRoute; SDK has nocomputePoolAddress. - SimpleDEX:
dex.protonnz.comalready 308-redirects; 6-decimal quote tokens (XMD, XUSDC) scale ×1,000,000;sellfield isminXpr; moderation authority issimplesetup@activeor the 2-of-4 owner msig. - LOAN: liquidation memo is
liquidate,<borrower>,<LTOKEN>; one global 10%liquidation_incentive(no per-collateral table);borrowsrows have nohealth_factor(compute it); the whitelist gates contract callers by code hash, not users; supply refreshed (~114.2B). - Staking: staker rewards are claimed with
eosio::voterclaim(voterclaimstto restake) —claimrewardsis the BP pay claim; vote for exactly 4 BPs (fewer is accepted but disqualifies rewards); RAM ≈0.0004 XPR/byte with a live-lookup pointer.
Fixed — identity / payments / agents (webauth-identity.md, payment-patterns.md, xpr-agents.md, agent-bootstrap.md, README.md)
usersinfo.aacts/acare arrays of{field_0, field_1}tuples; KYC claim table gainsmetal.kyc:nationalidnumberand legacytrulioo:*sets (7–8 claims, order varies); contract snippet imports fixed.- XPR/USD is oracle feed 3 (payment example used a non-existent feed 1).
- xpragents: an unset name reads as
""(not 13 dots); the indexer's CORS is allow-listed to xpragents.com/localhost; funding an open job beforeselectbidis now rejected by the contract (wedge behaviour was pre-Sept-2026). @xpr-agents/openclawships 75 MCP tools (four places);proton key:locktakes no argument; the openclaw package exports CLI helpers, not registry classes; bootstrap script re-runsnpm install, notnpm update; Pinata docs link points at the HTML page; version pins refreshed to@proton/cli0.1.99 and@xpr-agents/sdk0.2.7.
Verified unchanged (for the record)
All 18 MetalX markets, the 19-live / 5-dormant oracle split, every LOAN collateral factor and feed index, SimpleDEX fees/thresholds, the four xpragents contract ABIs and every arity in xpr-agents.md, all resources.md token precisions and issuers, all Hyperion ops config keys and CLI subcommands against upstream 4.1.0, all 24 Leap config.ini keys, and the empty-memo DEX deposit behaviour (no refund action exists in the dex ABI).