-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsdk-dvt-config.testnet.json
More file actions
118 lines (118 loc) · 7.75 KB
/
Copy pathsdk-dvt-config.testnet.json
File metadata and controls
118 lines (118 loc) · 7.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
{
"_comment": "Canonical DVT integration config for @aastar/sdk. AAStar runs 3 always-on DVT nodes per environment with INDEPENDENT secret keys (NOT the public BLS_TEST fixtures). Each node bundles three capabilities: BLS co-signing (DVT), the gasless purchase relay (#98), and a server-side price keeper (#58). To switch networks the SDK only changes `active` and re-reads environments[active] — no code change, frictionless testnet->mainnet. Mainnet is a placeholder until deployed (same shape, swap urls + addresses). To update the validator address, change `validator` here (this file is the single authoritative source; the aNode reads it as VALIDATOR_CONTRACT_ADDRESS env). SDK-side consumption sync tracked in aastar-sdk#274.",
"schemaVersion": "1.1",
"active": "sepolia",
"environments": {
"sepolia": {
"network": "sepolia",
"chainId": 11155111,
"status": "LIVE (refreshed 2026-07-06 for v1.9.0+ — validator + nodeIds + ownerAuth aligned to the isValidOwnerAuth owner-gate)",
"validator": "0x539B9681aFd5BFbCaa655Fe4c6BdcFe1fa7864bC",
"validatorVersion": "YetAnotherAA-Validator AAStarValidator (Plan A v3 stake-bound; validate() algId 0x01 + registerWithProof + on-chain RFC-9380). Mounted in airaccount v0.27.0 ValidatorRouter 0xe68d6A7Bb60DA4caE62ceC2439722fc5eEF87a5c (getAlgorithm(0x01)==this). Supersedes airaccount-contract v0.20.0 AAStarBLSAlgorithm 0xAF525A… for new integrations.",
"entryPoint": "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
"entryPointVersion": "v0.7",
"e2eAccount": "0x92EA8b02D34A4D5d10f0Db9Ea894e8bC72e292e8",
"e2eAccountNote": "airaccount-contract AAStarAirAccountV7 v0.27.0 implementing isValidOwnerAuth->0xa0cf00cf (CC-22). owner = 0xb5600060e6de5E11D3636731964218E53caadf0E (dvt1 operator). Source: airaccount-contract, NOT DVT-owned — see docs/INTERFACES.md §2.",
"conventions": {
"userOpHash": "EntryPoint.getUserOpHash(PackedUserOp) — node derives it; never send a bare hash",
"ownerAuth": "account.isValidOwnerAuth(userOpHash, ownerAuth) eth_call → success magic 0xa0cf00cf, fail 0xffffffff. The account is the single source of truth (k1 ECDSA / P256 passkey / future); DVT forwards ownerAuth verbatim and never verifies locally. ownerAuth = 1-byte tag ‖ payload: 0x01 = owner ECDSA k1 (65-byte personal_sign(userOpHash), EIP-191); 0x02 = owner WebAuthn passkey (authenticatorData‖clientDataJSON‖…). A bare signature with no tag returns 0xffffffff → 403. Requires an account implementing isValidOwnerAuth(bytes32,bytes) (AAStarAirAccountV7).",
"proofWire": "EIP-2537 G1/G2 (matches src/utils/bls.util.ts)",
"failClosed": "POST /signature/sign returns 403 for every rejected request (never 400)",
"mandatoryBlsAccount": "guard-enabled + approvedAlgIds=[0x01] (excludes 0x02 ECDSA)"
},
"dvtNodes": [
{
"url": "https://dvt1.aastar.io",
"nodeId": "0x1f5e41c69465733eeb19341d95853ee6d9295a9e6698f5398d70e509be8f326d",
"pubkey": "0x8067dfd1f98fd1258c0eed3886d234f81eea9371b595a1a278a49c71f8f5eda74639fa043948f7fc0ee3e6b8ec9b8555"
},
{
"url": "https://dvt2.aastar.io",
"nodeId": "0xe3a4a3af3973b65bc95dd962e767e17592dfb331f3544209676271b188fd9f80",
"pubkey": "0xb2fcf33a6ee467e9945734bbaadfd85574d98bb5a3bb75c9a78e68807290883a1e90d3b75b911b9ebc19db0bd2db9173"
},
{
"url": "https://dvt3.aastar.io",
"nodeId": "0x96d64ba8240694153c757707732a11ff175380065ddacb6406094c9d5fa5cfce",
"pubkey": "0x89ffc557d29bc3a11caf3bb3ae8fb6bbd17c60a8e26e9b6be6dbaf8b5f33a3ef8a3d29e765a53f436b3b7dddd3ce8fac"
}
],
"capabilities": {
"dvtSigning": {
"endpoints": {
"sign": "POST {url}/signature/sign body: {userOp:PackedUserOp(v0.7), ownerAuth} -> {nodeId, signature(EIP-2537), publicKey}",
"aggregate": "POST {url}/signature/aggregate",
"verify": "POST {url}/signature/verify",
"info": "GET {url}/node/info -> {nodeId, publicKey, ...}",
"openapi": "GET {url}/api"
}
},
"relay": {
"endpoint": "POST {url}/v3/relay",
"health": "GET {url}/relay/health -> {status:'ok', operator}",
"request": "{ intent:{buyer,paymentToken,paymentAmount,targetToken,recipient,minOut,deadline,nonce}, buyIntentSig, transferAuth:{validAfter,v,r,s} }",
"response": "{ txHash, matchedRule, status:'submitted' }",
"errorCodes": "INVALID_SHAPE/EXPIRED/SIGNATURE_INVALID->400, NOT_WHITELISTED->403, RATE_LIMITED->429, SUBMIT_FAILED->502, INFRA_NOT_READY->503",
"whitelist": {
"paymentToken_usdc": "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
"targetToken_gtoken": "0x20a051502a7AE6e40cfFd6EBe59057538E698984",
"targetToken_apnts": "0x9e66B457E0ABb1F139FD8A596d00f784eBA2873b",
"buyHelper": "0x8d08fBD8297355BC93397820AE1CfFD884BEaA00"
},
"caps": {
"perTxMaxUsdc6dec": "864000000",
"perAddressPerHour": 5,
"globalPerHour": 100
},
"failover": "3 independent relayers — pick any node, retry next on 5xx/timeout"
},
"keeper": {
"note": "Server-side; no client API. Keeps paymaster cachedPrice fresh so gasless quotes don't fail on stale price.",
"paymasters": {
"superPaymaster": "0x030025f40d509b1a99547bAEb3795bD27F7182b7",
"paymasterV4_community": "0x957852251f44570dc2B60Dde0954f191FF3372eE"
}
},
"health": "GET {url}/health -> {status:'ok', capabilities:[{name,enabled}]}",
"x402": {
"_status": "endpoints LIVE (verify/supported); settle PENDING operator on-chain provisioning + gas (see docs/x402-facilitator.md §6)",
"endpoints": {
"verify": "POST {url}/x402/verify body: {x402Version:2, paymentPayload, paymentRequirements} -> {isValid, invalidReason?, payer?}",
"settle": "POST {url}/x402/settle -> {success, transaction?, network?, payer?, errorReason?}",
"supported": "GET {url}/x402/supported -> {kinds:[{x402Version,scheme,network,extra:{settlementSchemes,assets,feeBPS,facilitatorContract,operator}}], extensions}"
},
"facilitatorContract": "0xfe1DB01e1d6622e722B92ed5993af61325DB92aF",
"supportedAssets": {
"apnts_aastar": "0x696A73701b104c6cCBbAadDD2216788ea08EaB89",
"pnts_mycelium": "0xE6579A90dc498a710008de12119812D0FB7aA224"
},
"feeBPS": 200,
"extraSchema": "paymentRequirements.extra: { settlement?:\"direct\"|\"eip-3009\", maxFee?, salt?, name?, version? } — see docs/x402-facilitator.md §2",
"authHeaders": "optional stateless HMAC on /settle (X-X402-Timestamp + X-X402-Auth=HMAC-SHA256(secret, `${ts}.${rawBody}`)); off unless X402_AUTH_ENABLED",
"facilitators": [
{
"url": "https://dvt1.aastar.io/x402",
"operator": "0xF92DC383c74eA30d7791b929d5872daD18679516",
"supportedAssets": ["apnts_aastar", "pnts_mycelium"]
},
{
"url": "https://dvt2.aastar.io/x402",
"operator": "0x2e72A258FD9e1C69B2B2bB6ED8bC7E94773f7b00",
"supportedAssets": ["apnts_aastar", "pnts_mycelium"]
},
{
"url": "https://dvt3.aastar.io/x402",
"operator": "0x368f8Cb8cCA42174B03156cEa761BaE31cEE5C94",
"supportedAssets": ["apnts_aastar", "pnts_mycelium"]
}
]
}
}
},
"mainnet": {
"network": "mainnet",
"chainId": 1,
"status": "NOT DEPLOYED — placeholder. Same shape; swap dvtNodes urls + nodeIds + all addresses, then set active='mainnet'."
}
}
}