Changelog
All notable changes to this project will be documented in this file.
[0.24.0] - 2026-06-20
DVT through-EntryPoint completion + validator-router wiring + default testnet nodes. Closes the last open item of the v0.20.0 acceptance (the DVT BLS path proven THROUGH EntryPoint.handleOps, UserOperationEvent success=true) and ships the supporting SDK surface. Backward-compatible (additive).
encodeBLSAccountSignature(@aastar/core) — the account-levelALG_BLS(0x01) signature forEntryPoint.handleOps:[0x01][nodeIdsLength(32)][nodeIds(N×32)][blsSig(256)][ownerECDSA(65)]per contract_validateTripleSignature. The trailing 65 bytes are the owner's EIP-191 sig overuserOpHash(recovered==owner), soALG_BLSis BLS + owner co-sign, not BLS-only. (The earlier[0x01]‖verifierProofwas missing the length prefix + owner sig.) Real on-chain handleOps proven: tx0xc01eae6f…(UserOperationEvent success=true).DEFAULT_DVT_NODES/getDefaultDvtNodes(chainId)(@aastar/core) — AAStar's always-on testnet DVT nodes (dvt1/2/3.aastar.io, independent production keys, registered onAAStarBLSAlgorithm0xAF525A…). Source of truth:YetAnotherAA-Validator/deploy/sdk-dvt-config.testnet.json.needsValidatorRouter(@aastar/core) +AccountManager.ensureValidatorRouter(userId, { router?, walletClient? })— router-delegated algIds (BLS 0x01, T2/T3 0x04/0x05, weighted 0x07, session 0x08) requiresetValidator(router)(the factory does NOT auto-wire it;validator()==0⇒ BLS validation returns 1).ensureValidatorRouterresolves the canonicalaaStarValidator, verifies the account is deployed +validator()==0, and sendssetValidatorvia a caller-supplied owner wallet.- Upstream sync: DVT
v1.4.0→v1.5.0(radar 4/4; wire-format unchanged — v1.5.0 adds the always-on testnet nodes + clone-and-deploy package). - Full v0.23.0/v0.20.0 business-feature acceptance recorded (
docs/onchain-evidence/v0.23.0-acceptance.md): all 10 scenario rows FEATURE-MET (decoded-revert + post-state + 2-round Codex challenge).
[0.23.0] - 2026-06-20
Feature (#118): P-256 (passkey) MAIN-account creation in the server-client (the path YAA uses). The server-client AccountManager could previously only deploy ECDSA-guardian accounts (createAccountWithDefaults), with no way to inject InitConfig.guardianP256X/Y — so a KMS-custodied / counterfactual owner could not install a passkey guardian AT DEPLOY time. New method AccountManager.createAccountWithP256Guardians(userId, { p256Guardians, ecdsaGuardians?, dailyLimit, approvedAlgIds?, minDailyLimit?, salt?, entryPointVersion? }) (and a p256Guardians option on createAccount) builds the full 8-field InitConfig via core buildInitConfig (reused, not hand-rolled), predicts the address via the factory's full-config getAddress(owner, salt, config), and persists the resolved config on the account record. New shared helpers account-init-config.ts (buildFullInitConfig, toGuardianSpecs, initConfigToTuple, serializeGuardianSpecs, initConfigFromRecord) let transfer-manager rebuild the BYTE-IDENTICAL initCode at first-UserOp deploy time (config-hash-in-salt ⇒ deployed address == predicted address).
- Acceptance-hash semantics (verified vs
AAStarAirAccountFactoryV7.sol): the full-configcreateAccountpath performs NO guardian-acceptance signature check — for P-256 OR ECDSA guardians. Front-run protection is thekeccak256(InitConfig)-in-CREATE2-salt binding; P-256 guardians are an owner-bootstrap (no quorum, no acceptance ceremony, #110④). This differs fromcreateAccountWithGuardians(), whose owner-only-saltcreateAccountWithDefaultspath still requires ECDSAACCEPT_GUARDIANsignatures. - Fix (#118 H1): wrong P-256 algId in
buildInitConfig.core/actions/initConfig.tsdefined the passkey constant as0x01(=ALG_BLS), so the default full-configapprovedAlgIdsfor a P-256 account was[0x02, 0x01]= [ECDSA, BLS] — it wrongly whitelisted BLS and OMITTED P-256. Corrected toALG_P256 = 0x03(AAStarAirAccountBase.sol:46, route match:604); the default is now[0x02, 0x03](ECDSA owner + P-256, never BLS). Unit tests assert the default contains 0x02 & 0x03 and NOT 0x01. - Fix (#118 M2): salt persisted as a lossless decimal string. A
number | bigintsalt could truncate (large JS number) or fail JSON serialization (bigint); the deploy-timeBigInt(account.salt)rebuild would then diverge from the predicted CREATE2 salt and strand funds. The P-256 path now rejects an unsafe-integer number salt and persistssaltas a decimal string, reconstructed losslessly for both prediction and deploy. Round-trip unit test with a >2^53 salt; the on-chain run uses one too. - Fix (#118 M1 / latent ABI selector bug). The local human-readable
AIRACCOUNT_FACTORY_ABIdeclaredInitConfig.TokenConfigas(uint256,uint256,uint256)while the deployed v0.20.0 factory packs it as(uint128 tier1Limit, uint128 tier2Limit, uint256 dailyLimit)(#82). The type string feeds the 4-byte selector, sogetAddress/createAccount/getAddressWithChainIdreverted on the live factory (the existing ECDSAcreateAccount/basic-create paths too). Corrected to the canonical JSON ABI; the selector-parity unit test now PINS the deployed factory's actual selectors (getAddress 0x3989c6b8,createAccount 0x5512953b,getAddressWithChainId 0x203df583) so both SDK ABI sources drifting together still fails the test. - On-chain (Sepolia):
createAccountWithP256Guardiansdeployed account0x2727282d1E822e8Ae18750393636915ab1bbba72WITH a passkey guardian (tx0x5e98c3fa…2308e1c8, status 0x1) using a >2^53 salt and defaultapprovedAlgIds == [0x02, 0x03]; on-chaingetGuardianP256Key(0)== the installed(x, y),guardianCount() == 1. Seedocs/onchain-evidence/v0.20.0.md.
[0.22.0] - 2026-06-20
Feature (#110 Batch 2): P-256 (WebAuthn passkey) guardians. Replaces the 8 NOT_IMPLEMENTED stubs from 0.21.0 with real implementations. New core crypto module crypto/p256Guardian.ts (re-exported by @aastar/sdk): buildP256GuardianChallenge, encodeWebAuthnAssertion (5-field abi.encode, fixed webauthn.get prefix, low-S), coseToP256XY (COSE_Key + compressed/uncompressed SEC1, enforced kty/crv), per-op opData builders, signP256GuardianAssertion (software authenticator). The 8 airAccountExtension wrappers (addP256Guardian, proposeRecoveryWithSig, …, mixed-sig) are real, with getStorageAt-based mixed-sig nonce getters. buildInitConfig wires P-256 guardians through the high-level InitConfig; passkey-guardian creation is guardian-sig-free owner bootstrap. All encodings byte-verified against AirAccountExtension.sol. On-chain: proposeRecoveryWithSig landed status 0x1 on Sepolia (the contract's EIP-7212 verification of the SDK challenge+assertion passed). Codex 2-round APPROVE. Also bumps the KMS pin openapi 0.23.1 → 0.23.2 (api in-sync).
[0.21.1] - 2026-06-20
Fix (#115): PaymasterClient V4 — account-type-aware UserOp signing. V4 signed UserOps with a raw 65-byte ECDSA sig; v0.20.0 AirAccount _validateSignature routes on signature[0] as an algId prefix, so a raw sig whose first byte == 0x02 (ALG_ECDSA) misroutes → intermittent AA24. A new signUserOpHash helper centralizes all 5 sign sites (incl. the internal gas-estimate pass); pass airAccountSig: true (new option on estimateUserOperationGas / submitGaslessUserOperation) to emit the deterministic [0x02][r][s][v] (66-byte) format for v0.20.0 AirAccounts. Default unchanged (raw-65) for SimpleAccount and other account types. Codex-reviewed (2 rounds, APPROVE).
[0.21.0] - 2026-06-20
On-chain acceptance (Sepolia): the v0.20.0 createAccount 8-field-InitConfig encoding is decode-verified across 3 independent paths (recovery createAccount, createAgentAccount, an isolated gasless-config createAccount) — see docs/onchain-evidence/v0.20.0.md. Codex-reviewed (5 rounds, APPROVE).
Upstream sync — v0.20.0 foundation (Batch 1; non-breaking). Detect → upgrade → vendor the infra pins; the P-256 / WebAuthn guardian feature itself is Batch 2 (stubbed here).
- AirAccount contracts
v0.19.0-beta.2→v0.20.0(full Sepolia redeploy 2026-06-20).- Addresses: all 11 AirAccount Sepolia addresses in
CANONICAL_ADDRESSES[11155111]realigned to the v0.20.0 deploy (factory0x99C9300d…, impl0xd51db7eB…, extension0x5529f508…), sourced fromairaccount-contract/docs/DEPLOYMENT-v0.20.0.md. OP / OP-Sepolia untouched. - ABIs: re-vendored
AAStarAirAccountV7.json+AirAccountExtension.jsonfrom the upstream full ABI (diamond-lite merged surface). - #30 recovery relocation: the 4 ECDSA recovery selectors (
proposeRecovery/approveRecovery/executeRecovery/cancelRecovery) are no longer on the V7 ABI — they live inAirAccountExtension, reached via the accountfallback→delegatecall(selectors + semantics unchanged). The serverRecoveryServicealready encodes them against the account address, so no wrapper becomes ABI-absent. - Events:
RecoveryProposed/RecoveryApproved/RecoveryCancelVotedgained a trailinguint8 guardianIdx(topic0 changed); vendored ABIs + the AirAccount event-ABI constants updated. - REMOVE_GUARDIAN signing payload (Batch-1 breaking; spec §6.4 / #120 [HIGH]): the guardian-signed
opDatais nowabi.encode(nonce, index, guardianToRemove, p256X, p256Y)(was(nonce, guardianToRemove)). This affects the plain ECDSA removal path too (extraindex+ twobytes32(0)key words). AddedRecoveryService.buildRemoveGuardianHash(...)(the SDK had no removal-signing helper before — only theencodeRemoveGuardiancalldata encoder, which is unaffected) returning the raw_guardianOpHashchallenge for guardians topersonal_sign; golden-vector tests included. Source:airaccount-contractdocs/p256-guardian-spec.md§6.4 +AAStarAirAccountBase.removeGuardian. - P-256 / WebAuthn guardian = Batch 2:
getRecoveryNonceandgetGuardianP256Keyship as real view reads;addP256Guardian,addP256GuardianWithMixedSigs,addGuardianWithMixedSigs,proposeRecoveryWithSig,approveRecoveryWithSig,cancelRecoveryWithSig,removeGuardianWithMixedSigs,modifyTierLimitsWithMixedGuardiansareNOT_IMPLEMENTEDstubs pointing at Batch 2 (packages/core/src/actions/airAccountExtension.ts).
- Addresses: all 11 AirAccount Sepolia addresses in
- KMS
openapi 0.23.0→0.23.1(doc-only pin; API/wire verified in-sync). - DVT
v1.3.0→v1.4.0(doc-only pin; wire-format unchanged — per-IP rate-limit + confirm flow are server-side, tracked in #82). - Radar fix: the AirAccount address anchor in
scripts/upstream/upstream-radar.tsnow prefers the dedicateddocs/DEPLOYMENT-v<latest>.md"Core addresses" table over CHANGELOG "Deployed" tables, so a release that does not republish a Deployed table no longer reads an older table and false-flags drift. - Also closed three pre-existing doc-coverage gaps surfaced by the re-vendor:
buildGrantHash/buildP256GrantHash(SessionKeyValidator views) andcreateAccountWithDefaults(factory write).
No package versions bumped — that is the separate release step.
[0.20.8] - 2026-06-18
Address bug fix (single source of truth). @aastar/airaccount carried its own hardcoded copy of protocol contract addresses, stale at v0.17.2-beta.4, while @aastar/core CANONICAL_ADDRESSES (the authority) was at v0.19.0-beta.2 (Sepolia full redeploy). The airaccount server used the stale copy internally.
AIRACCOUNT_ADDRESSEScurrent Sepolia fields now derive from@aastar/coreCANONICAL_ADDRESSES[11155111]— factory0x52c5190E, accountImpl0x7fe62d51, delegate/extension/agentRegistry/validatorRouter/BLS/sessionKey/forceExit/calldataParser realigned to v0.19.0-beta.2. Legacy/deprecated factory addresses retained for historical account recovery.- Added
@aastar/coreas an@aastar/airaccountdependency + an anti-drift test asserting the derived fields equalCANONICAL_ADDRESSES(CI fails if they ever diverge again). - Audit: confirmed
airaccountwas the ONLY package not sourcing addresses from@aastar/core; all others already do.
SDK Code Integrity Hash: 1b43e81d4cc394b44ed39665749d678666d9e7571054619f8da09aa64b04fec1
[0.20.7] - 2026-06-18
viem-only — ethers fully removed. Published with deps viem + @simplewebauthn/browser + axios (no ethers), Apache-2.0.
- ethers → viem migration:
@aastar/airaccount(the last ethers consumer) migrated 100% to viem — provider hub, signer hub, all 16 services, BLS packing, signatures. Byte-for-byte equivalence proven by a differential parity layer, now ethers-free golden-fixture tests.ethersremoved as a dependency everywhere (incl. root devDep + on-chain evidence scripts). - Passkey client decoupled from the YAA backend:
YAAAClient→AirAccountClient,YAAAServerClient→AirAccountServerClient(deprecated aliases kept). Passkey routes parameterized (DEFAULT_PASSKEY_ROUTES, overridable); deadapi.yetanotheraa.comdefault removed. Official hosted Relying-Party will beauth.aastar.io(served by aNode). - Hardening: typed wrappers for high-risk contract reads (gas budget, fund-custody address, guard allow/deny gates, session-key grant hashes); uint256 args enforced as
bigint. - Builds on 0.20.6 (repaired published
.d.tstypes + browser-build fix) and 0.20.5 (single-package@aastar/sdk/kmssubpath + seamless multi-chain address auto-resolution). - Tooling: SDK anvil business-regression harness repaired (address sync + honest pass/fail); TypeDoc API-doc generation restored.
SDK Code Integrity Hash: 55018672abdf24b1c9a66235c8f9f72d9e0c410ea6e1e5c9701fbca17bd68d5f
[0.20.1] - 2026-06-16
Upstream sync (radar-driven, detect→upgrade→test). Four upstreams moved on 2026-06-16:
- SuperPaymaster fresh Sepolia redeploy — 17 addresses re-synced + xPNTsToken
setSpenderDailyCapFor/spenderDailyCapOverride(ABI + wrappers + tests). - KMS openapi 0.22.0 → 0.23.0 (coverage already 100%; pin only).
- AirAccount contracts v0.18.0-beta.2 → v0.19.0-beta.2 — FULL Sepolia redeploy: although v0.19 has no new Solidity logic, the
ACCOUNT_VERSION/FACTORY_VERSIONbump to"0.19.0"changed bytecode and redeployed all 11 addresses (factory0x52c5190E, impl0x7fe62d51, BLS verifierAAStarBLSAlgorithm 0xA9EE4f8A→0x68c381Ad, aggregator0x77f7bf95, validator-router, session-key/force-exit/delegate/extension/agent-registry/calldata-parser). The DVT real-node E2E verifier was repointed to the newAAStarBLSAlgorithm. - DVT (YetAnotherAA-Validator) v1.2.0 → v1.3.0 — new opt-in
POST /signature/sign{ status: "pending_confirmation", userOpHash }response (CONFIRM_ENABLED high-value ops, released viaPOST /signature/confirm). The SDK now surfaces it as a typedDvtPendingConfirmationErrorfrom the co-sign assembly path instead of silently dropping the node; the full confirm-flow client remains tracked in #82.
Radar fix: the AirAccount address anchor now tracks the latest upstream CHANGELOG deploy table (a fixed version-specific E2E doc silently false-greened the v0.19 redeploy); self-contradiction now compares same-version docs only.
Compatible upstreams: AirAccount v0.19.0-beta.2 / SuperPaymaster v5.4.0-beta.1 (2026-06-16 redeploy) / KMS openapi 0.23.0 / DVT v1.3.0.
[0.20.0] - 2026-06-16
Compatible upstream versions: AirAccount contracts v0.18.0-beta.2 · SuperPaymaster v5.4.0-beta.1 · KMS openapi 0.22.0 · DVT (YetAnotherAA-Validator) v1.2.0. (Numbered 0.20.0 —
[0.19.0]was already used by an earlier, unreleased CHANGELOG entry below.)
Highlights this cycle
- 100% upstream ABI/API coverage (KMS / SuperPaymaster / AirAccount), enforced by
scripts/coverage/check-doc-coverage.ts+ an ABI-absent-wrapper audit. Closed across waves: SuperPaymaster pre-flight/price/BLS-timelock reads, the governance/admin surface (Registry/BLSAggregator/DVTValidator/GTokenStaking/MicroPaymentChannel/ReputationSystem), the full AirAccount account/factory/session/agent surface, xPNTsToken finance, KMS/UnfreezeKey, and the KMS TEE remote-attestation endpoints (/attestation+.well-known/attestation-measurements*, #37/#12/#87). - AirAccount contracts synced to v0.18.0-beta.2 (full Sepolia redeploy — all 11 addresses updated to the E2E-verified beta.2 deployment, incl. the DVT verifier
AAStarBLSAlgorithm 0xA9EE4f8A; re-vendored the 2 ABIs that changed:+guardSetStrictModeon the account,-g2Addon AAStarBLSAlgorithm);microPaymentChannelSepolia config drift fixed. - issue #30 — 65+ ABI-absent wrappers repaired: every action wrapper that called a
functionNameabsent from its ABI (v5.x removed/renamed fns; would revert on-chain) was re-verified and fixed — RENAMED where the ABI has the fn, or made to THROWNOT_IMPLEMENTEDwhere genuinely removed.x402.tsswitched toX402FacilitatorABI. - DVT v1 client aggregation (#63):
dvtWire.tsassembles the combined signature in the verifier's exact[tier][P256][nodeIds][blsSig]wire (byte-for-byte vs live Sepolia txs); an SDK-driven real-node E2E proves on-chainAAStarBLSAlgorithm.validate = 0. - Beta4 — agent on-chain lifecycle: complete viem agent surface (
agentRegistry+airAccountFactory) + a Sepolia E2E with real tx hashes (createAgentAccount → registerAgent → revokeAgent). - YAA #52 (Beta3.1):
issueXPNTsfix,checkResources, batch SBT mint, registry queries +getCommunityProfile(event back-trace),configureSBTRules/getCommunityStats,getMySBTIdfix; + repaired pre-existing dangling getters. - WebAuthn #49 challenge-binding (#58): TA-nonce →
clientDataJSONceremony across the KMS server-side signing paths (mainnet prerequisite beforeENFORCE_TA_CHALLENGE=true). - AirAccount v0.18 + SuperPaymaster v5.4 ABI/address sync; new
policyRegistry/x402Facilitator/timelockController/agentValidationRegistrykeys;microPaymentChannel+pntsrealigned to the live deployments. - Docs: README "Integration Infrastructure & Upstream Version Pins" (4 stacks) + mandatory
docs/RELEASE-CHECKLIST.md.
SuperPaymaster v5.4.0-beta.1 sync (chore/sync-superpaymaster-v5.4)
Added
X402FacilitatorABI (@aastar/corepackages/core/src/abis/X402Facilitator.json) +X402FacilitatorABI/X402FacilitatorArtifactexports. x402 micropayment settlement entrypoint (verify/settle EIP-3009 authorizations + direct xPNTs, operator/facilitator fees).x402FacilitatorandtimelockControllerkeys added toCANONICAL_ADDRESSESfor all chains (real on Sepolia11155111, zero on10/11155420). Sepolia x402Facilitator0xFe95a77e4Db593E6EA88000Aad9cD1230BAB4512, timelockController0x6cEc100c9CDc6ee7D9EDe0533edD3554E641DdBF. The x402 facilitator address is now resolvable from the SDK (previously absent everywhere).
Changed
- Re-synced
SuperPaymaster.json,Registry.json,PolicyRegistry.jsonABIs from the SuperPaymaster repo (v5.4 god-split / L-C surface). - Fixed stale Sepolia addresses: SP impl comment
0xEB2C9Cb…→0xE84Ae83E…;registryImplin rootconfig.sepolia.json0x1bd28f89…→0x0B5ce703…; addedx402Facilitator/policyRegistry/timelockControllerand updated stalespImplinconfig.sepolia.json. @aastar/core0.18.0→0.18.1.
KMS v0.20.0 + ERC-8004 SDK integration (feat/kms-v0.20.0-integration)
⚠ BREAKING CHANGES
WebAuthnAssertionfields renamed from camelCase to PascalCase —challengeId→ChallengeId,credential→Credential— to match the KMS wire format (the server struct uses#[serde(rename = "ChallengeId" / "Credential")]). Any code constructing aWebAuthnAssertionliteral must update the field casing. The previous camelCase shape never matched the server and would have been rejected.KmsBeginGrantSessionAuthResponsefields likewise PascalCased:challengeId→ChallengeId,options→Options(matchesAuthenticationOptionsResponse).KmsSignGrantSessionRequest/KmsSignP256GrantSessionRequest:contractScopeandselectorScopeare nowstring(wasnumber) — the KMS server types areString(selectorScopeis a bytes4 hex); numeric values failed server deserialization.- Default KMS endpoint is now
https://kms.aastar.io(washttps://kms1.aastar.io).
Added
KmsHttpClient— shared KMS HTTP transport (post/get/amzPost/postWithBearer).KmsManagerkey methods:sign(message/EIP-155 tx),getPublicKey,deriveAddress,listKeys,deleteKey,changePasskey;signTypedDataWithWebAuthnnow posts full EIP-712 typed data to/kms/SignTypedData;beginWebAuthnAuthuses/BeginAuthentication.KmsAgentService(agent TEE-JWT lifecycle),KmsSessionService(P256 session keys),KmsPaymentSigner(Micropayment / GToken EIP-3009 / x402 signers),KmsMonitorService(health/version/queueStatus/rollbackCounter/stats +@internaladminPurgeKey).ERC8004Service— ERC-8004 agent identity calldata encoders + chain-derived registry addresses.
[0.19.0] - 2026-03-30
Breaking Changes
AIRACCOUNT_ADDRESSES.sepolia.factorynow points to M7 r6 (0x42f82d77...). Existing M7 r5 accounts will have different CREATE2 addresses under the new factory. Old r5 factory address is preserved asfactoryM7r5Prevfor reference.
Added
AccountManager.buildGuardianAcceptanceHash(owner, salt, factoryAddress, chainId, dailyLimit)— computes the raw keccak256 guardian acceptance hash (guardians sign viapersonal_sign);dailyLimitis bound into the hash (M9 C-3 front-run fix);saltacceptsnumber | bigintAccountManager.createAccountWithGuardians(params)— creates an account with two explicit user guardians + community guardian (v0.7+ only); throws for v0.6AccountRecordnew optional fields:dailyLimit,guardian1,guardian1Sig,guardian2,guardian2Sig— persisted for deterministic initCode reconstructioncreateAccountaccepts new optionaldailyLimit: bigintparameter; written into the factory config so initCode stays identical across process restartsTransferManager: guardian accounts usecreateAccountWithDefaultsfor initCode (fixes sender/initCode mismatch that would cause bundlers to reject first UserOp)
[0.18.0] - 2026-03-27
M7 r5 SDK Upgrade (feat/m7-sdk-upgrade)
⚠ BREAKING CHANGES
AIRACCOUNT_ADDRESSES.sepolia.factorynow points to the M7 r5 factory contract (0xa0007c5db27548d8c1582773856db1d123107383). The previous M5 address has been renamed tofactoryM5(0xd72a236d84be6c388a8bc7deb64afd54704ae385). Any existing code referencing.factorywill now target the M7 contract, producing different CREATE2 account addresses. This affects counterfactual address derivation and asset routing for accounts created via the old factory.- Migration: use
.factoryM7(explicit) or.factoryM5(legacy M5 accounts).
- Migration: use
SessionKeyServiceconstructor no longer has default address values forsessionKeyValidatorAddressandagentSessionKeyValidatorAddress. Both addresses must now be passed explicitly to avoid cross-network address mismatches.SessionKeyService.encodeGrantAgentSessionsignature changed: the unusedaccountparameter has been removed. Contract usesmsg.sender; the first argument is nowsessionKey.
Features
- M7 r5 contract addresses and ABIs (
compositeValidator,tierGuardHook,agentSessionKeyValidator,accountImpl) - F6
GuardStateReader— ETH and per-token spending state - F7 OAPD address derivation (
getOapdAddress,getOapdAddressWithChainId) - F4 EIP-1193/6963 —
AirAccountEIP1193Provider,announceAirAccount(),watchProviders() - F4
personal_signandeth_signTypedData_v4support inAirAccountEIP1193Provider - F1 Hardware wallets —
connectLedger()(WebHID ECDSA) +createYubiKeySigner()(WebAuthn P256, Tier 2/3) - F2 Helios —
createHeliosTransport()(a16z WASM light client viem transport) - F3 ENS —
resolveEns(),lookupAddress(),resolveEnsVerified()
[0.17.0] - 2026-03-24
V5.3 Agent Economy SDK
- [FEATURE] @aastar/x402: x402 payment client — EIP-3009 signing, payment header encode/decode, x402Fetch auto-retry
- [FEATURE] @aastar/channel: MicroPaymentChannel client — EIP-712 voucher signing, channel lifecycle management
- [FEATURE] @aastar/cli: CLI tool —
aastar x402/channel/agentcommands - [FEATURE] Core L1 Actions:
x402Actions,agentActions,channelActions— three new action factories - [SYNC] SuperPaymaster ABI synced to V5.3.0 (x402 settlement, agent sponsorship, facilitator fees)
- [ADDED] MicroPaymentChannel ABI
- [ADDED] Address constants: microPaymentChannel, agentIdentityRegistry, agentReputationRegistry (Sepolia deployed)
[0.24.0] - 2026-06-20
SDK Code Integrity Hash: 170b24e3477f9e79420f5e5e0c3843bf32ae758585fe410bbcfd74170d45a072(Excludes metadata/markdown to ensure stability / 排除文档文件以确保哈希稳定)
⛽ Gas Fee Strategy (PaymasterClient)
- [FIX] Testnet/Mainnet Split Gas Pricing:
- Testnets (Sepolia, OP-Sepolia, Anvil, chainId 11155111/11155420/31337): apply
0.5 Gweifloor onmaxPriorityFeePerGas/1.0 Gweifloor onmaxFeePerGas. FixesWaitForUserOperationReceiptTimeoutErrorcaused by Alchemy bundler's minimum fee requirement being higher than OP Sepolia's near-zero network fee. - Mainnet: pure dynamic
estimateFeesPerGas() × 1.2(reduced from 1.5× — saves ~20% on reported maxFee while maintaining sufficient overhead for OP FIFO sequencer). - Strategy applied in both
estimateUserOperationGasandsubmitGaslessUserOperation. - Added diagnostic log:
[PaymasterClient] Gas Pricing: TESTNET (0.5 Gwei floor) | priority=... maxFee=...
- Testnets (Sepolia, OP-Sepolia, Anvil, chainId 11155111/11155420/31337): apply
- [FIX] Retry Loop Extended: max attempts 3→5 (
attempt < 4guard), handles compound PVG + fee bump errors within a single retry pass.
🧰 Keeper (Price Updater)
- [FIX]
cast sendHang Prevention:runCastSend()now applies a hard 90-secondSIGKILLtimeout. Previously--timeout 60only controlled receipt polling, not the subprocess itself—causing the keeper to block indefinitely when Alchemy rate-limitedeth_estimateGas. - [FIX] Explicit Gas Price: before each
sendUpdate, keeper fetchesgetGasPrice()and passes it via--gas-pricetocast send, eliminating cast's owneth_estimateGascall (which was the source of the hang). - [IMPROVED] Print on-chain
priceStalenessThreshold()for both SuperPaymaster and PaymasterV4 during INIT. - [IMPROVED] Keeper anomaly docs: Chainlink stale + external/Chainlink deviation + external short-term volatility alerts documented.
🌐 Network Config
- [FIX] OP Sepolia
blockExplorerURL changed fromoptimism-sepolia.blockscout.com→sepolia-optimism.etherscan.io. Affects all scripts/tests that usegetTxUrl('op-sepolia', ...).
📊 Analytics (Paper3 / Paper7)
- [ADDED]
packages/analytics/data/paper_gas_op_mainnet/2026-02-17/: PaymasterV4 (n=36) and SuperPaymaster (n=43) baseline CSVs with strict single-UserOp + ERC20-transfer filter. - [ADDED]
packages/analytics/data/paper_gas_op_mainnet/2026-02-18/: Relaxed-filter datasets with sender field;super_t2_sender.csv(n=50) satisfies Paper3 SuperPaymaster sample target. - [ADDED]
packages/analytics/data/industry_paymaster_baselines.csv: Alchemy Gas Manager (n=50, mean=257k gas) and Pimlico ERC-20 PM (n=50, mean=387k gas) on-chain baselines for industry comparison. - [ADDED]
packages/analytics/data/gasless_metrics_detailed.csv: 21 records with full L1/L2 fee decomposition (L2GasUsed, L1GasUsed, L1FeesPaid, L2FeesPaid, ActualGasUsed). - [ADDED] Paper7 exclusive datasets: credit cycle JSON records and liquidity velocity simulation CSVs under
data/paper7_exclusive/. - [ADDED]
packages/analytics/run_paper7_exclusive_data.shfor Paper7 data pipeline. - [CHANGED]
gasless_data_collection.csv(v1): +31 rows;gasless_data_collection_v2.csv: +28 rows including T1=22, T2_SP_Credit=22, T5=20. - [ADDED]
scripts/collect_paymaster_baselines.ts: reproducible on-chain event collection with--strict-transfer,--single-userop,--n,--append,--dedupeflags. - [ADDED]
scripts/collect_eoa_erc20_baseline.ts: raw EOA ERC20 transfer baseline for comparison. - [ADDED]
scripts/compute_cost_summary.ts: aggregation script for cost breakdown tables.
📚 Docs
- [CHANGED] Regenerated API markdown output under
docs/api/. - [ADDED]
docs/guide/keeper.md: keeper quickstart, anomaly detection, Telegram setup.
🗂️ Analytics Consolidation
- [REFACTOR] Moved all data collection scripts from
scripts/root intopackages/analytics/scripts/(git mv, history preserved):collect_paymaster_baselines,collect_eoa_erc20_baseline,collect_industry_baseline,compute_cost_summary,gasless-collect,paper7-exclusive-data,paper7_credit_loop,paper7_reputation_credit,run_analytics_coordinator,run_paper7_exclusive_data.sh,fetch-tx-hashes - [ADDED]
packages/analytics/docs/OP_Mainnet_Gas_Analysis_Report.md: gas cost evidence for Paper3/Paper7 (L1/L2 breakdown, PVG analysis, industry comparison, Mermaid pie charts). - [UPDATED]
packages/analytics/README.md: new directory tree, updated all command paths topackages/analytics/scripts/.... - Note: Root shell scripts (
run-keeper-main.sh,run-optimism-tx-data.sh, etc.) are unaffected — they only callscripts/l4-*.tsandscripts/keeper.tswhich remain in place.
🔒 SDK Integrity
SDK Code Integrity Hash: cebb1de2edab0fb63cd47684ab977488410262fa50e485045abc5901894a3f6f(Excludes metadata/markdown to ensure stability / 排除文档文件以确保哈希稳定)
[0.16.22] - 2026-02-11
SDK Code Integrity Hash: 89da8c80ebe6ad8b06adbd4946a00817b18ae79296550709b20bd9ca3af424f9(Excludes metadata/markdown to ensure stability / 排除文档文件以确保哈希稳定)
🌍 Multi-Chain & Infrastructure
- [FEATURE] Optimism Mainnet Canonical Addresses:
- Embedded canonical contract addresses for Optimism (Chain ID: 10) in
@aastar/core. NETWORK=optimismnow resolvesCHAIN_ID=10by default whenCHAIN_IDis not provided.
- Embedded canonical contract addresses for Optimism (Chain ID: 10) in
[0.16.21] - 2026-02-11
SDK Code Integrity Hash: 8d5b71dda17e2cb746e4a70a98020b9c7a4f2b390a82804f7e5924b0bf5a51d5(Excludes metadata/markdown to ensure stability / 排除文档文件以确保哈希稳定)
⚡ Gasless Execution
- [FIX] Paymaster V4 Cached Price Staleness:
PaymasterClientnow treats stalecachedPriceas invalid.- Testnets auto-refresh via
updatePrice()when needed; mainnet requires a running keeper.
- [FIX] Native UserOp Gas Defaults:
- Reduced
UserOpScenarioType.NATIVEverificationGasLimitto a more realistic default.
- Reduced
🧰 Tooling & Regression
- [ADDED] EIP-2537 precompile verification script and historical check dataset.
[0.16.20] - 2026-02-07
SDK Code Integrity Hash: 0a9c8a4a778bb1b64fac6fd29d8a61b2f9b02566f33b2de65e2c26e536f9fff8(Excludes metadata/markdown to ensure stability / 排除文档文件以确保哈希稳定)
🌍 Infrastructure & Distribution
- [FEATURE] Canonical Address Solidification:
- Hardcoded canonical contract addresses for Sepolia and OP Sepolia within
@aastar/core. - SDK is now self-contained and ready for NPM distribution without requiring local JSON configuration files.
- Maintained三级优先级 (ENV > Local Config > Canonical Defaults) to support flexible development.
- Hardcoded canonical contract addresses for Sepolia and OP Sepolia within
- [FIX] SuperPaymaster Price Refresh:
- Fixed "UserOperation expired" errors by enabling automated owner-based price refreshes in
l4-setup.ts. - Added Chainlink fallback logic for robust price synchronization on testnets.
- Fixed "UserOperation expired" errors by enabling automated owner-based price refreshes in
🛡️ Integrity
- [ADDED] SDK Source Integrity Monitoring:
- Introduced a unique SHA-256 hash for the entire SDK source tree to ensure verifiable releases.
[0.16.17] - 2026-02-07
🌍 Infrastructure & Compatibility
- [FEATURE] Universal Browser Support:
- Refactored
@aastar/coreto support dual entry points viapackage.jsonexports. - Browser: Adds
dist/index.js(Pure ESM) which is free of Node.js specific code (createRequire,fs), ensuring seamless integration with Vite/Next.js. - Node.js: Adds
dist/index.node.jswhich automatically loads localconfig.{network}.jsonfor backward compatibility. - Refactored
constants.tsto support dynamic configuration injection viaapplyConfig().
- Refactored
🛡️ SDK Integrity Verification
IMPORTANT
Security First: To ensure you are using an official release and protect your private keys, always verify the integrity of the SDK code immediately after installation.
Current Code Integrity Hash (v0.19.0): b39aef2a020061c37725d0e80295774dadadc7ff964fef723287bfc71520dbb5
To verify, run this stable command (excludes non-code markdown files):
git ls-files -z | grep -zvE '\.md$' | xargs -0 sha256sum | sha256sumThe resulting hash must match the one listed in the Changelog.
[0.16.14] - 2026-01-24
🌍 Multi-Chain & Infrastructure
- [FEATURE] Standardized Config Loader:
- Restructured
config.tsto implement a robust multi-chain loading priority. - Internal Protocol Contracts (Registry, Paymasters, GToken) now strictly prioritize
config.{network}.json. - Infrastructure Contracts (EntryPoint, PriceFeed) and URLs (RPC, Bundler) are now sourced primarily from
.env.{network}.
- Restructured
- [FIX] Hardcoded Dependencies Cleanup:
- Successfully removed all remaining hardcoded
0xaddresses andsepoliastring literals across alltests/andexamples/scripts. - Every script now supports the
--networkparameter for dynamic environment switching.
- Successfully removed all remaining hardcoded
- [REPAIR] Reputation Activity Metrics: Corrected the
opNamelookup string inl4-reputation-tiers.tsto align with the latestl4-setup.tsstate files.
⚡ Gasless Execution Efficiency
- [IMPROVED] SuperPaymaster Verification Tuning:
- Implemented "Dynamic Nominal Gas Tuning" in
SuperPaymasterClientto optimizepaymasterVerificationGasLimit. - Resolved "Efficiency too low" (AA30) errors on Alchemy/Optimism-Sepolia by maintaining a strict balance between execution safety and bundler efficiency ratios (>= 0.4).
- Implemented "Dynamic Nominal Gas Tuning" in
[0.16.13] - 2026-01-23
🛡️ Security & Stability
- [SECURITY] Strict Address Resolution:
- Enforced strict environment variable lookup for third-party contract addresses (
entryPoint,simpleAccountFactory,priceFeed) on non-Anvil networks. - Eliminated fallback to outdated
config.jsonfiles to prevent deployment misconfigurations.
- Enforced strict environment variable lookup for third-party contract addresses (
- [SECURITY] Token Transfer Limits:
- Updated ABI to reflect new
MAX_SINGLE_TX_LIMITenforcement inxPNTsToken. SDK transactions respecting standard limits will continue to work; anomalous high-value transfers may now revert at the contract level.
- Updated ABI to reflect new
- [SECURITY] Operator Firewall:
- Updated ABI to reflect
autoApprovedSpenderslogic.
- Updated ABI to reflect
⚙️ Core Improvements
- [FIX] xPNTsToken Initialization: Adjusted factory logic to support EIP-1167 Minimal Clones using
initialize()pattern. - [SYNC] Contract ABIs: Synchronized all ABIs with
SuperPaymasterv3.6.3, including new governance functionsrenounceFactoryandemergencyRevokePaymaster.
[0.16.11] - 2026-01-19
📊 Gas Analytics & Reporting (New Package)
- [NEW] Added
@aastar/analyticspackage for comprehensive gas analysis. - [FEATURE]
CostCalculator: Calculates true L1/L2 gas costs, protocol profit (10% premium + buffer), and user savings. - [FEATURE]
AttributionAnalyzer: Simulates L2 costs (Optimism model) to provide "Apple-to-Apple" competitiveness comparisons. - [REPORT]
gas-analyzer-v4.ts: Generates detailed reports showing ~28% protocol profit margin and ~400x savings vs. Ethereum L1.
SDK & Core Enhancements
- [FIX] Anni Gasless Fix: Updated
l4-setup.tsto useupdatePriceDVTfor refreshing stale SuperPaymaster price cache, preventing "UserOperation expired" errors. - [FIX] Duplicate Build Fix: Resolved merge conflicts and duplicate identifiers in
packages/coreactions (e.g.,contracts.ts,actions/index.ts). - [FIX] Build System: Removed residual
*.test.tsfiles in modification directories to ensure cleantscbuilds.
Regression & Testing
[IMPROVED]
L4 Regression: Full automation for Setup -> Funding -> Gasless Transactions -> Analytics.[FEATURE]
DVT Price Update: Integrated DVT signature generation in test setup to simulate authenticated price updates.[BREAKING] Decoupled development and production build configurations.
- Added
tsconfig.build.jsonfor strictly clean production builds (pnpm build). - Updated root
tsconfig.jsonto retainpathsmappings for rapid development (tsx). - Updated all
packages/*/tsconfig.jsonto extend the build configuration.
- Added
Fixed
packages/corebuild output to correctly generate type definitions (.d.ts).
SDK Core (@aastar/core)
- [CHANGED]
BaseClientvisibility update.- Changed
clientandgetStartPublicClientfromprotectedtopublicto allow easier extension and debugging in consuming applications.
- Changed
- [Check] Standardized ABI exports.
- Updated
abis/index.tsto support both array-based and object-based ({ abi: [] }) ABI JSON formats, resolving compatibility issues with external artifacts.
- Updated
SDK Operator (@aastar/operator)
- [FIXED] ABI Property Access.
- Fixed runtime error where
PaymasterOperatorClientattempted to access.abion a raw ABI array. Now uses the standardizedPaymasterABIexport.
- Fixed runtime error where
SDK EndUser (@aastar/enduser)
- [FIXED]
UserClientbuild failure due toBaseClientvisibility issues.
Testing & Regression
- [ADDED]
run_sdk_regression.shnow supports a strictsepoliaenvironment mode with correct.envloading (set -a). - [ADDED]
extract_v3_abis.shintegration for reliable ABI synchronization from the SuperPaymaster project.
