@reppo/cli 0.8.4 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/chain/abis.d.ts +34 -0
- package/dist/chain/abis.d.ts.map +1 -1
- package/dist/chain/abis.js +3 -0
- package/dist/chain/abis.js.map +1 -1
- package/dist/chain/contracts.d.ts +6 -0
- package/dist/chain/contracts.d.ts.map +1 -1
- package/dist/chain/contracts.js +8 -0
- package/dist/chain/contracts.js.map +1 -1
- package/dist/chain/receipt.d.ts +11 -4
- package/dist/chain/receipt.d.ts.map +1 -1
- package/dist/chain/receipt.js +18 -9
- package/dist/chain/receipt.js.map +1 -1
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +59 -22
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/grant-access.d.ts +6 -0
- package/dist/commands/grant-access.d.ts.map +1 -1
- package/dist/commands/grant-access.js +140 -78
- package/dist/commands/grant-access.js.map +1 -1
- package/dist/commands/query/datanet.d.ts.map +1 -1
- package/dist/commands/query/datanet.js +49 -1
- package/dist/commands/query/datanet.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ Errors **always** emit JSON on stderr regardless of mode, with a stable `code` f
|
|
|
47
47
|
- `reppo query balance [address]` — ETH + REPPO + veREPPO + USDC
|
|
48
48
|
- `reppo query voting-power [address]` — veREPPO voting power + lockup count
|
|
49
49
|
- `reppo query pod <podId>` — pod existence + owner address
|
|
50
|
-
- `reppo query datanet <datanetId> [--for <addr>]` — on-chain validity + REPPO access fee (optionally check access for an address) + the current on-chain epoch, plus off-chain catalog metadata: name, description, native token (symbol/address/decimals), per-epoch emissions, vote volumes, publisher/voter onboarding guidance, and the platform `subnetUuid` (the `--subnet-uuid` for `mint-pod` publishing). Catalog enrichment is best-effort — a platform outage degrades `metadata` to `{ unavailable }` without affecting the on-chain answer.
|
|
50
|
+
- `reppo query datanet <datanetId> [--for <addr>]` — on-chain validity + REPPO access fee (`accessFeeREPPO`) and, for datanets that charge in their own token, the primary-token access fee (`accessFeePrimaryToken` + `primaryToken: { address, symbol, decimals }` — present only for a real non-zero primary token; best-effort — `{ unavailable }` with distinct wording for "datanet has no primary token" vs a read failure) (optionally check access for an address) + the current on-chain epoch, plus off-chain catalog metadata: name, description, native token (symbol/address/decimals), per-epoch emissions, vote volumes, publisher/voter onboarding guidance, and the platform `subnetUuid` (the `--subnet-uuid` for `mint-pod` publishing). Catalog enrichment is best-effort — a platform outage degrades `metadata` to `{ unavailable }` without affecting the on-chain answer.
|
|
51
51
|
- `reppo query epoch` — current on-chain epoch, read directly from `veReppo.currentEpoch()` (the protocol's epoch time-base). JSON: `{ network, epoch, epochStart, epochDurationSeconds, secondsRemaining }`. Epochs are fixed ~48h windows; the timing fields are derived from `epochEnd`/`epochLength` and degrade to `null` if those getters are unavailable. Pure read — no signer, no gas. Honor `--rpc-url` against a private RPC (the public Base RPC rate-limits).
|
|
52
52
|
- `reppo query emissions-due` — list unclaimed REPPO emissions across all pods owned by the configured wallet (uses platform API)
|
|
53
53
|
|
|
@@ -59,13 +59,13 @@ Errors **always** emit JSON on stderr regardless of mode, with a stable `code` f
|
|
|
59
59
|
|
|
60
60
|
### Write
|
|
61
61
|
|
|
62
|
-
- `reppo approve --spender <pod-manager|subnet-manager|ve-reppo|0x…> [--amount <units|max>] [--token reppo|usdc]` — set an ERC20 allowance so subsequent writes (lock, grant-access, mint-pod) don't fail with INSUFFICIENT_ALLOWANCE. Defaults to unlimited (`max`); reads the current allowance first and emits `{status:'no-op'}` if it already covers the request.
|
|
62
|
+
- `reppo approve --spender <pod-manager|subnet-manager|ve-reppo|0x…> [--amount <units|max>] [--token reppo|usdc|0x…]` — set an ERC20 allowance so subsequent writes (lock, grant-access, mint-pod) don't fail with INSUFFICIENT_ALLOWANCE. `--token` accepts the `reppo`/`usdc` aliases or an arbitrary ERC20 token address (0x…) — e.g. a datanet's primary token, so an operator can approve it for the SubnetManager; for an address the token's `decimals()` is read on-chain for amount scaling. Defaults to unlimited (`max`); reads the current allowance first and emits `{status:'no-op'}` if it already covers the request.
|
|
63
63
|
- `reppo vote --pod <id> --votes <n> --like|--dislike` — cast a vote on a pod, spending `<n>` voting power
|
|
64
64
|
- `reppo mint-pod --datanet <id> [--token reppo|primary] [--to <addr>]` — mint a pod into a datanet. Add `--pod-name <s>` to also publish metadata (Phase 2): after the on-chain mint, register the pod with the platform (`POST /agents/{id}/pods`). Requires `--subnet-uuid <cuid>` (the platform UUID, **not** the numeric `--datanet` id), `--agree-to-terms`, and `REPPO_AGENT_ID` + agent key. Optionally `--pod-description`, `--category`, `--platform`, `--url`, and a dataset: `--dataset <file>` (pinned to IPFS via `PINATA_JWT`) or `--dataset-uri <url>` (used as-is). A Phase-2 failure does not fail the mint — it exits 0 with `metadata.published:false`; re-run with the same `--idempotency-key` to retry.
|
|
65
65
|
- `reppo lock <amount> --duration <seconds>` — lock REPPO into veREPPO for voting power
|
|
66
66
|
- `reppo unlock <lockupId> [--to <addr>]` — withdraw an expired veREPPO lockup, returning the locked REPPO
|
|
67
67
|
- `reppo extend-lock <lockupId> --duration <seconds>` — extend an existing veREPPO lockup
|
|
68
|
-
- `reppo grant-access --datanet <id> [--to <addr>]` — pay the
|
|
68
|
+
- `reppo grant-access --datanet <id> [--to <addr>] [--token reppo|primary]` — pay the datanet access fee and grant `--to` access. Defaults to REPPO; `--token primary` pays in the datanet's primary token (e.g. $EXY). Output: `feeAmount` (on-chain fee quote), `feePaid` (receipt-derived actual), `feeToken: { symbol, address, decimals }`, and `token`. On the REPPO path the legacy `reppoFee` field is also emitted for back-compat (pre-0.8.5 consumers).
|
|
69
69
|
- `reppo claim-emissions --pod <id> --epoch <n>` — claim a pod's emissions for an epoch
|
|
70
70
|
- `reppo register-agent --name <s> --description <s>` — register a new agent identity on the Reppo platform; returns `{ id, apiKey }`. The apiKey is the Bearer token for subsequent agent-scoped calls (`/agents/[id]/subnets`, `/agents/[id]/pods`). On-chain mints use your `REPPO_PRIVATE_KEY` wallet; the platform no longer provisions one server-side.
|
|
71
71
|
- `reppo auth [--force]` — sign in to the platform API (api.reppo.xyz); caches a 24h Bearer token used by `query emissions-due` and other platform-API commands
|
package/dist/chain/abis.d.ts
CHANGED
|
@@ -191,6 +191,18 @@ export declare const SUBNET_MANAGER_ABI: readonly [{
|
|
|
191
191
|
readonly name: "to";
|
|
192
192
|
}];
|
|
193
193
|
readonly outputs: readonly [];
|
|
194
|
+
}, {
|
|
195
|
+
readonly name: "accessSubnetWithPrimaryTokenFee";
|
|
196
|
+
readonly type: "function";
|
|
197
|
+
readonly stateMutability: "nonpayable";
|
|
198
|
+
readonly inputs: readonly [{
|
|
199
|
+
readonly type: "uint256";
|
|
200
|
+
readonly name: "subnetId";
|
|
201
|
+
}, {
|
|
202
|
+
readonly type: "address";
|
|
203
|
+
readonly name: "to";
|
|
204
|
+
}];
|
|
205
|
+
readonly outputs: readonly [];
|
|
194
206
|
}, {
|
|
195
207
|
readonly name: "hasSubnetAccess";
|
|
196
208
|
readonly type: "function";
|
|
@@ -227,6 +239,28 @@ export declare const SUBNET_MANAGER_ABI: readonly [{
|
|
|
227
239
|
readonly outputs: readonly [{
|
|
228
240
|
readonly type: "uint256";
|
|
229
241
|
}];
|
|
242
|
+
}, {
|
|
243
|
+
readonly name: "getAccessFeePrimaryToken";
|
|
244
|
+
readonly type: "function";
|
|
245
|
+
readonly stateMutability: "view";
|
|
246
|
+
readonly inputs: readonly [{
|
|
247
|
+
readonly type: "uint256";
|
|
248
|
+
readonly name: "subnetId";
|
|
249
|
+
}];
|
|
250
|
+
readonly outputs: readonly [{
|
|
251
|
+
readonly type: "uint256";
|
|
252
|
+
}];
|
|
253
|
+
}, {
|
|
254
|
+
readonly name: "getSubnetPrimaryToken";
|
|
255
|
+
readonly type: "function";
|
|
256
|
+
readonly stateMutability: "view";
|
|
257
|
+
readonly inputs: readonly [{
|
|
258
|
+
readonly type: "uint256";
|
|
259
|
+
readonly name: "subnetId";
|
|
260
|
+
}];
|
|
261
|
+
readonly outputs: readonly [{
|
|
262
|
+
readonly type: "address";
|
|
263
|
+
}];
|
|
230
264
|
}];
|
|
231
265
|
export declare const VE_REPPO_ABI: readonly [{
|
|
232
266
|
readonly name: "currentEpoch";
|
package/dist/chain/abis.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc1B,CAAC;AAEH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBvB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAErB,CAAC"}
|
package/dist/chain/abis.js
CHANGED
|
@@ -32,9 +32,12 @@ export const POD_MANAGER_ABI = parseAbi([
|
|
|
32
32
|
]);
|
|
33
33
|
export const SUBNET_MANAGER_ABI = parseAbi([
|
|
34
34
|
'function accessSubnetWithREPPOFee(uint256 subnetId, address to)',
|
|
35
|
+
'function accessSubnetWithPrimaryTokenFee(uint256 subnetId, address to)',
|
|
35
36
|
'function hasSubnetAccess(uint256 subnetId, address address_) view returns (bool)',
|
|
36
37
|
'function validSubnet(uint256 subnetId) view returns (bool)',
|
|
37
38
|
'function getAccessFeeREPPO(uint256 subnetId) view returns (uint256)',
|
|
39
|
+
'function getAccessFeePrimaryToken(uint256 subnetId) view returns (uint256)',
|
|
40
|
+
'function getSubnetPrimaryToken(uint256 subnetId) view returns (address)',
|
|
38
41
|
]);
|
|
39
42
|
export const VE_REPPO_ABI = parseAbi([
|
|
40
43
|
// veReppo is the protocol's epoch time-base: PodManagerV2 and SubnetManager
|
package/dist/chain/abis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;IACtC,iFAAiF;IACjF,wFAAwF;IACxF,0DAA0D;IAC1D,+DAA+D;IAC/D,2EAA2E;IAC3E,0DAA0D;IAC1D,sDAAsD;IACtD,oEAAoE;IACpE,oFAAoF;IACpF,sFAAsF;IACtF,wFAAwF;IACxF,kGAAkG;IAClG,mFAAmF;CACpF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACzC,iEAAiE;IACjE,kFAAkF;IAClF,4DAA4D;IAC5D,qEAAqE;
|
|
1
|
+
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;IACtC,iFAAiF;IACjF,wFAAwF;IACxF,0DAA0D;IAC1D,+DAA+D;IAC/D,2EAA2E;IAC3E,0DAA0D;IAC1D,sDAAsD;IACtD,oEAAoE;IACpE,oFAAoF;IACpF,sFAAsF;IACtF,wFAAwF;IACxF,kGAAkG;IAClG,mFAAmF;CACpF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACzC,iEAAiE;IACjE,wEAAwE;IACxE,kFAAkF;IAClF,4DAA4D;IAC5D,qEAAqE;IACrE,4EAA4E;IAC5E,yEAAyE;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,4EAA4E;IAC5E,sEAAsE;IACtE,wEAAwE;IACxE,yEAAyE;IACzE,mDAAmD;IACnD,gDAAgD;IAChD,+CAA+C;IAC/C,yDAAyD;IACzD,wDAAwD;IACxD,6EAA6E;IAC7E,sDAAsD;IACtD,yDAAyD;IACzD,gDAAgD;IAChD,qGAAqG;IACrG,oDAAoD;IACpD,oDAAoD;IACpD,6HAA6H;IAC7H,oDAAoD;IACpD,0DAA0D;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAChC,uCAAuC;IACvC,yCAAyC;IACzC,0CAA0C;IAC1C,+CAA+C;IAC/C,oDAAoD;IACpD,2EAA2E;IAC3E,kEAAkE;IAClE,8DAA8D;IAC9D,yEAAyE;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACzC,0MAA0M;IAC1M,sGAAsG;CACvG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;IACjC,wOAAwO;CACzO,CAAC,CAAC"}
|
|
@@ -23,6 +23,12 @@ export declare function subnetManager(network: Network): Contract<typeof SUBNET_
|
|
|
23
23
|
export declare function veReppo(network: Network): Contract<typeof VE_REPPO_ABI>;
|
|
24
24
|
export declare function reppoToken(network: Network): Contract<typeof ERC20_ABI>;
|
|
25
25
|
export declare function usdcToken(network: Network): Contract<typeof ERC20_ABI>;
|
|
26
|
+
/**
|
|
27
|
+
* Generic ERC20 resolver for a token whose address is discovered at runtime
|
|
28
|
+
* (e.g. a datanet's primary token via getSubnetPrimaryToken), not pinned in
|
|
29
|
+
* addresses.ts. No TBD check — the caller already holds a concrete address.
|
|
30
|
+
*/
|
|
31
|
+
export declare function erc20(address: Address): Contract<typeof ERC20_ABI>;
|
|
26
32
|
export declare function tryPodManager(network: Network): Contract<typeof POD_MANAGER_ABI> | null;
|
|
27
33
|
export declare function trySubnetManager(network: Network): Contract<typeof SUBNET_MANAGER_ABI> | null;
|
|
28
34
|
export declare function tryVeReppo(network: Network): Contract<typeof VE_REPPO_ABI> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/chain/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAgC,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACV,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,QAAQ,CAAC,IAAI;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC;CACX;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAM7E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAMnF;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAMvE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,CAMvE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,CAMtE;AAeD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,GACf,QAAQ,CAAC,OAAO,eAAe,CAAC,GAAG,IAAI,CAIzC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,GAAG,IAAI,CAG7F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,IAAI,CAGjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAGjF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAGhF"}
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/chain/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAgC,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACV,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,QAAQ,CAAC,IAAI;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC;CACX;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAM7E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAMnF;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAMvE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,CAMvE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,CAMtE;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,CAElE;AAeD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,GACf,QAAQ,CAAC,OAAO,eAAe,CAAC,GAAG,IAAI,CAIzC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,GAAG,IAAI,CAG7F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,IAAI,CAGjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAGjF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,GAAG,IAAI,CAGhF"}
|
package/dist/chain/contracts.js
CHANGED
|
@@ -35,6 +35,14 @@ export function usdcToken(network) {
|
|
|
35
35
|
abi: ERC20_ABI,
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Generic ERC20 resolver for a token whose address is discovered at runtime
|
|
40
|
+
* (e.g. a datanet's primary token via getSubnetPrimaryToken), not pinned in
|
|
41
|
+
* addresses.ts. No TBD check — the caller already holds a concrete address.
|
|
42
|
+
*/
|
|
43
|
+
export function erc20(address) {
|
|
44
|
+
return { address, abi: ERC20_ABI };
|
|
45
|
+
}
|
|
38
46
|
// ── Non-throwing variants ──────────────────────────────────────────────
|
|
39
47
|
//
|
|
40
48
|
// Read commands (e.g. `query balance`) need to render an `unavailable`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/chain/contracts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/chain/contracts.ts"],"names":[],"mappings":"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"}
|
package/dist/chain/receipt.d.ts
CHANGED
|
@@ -16,10 +16,17 @@ type ReceiptWaitClient = {
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function receiptGasEth(receipt: TransactionReceipt): string;
|
|
18
18
|
/**
|
|
19
|
-
* Actual
|
|
20
|
-
* token's
|
|
21
|
-
*
|
|
22
|
-
*
|
|
19
|
+
* Actual amount of `token` paid by `caller` in a confirmed tx, as a decimal
|
|
20
|
+
* string at the token's `decimals`: sums the token's Transfer events where
|
|
21
|
+
* `from` is the caller. Surfaced in write-command JSON (like gasEth) so
|
|
22
|
+
* consumers can reconcile budget accounting to ACTUAL fees instead of
|
|
23
|
+
* estimates. Returns "0" when no transfer from the caller exists. Generalizes
|
|
24
|
+
* reppoFeeFromReceipt to non-18-decimal fee tokens (a datanet's primary token).
|
|
25
|
+
*/
|
|
26
|
+
export declare function tokenFeeFromReceipt(receipt: TransactionReceipt, token: Address, caller: Address, decimals: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Actual REPPO paid in a confirmed tx (18 decimals), as a decimal string. Thin
|
|
29
|
+
* wrapper over tokenFeeFromReceipt; kept for existing REPPO-path callers.
|
|
23
30
|
*/
|
|
24
31
|
export declare function reppoFeeFromReceipt(receipt: TransactionReceipt, reppoToken: Address, caller: Address): string;
|
|
25
32
|
export declare function waitForWriteReceipt(publicClient: ReceiptWaitClient, hash: Hash, timeoutMs?: number): Promise<TransactionReceipt>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/chain/receipt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAI9D,KAAK,iBAAiB,GAAG;IACvB,yBAAyB,CAAC,IAAI,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAEjE;AAKD
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/chain/receipt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAI9D,KAAK,iBAAiB,GAAG;IACvB,yBAAyB,CAAC,IAAI,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAEjE;AAKD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CAWR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAE7G;AAED,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,iBAAiB,EAC/B,IAAI,EAAE,IAAI,EACV,SAAS,SAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAa7B"}
|
package/dist/chain/receipt.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { WaitForTransactionReceiptTimeoutError, formatEther } from 'viem';
|
|
1
|
+
import { WaitForTransactionReceiptTimeoutError, formatEther, formatUnits } from 'viem';
|
|
2
2
|
import { cliError } from '../output/format.js';
|
|
3
3
|
/**
|
|
4
4
|
* Gas cost of a confirmed tx in ETH, as a decimal string: gasUsed ×
|
|
@@ -11,17 +11,19 @@ export function receiptGasEth(receipt) {
|
|
|
11
11
|
// keccak256("Transfer(address,address,uint256)") — the ERC20 Transfer topic.
|
|
12
12
|
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
|
|
13
13
|
/**
|
|
14
|
-
* Actual
|
|
15
|
-
* token's
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Actual amount of `token` paid by `caller` in a confirmed tx, as a decimal
|
|
15
|
+
* string at the token's `decimals`: sums the token's Transfer events where
|
|
16
|
+
* `from` is the caller. Surfaced in write-command JSON (like gasEth) so
|
|
17
|
+
* consumers can reconcile budget accounting to ACTUAL fees instead of
|
|
18
|
+
* estimates. Returns "0" when no transfer from the caller exists. Generalizes
|
|
19
|
+
* reppoFeeFromReceipt to non-18-decimal fee tokens (a datanet's primary token).
|
|
18
20
|
*/
|
|
19
|
-
export function
|
|
20
|
-
const
|
|
21
|
+
export function tokenFeeFromReceipt(receipt, token, caller, decimals) {
|
|
22
|
+
const tokenAddr = token.toLowerCase();
|
|
21
23
|
const from = caller.toLowerCase().slice(2).padStart(64, '0');
|
|
22
24
|
let total = 0n;
|
|
23
25
|
for (const log of receipt.logs ?? []) {
|
|
24
|
-
if (log.address.toLowerCase() !==
|
|
26
|
+
if (log.address.toLowerCase() !== tokenAddr)
|
|
25
27
|
continue;
|
|
26
28
|
if ((log.topics?.[0] ?? '').toLowerCase() !== TRANSFER_TOPIC)
|
|
27
29
|
continue;
|
|
@@ -32,7 +34,14 @@ export function reppoFeeFromReceipt(receipt, reppoToken, caller) {
|
|
|
32
34
|
}
|
|
33
35
|
catch { /* malformed log data — skip */ }
|
|
34
36
|
}
|
|
35
|
-
return
|
|
37
|
+
return formatUnits(total, decimals);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Actual REPPO paid in a confirmed tx (18 decimals), as a decimal string. Thin
|
|
41
|
+
* wrapper over tokenFeeFromReceipt; kept for existing REPPO-path callers.
|
|
42
|
+
*/
|
|
43
|
+
export function reppoFeeFromReceipt(receipt, reppoToken, caller) {
|
|
44
|
+
return tokenFeeFromReceipt(receipt, reppoToken, caller, 18);
|
|
36
45
|
}
|
|
37
46
|
export async function waitForWriteReceipt(publicClient, hash, timeoutMs = 120_000) {
|
|
38
47
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/chain/receipt.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qCAAqC,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/chain/receipt.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qCAAqC,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAS/C;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAA2B;IACvD,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED,6EAA6E;AAC7E,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA2B,EAC3B,KAAc,EACd,MAAe,EACf,QAAgB;IAEhB,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,SAAS;YAAE,SAAS;QACtD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,cAAc;YAAE,SAAS;QACvE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QACtE,IAAI,CAAC;YAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA2B,EAAE,UAAmB,EAAE,MAAe;IACnG,OAAO,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAA+B,EAC/B,IAAU,EACV,SAAS,GAAG,OAAO;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,qCAAqC,EAAE,CAAC;YACzD,MAAM,QAAQ,CACZ,oBAAoB,EACpB,mBAAmB,SAAS,GAAG,IAAI,0BAA0B,IAAI,EAAE,EACnE,8FAA8F,CAC/F,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6CzC,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAgB,KAAK,aAAiB;IAEtC,OAAgB,KAAK,4BAgBlB;IAEH,OAAO,SAAuH;IAC9H,MAAM,SAAwH;IAC9H,KAAK,SAA0H;IAC/H,cAAc,qBAAsC;IACpD,MAAM,UAAsC;IAEtC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAqNjC"}
|
package/dist/commands/approve.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `reppo approve --spender <alias|0x...> [--amount <units|max>] [--token reppo|usdc]`
|
|
2
|
+
* `reppo approve --spender <alias|0x...> [--amount <units|max>] [--token reppo|usdc|0x...]`
|
|
3
3
|
* — set an ERC20 allowance so subsequent write commands (lock, grant-access,
|
|
4
4
|
* mint-pod) don't fail with INSUFFICIENT_ALLOWANCE.
|
|
5
5
|
*
|
|
6
6
|
* Most agent flows want unlimited approval once, so `--amount` defaults to
|
|
7
|
-
* `max` (MaxUint256). Pass a numeric value (in human
|
|
7
|
+
* `max` (MaxUint256). Pass a numeric value (in human token units) for a
|
|
8
8
|
* bounded approval.
|
|
9
9
|
*
|
|
10
|
+
* `--token` accepts the `reppo`/`usdc` aliases (decimals known statically) or
|
|
11
|
+
* an arbitrary ERC20 token ADDRESS (0x…) — e.g. a datanet's primary token, so
|
|
12
|
+
* an operator can approve it for the SubnetManager. For an address the token's
|
|
13
|
+
* `decimals()` is read on-chain for amount scaling (never assumed 18).
|
|
14
|
+
*
|
|
10
15
|
* Spender aliases resolve per network:
|
|
11
16
|
* - pod-manager → PodManager (mintPodWithREPPO, mintPodWithPrimaryToken)
|
|
12
17
|
* - subnet-manager → SubnetManager (grantAccess REPPO fee — pulled here)
|
|
@@ -25,7 +30,7 @@ import { isAddress, parseUnits, formatUnits, maxUint256 } from 'viem';
|
|
|
25
30
|
import { BaseCommand } from './_base.js';
|
|
26
31
|
import { cliError, emit } from '../output/format.js';
|
|
27
32
|
import { createClients, nextNonce } from '../chain/clients.js';
|
|
28
|
-
import { podManager, subnetManager, veReppo, reppoToken, usdcToken, } from '../chain/contracts.js';
|
|
33
|
+
import { podManager, subnetManager, veReppo, reppoToken, usdcToken, erc20, } from '../chain/contracts.js';
|
|
29
34
|
import { decodeRevert } from '../chain/errors.js';
|
|
30
35
|
import { receiptGasEth } from '../chain/receipt.js';
|
|
31
36
|
import { begin, markSubmitted, markConfirmed, markFailed, peekIdempotent, } from '../state/idempotency.js';
|
|
@@ -47,7 +52,7 @@ function resolveSpender(spender, network) {
|
|
|
47
52
|
export class ApproveCommand extends BaseCommand {
|
|
48
53
|
static paths = [['approve']];
|
|
49
54
|
static usage = BaseCommand.Usage({
|
|
50
|
-
description: 'Approve a Reppo contract to spend your REPPO
|
|
55
|
+
description: 'Approve a Reppo contract to spend your REPPO, USDC, or an arbitrary ERC20 token.',
|
|
51
56
|
examples: [
|
|
52
57
|
['Unlimited REPPO approval for veREPPO (default amount=max)',
|
|
53
58
|
'reppo approve --spender ve-reppo'],
|
|
@@ -55,6 +60,8 @@ export class ApproveCommand extends BaseCommand {
|
|
|
55
60
|
'reppo approve --spender subnet-manager --amount 100'],
|
|
56
61
|
['USDC approval for PodManager (mintPodWithPrimaryToken)',
|
|
57
62
|
'reppo approve --spender pod-manager --token usdc --amount 50'],
|
|
63
|
+
["Approve a datanet's primary token (arbitrary ERC20 address) for SubnetManager",
|
|
64
|
+
'reppo approve --spender subnet-manager --token 0xEeEE…0000 --amount 25'],
|
|
58
65
|
['Raw spender address + idempotency key',
|
|
59
66
|
'reppo approve --spender 0xabc...def --amount max --idempotency-key approve-veReppo-once'],
|
|
60
67
|
['Dry-run',
|
|
@@ -63,23 +70,59 @@ export class ApproveCommand extends BaseCommand {
|
|
|
63
70
|
});
|
|
64
71
|
spender = Option.String('--spender', { required: true, description: 'pod-manager | subnet-manager | ve-reppo | 0x-address' });
|
|
65
72
|
amount = Option.String('--amount', 'max', { description: 'Token amount in human units, or "max" for MaxUint256 (default).' });
|
|
66
|
-
token = Option.String('--token', 'reppo', { description: 'reppo (default) or
|
|
73
|
+
token = Option.String('--token', 'reppo', { description: 'reppo (default), usdc, or an arbitrary ERC20 token address (0x…)' });
|
|
67
74
|
idempotencyKey = Option.String('--idempotency-key');
|
|
68
75
|
dryRun = Option.Boolean('--dry-run', false);
|
|
69
76
|
async execute() {
|
|
70
77
|
try {
|
|
71
|
-
// Validate token
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
// Validate --token early: a reppo/usdc alias, or an arbitrary ERC20
|
|
79
|
+
// address. INVALID_TOKEN for anything that's neither. (decimals for the
|
|
80
|
+
// address path is read on-chain below — it needs the RPC client.)
|
|
81
|
+
const tokenIsAlias = TOKEN_NAMES.has(this.token);
|
|
82
|
+
const tokenIsAddress = isAddress(this.token);
|
|
83
|
+
if (!tokenIsAlias && !tokenIsAddress) {
|
|
84
|
+
throw cliError('INVALID_TOKEN', `--token must be reppo, usdc, or a 0x-prefixed ERC20 address; got "${this.token}".`);
|
|
74
85
|
}
|
|
75
|
-
const tokenName = this.token;
|
|
76
|
-
const decimals = tokenName === 'reppo' ? 18 : 6;
|
|
77
86
|
const cfg = this.loadConfig();
|
|
78
87
|
const pk = cfg.privateKey;
|
|
79
88
|
if (!pk) {
|
|
80
89
|
throw cliError('MISSING_PRIVATE_KEY', 'No signing key available.', 'Set REPPO_PRIVATE_KEY in env.');
|
|
81
90
|
}
|
|
82
91
|
const spenderAddr = resolveSpender(this.spender, cfg.network);
|
|
92
|
+
const clients = createClients({
|
|
93
|
+
network: cfg.network,
|
|
94
|
+
privateKey: pk,
|
|
95
|
+
...(cfg.rpcUrl ? { rpcUrl: cfg.rpcUrl } : {}),
|
|
96
|
+
});
|
|
97
|
+
// Resolve the token contract, its decimals, and a display/fingerprint
|
|
98
|
+
// label. Aliases pin decimals statically; an address reads decimals()
|
|
99
|
+
// on-chain (catch → clean cliError) so amount scaling is never wrong.
|
|
100
|
+
// reppoToken/usdcToken and erc20 all return Contract<typeof ERC20_ABI>.
|
|
101
|
+
let token;
|
|
102
|
+
let decimals;
|
|
103
|
+
// tokenLabel: stable identifier for the args fingerprint + result `token` field
|
|
104
|
+
// (alias name, or the lowercased address). tokenDisplay: human-mode label.
|
|
105
|
+
let tokenLabel;
|
|
106
|
+
let tokenDisplay;
|
|
107
|
+
if (tokenIsAlias) {
|
|
108
|
+
const tokenName = this.token;
|
|
109
|
+
token = tokenName === 'reppo' ? reppoToken(cfg.network) : usdcToken(cfg.network);
|
|
110
|
+
decimals = tokenName === 'reppo' ? 18 : 6;
|
|
111
|
+
tokenLabel = tokenName;
|
|
112
|
+
tokenDisplay = tokenName.toUpperCase();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const tokenAddr = this.token;
|
|
116
|
+
token = erc20(tokenAddr);
|
|
117
|
+
decimals = await clients.publicClient
|
|
118
|
+
.readContract({ ...token, functionName: 'decimals' })
|
|
119
|
+
.then((dec) => Number(dec))
|
|
120
|
+
.catch(() => {
|
|
121
|
+
throw cliError('INVALID_TOKEN', `Could not read decimals() for token ${tokenAddr} on ${cfg.network}.`, 'The address is not a standard ERC20 (decimals() reverted or returned non-numeric data).');
|
|
122
|
+
});
|
|
123
|
+
tokenLabel = tokenAddr.toLowerCase();
|
|
124
|
+
tokenDisplay = tokenAddr;
|
|
125
|
+
}
|
|
83
126
|
let amount;
|
|
84
127
|
if (this.amount === 'max') {
|
|
85
128
|
amount = maxUint256;
|
|
@@ -98,7 +141,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
98
141
|
// Args fingerprint baked into the cache so re-using one key with a
|
|
99
142
|
// different (token, spender, amount) → IDEMPOTENCY_ARGS_MISMATCH.
|
|
100
143
|
const args = {
|
|
101
|
-
token:
|
|
144
|
+
token: tokenLabel,
|
|
102
145
|
spender: spenderAddr.toLowerCase(),
|
|
103
146
|
amount: amount.toString(),
|
|
104
147
|
};
|
|
@@ -115,12 +158,6 @@ export class ApproveCommand extends BaseCommand {
|
|
|
115
158
|
`Re-run after the tx confirms, or check the explorer.`]);
|
|
116
159
|
return 0;
|
|
117
160
|
}
|
|
118
|
-
const clients = createClients({
|
|
119
|
-
network: cfg.network,
|
|
120
|
-
privateKey: pk,
|
|
121
|
-
...(cfg.rpcUrl ? { rpcUrl: cfg.rpcUrl } : {}),
|
|
122
|
-
});
|
|
123
|
-
const token = tokenName === 'reppo' ? reppoToken(cfg.network) : usdcToken(cfg.network);
|
|
124
161
|
// Pre-flight: skip the tx entirely if the existing allowance already
|
|
125
162
|
// covers the request. Saves gas and matches agent re-runnability.
|
|
126
163
|
const currentAllowance = await clients.publicClient.readContract({
|
|
@@ -132,7 +169,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
132
169
|
: { raw: a.toString(), formatted: formatUnits(a, decimals) };
|
|
133
170
|
if (currentAllowance >= amount) {
|
|
134
171
|
const result = {
|
|
135
|
-
token:
|
|
172
|
+
token: tokenLabel,
|
|
136
173
|
spender: spenderAddr,
|
|
137
174
|
owner: clients.account.address,
|
|
138
175
|
requested: fmtAmt(amount),
|
|
@@ -144,7 +181,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
144
181
|
// `markConfirmed` requires a real txHash. Re-reading the chain
|
|
145
182
|
// allowance on retry is cheap and authoritative.
|
|
146
183
|
emit(result, [
|
|
147
|
-
`= No-op: ${
|
|
184
|
+
`= No-op: ${tokenDisplay} allowance from ${clients.account.address} to ${spenderAddr}`,
|
|
148
185
|
` is already ${fmtAmt(currentAllowance).formatted} (>= requested ${fmtAmt(amount).formatted}).`,
|
|
149
186
|
]);
|
|
150
187
|
return 0;
|
|
@@ -159,7 +196,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
159
196
|
});
|
|
160
197
|
emit({
|
|
161
198
|
simulated: true,
|
|
162
|
-
token:
|
|
199
|
+
token: tokenLabel,
|
|
163
200
|
spender: spenderAddr,
|
|
164
201
|
owner: clients.account.address,
|
|
165
202
|
requested: fmtAmt(amount),
|
|
@@ -199,7 +236,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
199
236
|
const result = {
|
|
200
237
|
txHash: tx,
|
|
201
238
|
gasEth: receiptGasEth(receipt),
|
|
202
|
-
token:
|
|
239
|
+
token: tokenLabel,
|
|
203
240
|
spender: spenderAddr,
|
|
204
241
|
owner: clients.account.address,
|
|
205
242
|
requested: fmtAmt(amount),
|
|
@@ -212,7 +249,7 @@ export class ApproveCommand extends BaseCommand {
|
|
|
212
249
|
if (this.idempotencyKey)
|
|
213
250
|
await markConfirmed(this.idempotencyKey, COMMAND, args, result, tx);
|
|
214
251
|
emit(result, [
|
|
215
|
-
`✓ Approved ${spenderAddr} to spend ${fmtAmt(amount).formatted} ${
|
|
252
|
+
`✓ Approved ${spenderAddr} to spend ${fmtAmt(amount).formatted} ${tokenDisplay}`,
|
|
216
253
|
` tx: ${result.basescanUrl}`,
|
|
217
254
|
` block: ${receipt.blockNumber}`,
|
|
218
255
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { BaseCommand } from './_base.js';
|
|
2
|
+
/** Maps the --token choice to the SubnetManager access method + fee getter. */
|
|
3
|
+
export declare function accessFns(token: 'reppo' | 'primary'): {
|
|
4
|
+
access: 'accessSubnetWithREPPOFee' | 'accessSubnetWithPrimaryTokenFee';
|
|
5
|
+
feeGetter: 'getAccessFeeREPPO' | 'getAccessFeePrimaryToken';
|
|
6
|
+
};
|
|
2
7
|
export declare class GrantAccessCommand extends BaseCommand {
|
|
3
8
|
static paths: string[][];
|
|
4
9
|
static usage: import("clipanion").Usage;
|
|
5
10
|
datanet: string;
|
|
11
|
+
token: string;
|
|
6
12
|
to: string | undefined;
|
|
7
13
|
idempotencyKey: string | undefined;
|
|
8
14
|
dryRun: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant-access.d.ts","sourceRoot":"","sources":["../../src/commands/grant-access.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grant-access.d.ts","sourceRoot":"","sources":["../../src/commands/grant-access.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAWzC,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG;IACrD,MAAM,EAAE,0BAA0B,GAAG,iCAAiC,CAAC;IACvE,SAAS,EAAE,mBAAmB,GAAG,0BAA0B,CAAC;CAC7D,CAIA;AAED,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,OAAgB,KAAK,aAAsB;IAE3C,OAAgB,KAAK,4BAclB;IAEH,OAAO,SAAyG;IAChH,KAAK,SAAoG;IACzG,EAAE,qBAA6H;IAC/H,cAAc,qBAAsC;IACpD,MAAM,UAAsC;IAEtC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAyPjC"}
|
|
@@ -1,45 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `reppo grant-access --datanet <id> [--to <addr>]` —
|
|
3
|
-
* access fee and grant `--to` access
|
|
4
|
-
*
|
|
2
|
+
* `reppo grant-access --datanet <id> [--to <addr>] [--token reppo|primary]` —
|
|
3
|
+
* pay the datanet access fee and grant `--to` access. Paid in REPPO by default,
|
|
4
|
+
* or in the datanet's primary token with `--token primary` (mirrors
|
|
5
|
+
* `mint-pod --token`). Defaults `--to` to the address from REPPO_PRIVATE_KEY.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
7
|
+
* On-chain the concept is a "subnet". For REPPO we call
|
|
8
|
+
* `accessSubnetWithREPPOFee` + `getAccessFeeREPPO`; for the primary token,
|
|
9
|
+
* `accessSubnetWithPrimaryTokenFee` + `getAccessFeePrimaryToken`, with the token
|
|
10
|
+
* address resolved via `getSubnetPrimaryToken` and its `decimals()` read on-chain
|
|
11
|
+
* (never assumed 18).
|
|
9
12
|
*
|
|
10
|
-
* Pre-flight
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* fee 0xfb8f41b2 selector errors.ts decodes)
|
|
13
|
+
* Pre-flight (all surface error codes BEFORE the cache write):
|
|
14
|
+
* 1. INVALID_TOKEN (--token not reppo|primary)
|
|
15
|
+
* 2. validSubnet(datanetId) → DATANET_NOT_FOUND
|
|
16
|
+
* 3. hasSubnetAccess(datanetId, to) → ACCESS_ALREADY_GRANTED
|
|
17
|
+
* 4. fee getter → fee amount (in the fee token)
|
|
18
|
+
* 5. feeToken balance >= fee → INSUFFICIENT_REPPO_BALANCE / INSUFFICIENT_TOKEN_BALANCE
|
|
19
|
+
* 6. feeToken allowance(caller→sm) ≥ → INSUFFICIENT_ALLOWANCE
|
|
18
20
|
*
|
|
19
|
-
* Idempotency
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* Args fingerprint: { datanetId, to } — re-using one --idempotency-key
|
|
23
|
-
* for a different (datanetId, to) is rejected with IDEMPOTENCY_ARGS_MISMATCH.
|
|
21
|
+
* Idempotency: begin → submit → markSubmitted → wait → markConfirmed.
|
|
22
|
+
* Args fingerprint: { datanetId, to, token }.
|
|
24
23
|
*/
|
|
25
24
|
import { Option } from 'clipanion';
|
|
26
25
|
import { formatUnits, isAddress } from 'viem';
|
|
27
26
|
import { BaseCommand } from './_base.js';
|
|
28
27
|
import { cliError, emit } from '../output/format.js';
|
|
29
28
|
import { createClients, nextNonce } from '../chain/clients.js';
|
|
30
|
-
import { subnetManager, reppoToken } from '../chain/contracts.js';
|
|
29
|
+
import { subnetManager, reppoToken, erc20 } from '../chain/contracts.js';
|
|
31
30
|
import { decodeRevert } from '../chain/errors.js';
|
|
32
31
|
import { handleSubmittedCacheDecision } from './write-cache.js';
|
|
33
|
-
import { waitForWriteReceipt, receiptGasEth,
|
|
32
|
+
import { waitForWriteReceipt, receiptGasEth, tokenFeeFromReceipt } from '../chain/receipt.js';
|
|
34
33
|
import { begin, markSubmitted, markConfirmed, markFailed, peekIdempotent } from '../state/idempotency.js';
|
|
35
34
|
const COMMAND = 'grant-access';
|
|
35
|
+
/** Maps the --token choice to the SubnetManager access method + fee getter. */
|
|
36
|
+
export function accessFns(token) {
|
|
37
|
+
return token === 'reppo'
|
|
38
|
+
? { access: 'accessSubnetWithREPPOFee', feeGetter: 'getAccessFeeREPPO' }
|
|
39
|
+
: { access: 'accessSubnetWithPrimaryTokenFee', feeGetter: 'getAccessFeePrimaryToken' };
|
|
40
|
+
}
|
|
36
41
|
export class GrantAccessCommand extends BaseCommand {
|
|
37
42
|
static paths = [['grant-access']];
|
|
38
43
|
static usage = BaseCommand.Usage({
|
|
39
|
-
description: 'Pay the
|
|
44
|
+
description: 'Pay the datanet access fee (REPPO or the datanet primary token) and grant an address access.',
|
|
40
45
|
examples: [
|
|
41
|
-
['Grant the wallet derived from REPPO_PRIVATE_KEY access to datanet 19',
|
|
46
|
+
['Grant the wallet derived from REPPO_PRIVATE_KEY access to datanet 19 (paid in REPPO)',
|
|
42
47
|
'reppo grant-access --datanet 19'],
|
|
48
|
+
['Pay the access fee in the datanet primary token instead',
|
|
49
|
+
'reppo grant-access --datanet 19 --token primary'],
|
|
43
50
|
['Grant a different address access',
|
|
44
51
|
'reppo grant-access --datanet 19 --to 0x726c…E31d'],
|
|
45
52
|
['With idempotency key',
|
|
@@ -49,6 +56,7 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
49
56
|
],
|
|
50
57
|
});
|
|
51
58
|
datanet = Option.String('--datanet', { required: true, description: 'Datanet (subnet) ID to grant access to' });
|
|
59
|
+
token = Option.String('--token', 'reppo', { description: 'Fee asset — "reppo" (default) or "primary"' });
|
|
52
60
|
to = Option.String('--to', { description: 'Address to grant access to (defaults to address derived from REPPO_PRIVATE_KEY)' });
|
|
53
61
|
idempotencyKey = Option.String('--idempotency-key');
|
|
54
62
|
dryRun = Option.Boolean('--dry-run', false);
|
|
@@ -66,6 +74,10 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
66
74
|
catch {
|
|
67
75
|
throw cliError('INVALID_DATANET_ID', `Datanet id must be a non-negative integer; got "${this.datanet}".`);
|
|
68
76
|
}
|
|
77
|
+
if (this.token !== 'reppo' && this.token !== 'primary') {
|
|
78
|
+
throw cliError('INVALID_TOKEN', `--token must be "reppo" or "primary"; got "${this.token}".`);
|
|
79
|
+
}
|
|
80
|
+
const fns = accessFns(this.token);
|
|
69
81
|
const clients = createClients({
|
|
70
82
|
network: cfg.network,
|
|
71
83
|
privateKey: pk,
|
|
@@ -76,80 +88,125 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
76
88
|
? this.to
|
|
77
89
|
: (() => { throw cliError('INVALID_ADDRESS', `Invalid --to address: ${this.to}`); })())
|
|
78
90
|
: clients.account.address;
|
|
79
|
-
const args = { datanetId: datanetId.toString(), to: target.toLowerCase() };
|
|
91
|
+
const args = { datanetId: datanetId.toString(), to: target.toLowerCase(), token: this.token };
|
|
80
92
|
const decision = await peekIdempotent(this.idempotencyKey, COMMAND, args, this.dryRun);
|
|
81
93
|
if (decision.kind === 'return-confirmed') {
|
|
82
94
|
emit({ ...decision.result, idempotent: true, status: 'confirmed' }, [`(cached, confirmed) tx: ${decision.txHash ?? 'n/a'}`]);
|
|
83
95
|
return 0;
|
|
84
96
|
}
|
|
85
97
|
if (decision.kind === 'return-submitted') {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
98
|
+
// Reuse `clients` (already built above); recompute feePaid/gasEth from the
|
|
99
|
+
// receipt so a reconciled-confirmed result has the same keys as a
|
|
100
|
+
// fresh-confirmed one. feeToken {address,decimals} survives on the cached
|
|
101
|
+
// submitted record (markSubmitted stored feeFields).
|
|
102
|
+
const ftMeta = decision.result.feeToken;
|
|
91
103
|
return handleSubmittedCacheDecision(decision, {
|
|
92
104
|
idempotencyKey: this.idempotencyKey,
|
|
93
105
|
command: COMMAND,
|
|
94
106
|
args,
|
|
95
107
|
network: cfg.network,
|
|
96
108
|
publicClient: clients.publicClient,
|
|
97
|
-
buildResult:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
catch {
|
|
110
|
-
return { datanetId: datanetId.toString(), to: target };
|
|
109
|
+
buildResult: (receipt) => {
|
|
110
|
+
const base = {
|
|
111
|
+
datanetId: datanetId.toString(),
|
|
112
|
+
to: target,
|
|
113
|
+
token: this.token,
|
|
114
|
+
gasEth: receiptGasEth(receipt),
|
|
115
|
+
};
|
|
116
|
+
if (ftMeta) {
|
|
117
|
+
const feePaid = tokenFeeFromReceipt(receipt, ftMeta.address, clients.account.address, ftMeta.decimals);
|
|
118
|
+
base.feePaid = feePaid;
|
|
119
|
+
if (this.token === 'reppo')
|
|
120
|
+
base.reppoFee = feePaid;
|
|
111
121
|
}
|
|
122
|
+
return base;
|
|
112
123
|
},
|
|
113
124
|
});
|
|
114
125
|
}
|
|
115
|
-
// Throwing variants — write commands must fail loud on TBD.
|
|
116
126
|
const sm = subnetManager(cfg.network);
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
address: sm.address, abi: sm.abi, functionName: 'hasSubnetAccess', args: [datanetId, target],
|
|
125
|
-
}),
|
|
126
|
-
clients.publicClient.readContract({
|
|
127
|
-
address: sm.address, abi: sm.abi, functionName: 'getAccessFeeREPPO', args: [datanetId],
|
|
128
|
-
}),
|
|
129
|
-
clients.publicClient.readContract({
|
|
130
|
-
address: reppo.address, abi: reppo.abi, functionName: 'balanceOf', args: [clients.account.address],
|
|
131
|
-
}),
|
|
132
|
-
clients.publicClient.readContract({
|
|
133
|
-
address: reppo.address, abi: reppo.abi, functionName: 'allowance', args: [clients.account.address, sm.address],
|
|
134
|
-
}),
|
|
135
|
-
]);
|
|
127
|
+
// Validate the datanet BEFORE resolving the fee token. A nonexistent
|
|
128
|
+
// datanet must surface DATANET_NOT_FOUND — not DATANET_HAS_NO_PRIMARY_TOKEN
|
|
129
|
+
// (getSubnetPrimaryToken returns address(0) for a missing subnet too, which
|
|
130
|
+
// would otherwise mis-report the cause on the `--token primary` path).
|
|
131
|
+
const valid = await clients.publicClient.readContract({
|
|
132
|
+
address: sm.address, abi: sm.abi, functionName: 'validSubnet', args: [datanetId],
|
|
133
|
+
});
|
|
136
134
|
if (!valid) {
|
|
137
|
-
throw cliError('DATANET_NOT_FOUND', `Datanet ${datanetId} does not exist on ${cfg.network}.`, `Verify the id; check \`reppo query
|
|
135
|
+
throw cliError('DATANET_NOT_FOUND', `Datanet ${datanetId} does not exist on ${cfg.network}.`, `Verify the id; check \`reppo query datanet ${datanetId}\` before granting access.`);
|
|
138
136
|
}
|
|
137
|
+
// Resolve the fee token: REPPO (pinned) or the datanet's primary token
|
|
138
|
+
// (discovered on-chain). decimals MUST be read for the primary token,
|
|
139
|
+
// never assumed 18 — a non-18-decimal token would otherwise corrupt every
|
|
140
|
+
// amount.
|
|
141
|
+
let feeTokenAddress;
|
|
142
|
+
let feeTokenDecimals;
|
|
143
|
+
let feeTokenSymbol;
|
|
144
|
+
if (this.token === 'reppo') {
|
|
145
|
+
feeTokenAddress = reppoToken(cfg.network).address;
|
|
146
|
+
feeTokenDecimals = 18;
|
|
147
|
+
feeTokenSymbol = 'REPPO';
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
let primaryAddr;
|
|
151
|
+
try {
|
|
152
|
+
primaryAddr = await clients.publicClient.readContract({
|
|
153
|
+
address: sm.address, abi: sm.abi, functionName: 'getSubnetPrimaryToken', args: [datanetId],
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
throw cliError('DATANET_HAS_NO_PRIMARY_TOKEN', `Could not resolve a primary token for datanet ${datanetId} on ${cfg.network}.`, 'This datanet likely charges access in REPPO only — retry without `--token primary`.');
|
|
158
|
+
}
|
|
159
|
+
// getSubnetPrimaryToken returns address(0) for REPPO-only datanets.
|
|
160
|
+
if (BigInt(primaryAddr) === 0n) {
|
|
161
|
+
throw cliError('DATANET_HAS_NO_PRIMARY_TOKEN', `Datanet ${datanetId} has no primary token configured.`, 'This datanet charges access in REPPO only — retry without `--token primary`.');
|
|
162
|
+
}
|
|
163
|
+
feeTokenAddress = primaryAddr;
|
|
164
|
+
const ft = erc20(feeTokenAddress);
|
|
165
|
+
// decimals has no safe default — a wrong value corrupts every amount —
|
|
166
|
+
// so a read failure is a hard error, not a guess. Wrap it like symbol()
|
|
167
|
+
// below so a raw viem decode error doesn't surface as INTERNAL_ERROR.
|
|
168
|
+
feeTokenDecimals = await clients.publicClient
|
|
169
|
+
.readContract({ ...ft, functionName: 'decimals' })
|
|
170
|
+
.then((dec) => Number(dec))
|
|
171
|
+
.catch(() => {
|
|
172
|
+
throw cliError('INVALID_PRIMARY_TOKEN', `Could not read decimals() for datanet ${datanetId} primary token ${feeTokenAddress}.`, 'The primary token is not a standard ERC20 (decimals() reverted or returned non-numeric data).');
|
|
173
|
+
});
|
|
174
|
+
// symbol is cosmetic — best-effort: some tokens return bytes32, which would
|
|
175
|
+
// fail to decode against the `string` ABI and abort the whole command.
|
|
176
|
+
feeTokenSymbol = await clients.publicClient
|
|
177
|
+
.readContract({ ...ft, functionName: 'symbol' })
|
|
178
|
+
.catch(() => `${feeTokenAddress.slice(0, 6)}…${feeTokenAddress.slice(-4)}`);
|
|
179
|
+
}
|
|
180
|
+
const feeToken = erc20(feeTokenAddress);
|
|
181
|
+
// Pre-flight in parallel where independent (validSubnet already checked above).
|
|
182
|
+
const [alreadyHasAccess, fee, balance, allowance] = await Promise.all([
|
|
183
|
+
clients.publicClient.readContract({ address: sm.address, abi: sm.abi, functionName: 'hasSubnetAccess', args: [datanetId, target] }),
|
|
184
|
+
clients.publicClient.readContract({ address: sm.address, abi: sm.abi, functionName: fns.feeGetter, args: [datanetId] }),
|
|
185
|
+
clients.publicClient.readContract({ ...feeToken, functionName: 'balanceOf', args: [clients.account.address] }),
|
|
186
|
+
clients.publicClient.readContract({ ...feeToken, functionName: 'allowance', args: [clients.account.address, sm.address] }),
|
|
187
|
+
]);
|
|
139
188
|
if (alreadyHasAccess) {
|
|
140
189
|
throw cliError('ACCESS_ALREADY_GRANTED', `${target} already has access to datanet ${datanetId}.`, 'Nothing to do — skip the call.');
|
|
141
190
|
}
|
|
142
191
|
if (balance < fee) {
|
|
143
|
-
throw cliError('INSUFFICIENT_REPPO_BALANCE', `Caller has ${formatUnits(balance,
|
|
192
|
+
throw cliError(this.token === 'reppo' ? 'INSUFFICIENT_REPPO_BALANCE' : 'INSUFFICIENT_TOKEN_BALANCE', `Caller has ${formatUnits(balance, feeTokenDecimals)} ${feeTokenSymbol} but the fee is ${formatUnits(fee, feeTokenDecimals)} ${feeTokenSymbol}.`, `Acquire more ${feeTokenSymbol} before granting access.`);
|
|
144
193
|
}
|
|
145
194
|
if (allowance < fee) {
|
|
146
|
-
throw cliError('INSUFFICIENT_ALLOWANCE',
|
|
147
|
-
`below the fee of ${formatUnits(fee,
|
|
148
|
-
`
|
|
195
|
+
throw cliError('INSUFFICIENT_ALLOWANCE', `${feeTokenSymbol} allowance from ${clients.account.address} to SubnetManager is ${formatUnits(allowance, feeTokenDecimals)}, ` +
|
|
196
|
+
`below the fee of ${formatUnits(fee, feeTokenDecimals)} ${feeTokenSymbol}.`, `Approve the SubnetManager (${sm.address}) for at least ${formatUnits(fee, feeTokenDecimals)} ${feeTokenSymbol} ` +
|
|
197
|
+
`(send the approve() tx manually, e.g. via cast).`);
|
|
149
198
|
}
|
|
199
|
+
const feeFields = {
|
|
200
|
+
feeToken: { symbol: feeTokenSymbol, address: feeTokenAddress, decimals: feeTokenDecimals },
|
|
201
|
+
feeAmount: { raw: fee.toString(), formatted: formatUnits(fee, feeTokenDecimals) },
|
|
202
|
+
// Legacy REPPO field for back-compat with existing consumers; only set on the REPPO path.
|
|
203
|
+
...(this.token === 'reppo'
|
|
204
|
+
? { feeREPPO: { raw: fee.toString(), formatted: formatUnits(fee, 18) } }
|
|
205
|
+
: {}),
|
|
206
|
+
};
|
|
150
207
|
if (this.dryRun) {
|
|
151
208
|
const sim = await clients.publicClient.simulateContract({
|
|
152
|
-
address: sm.address, abi: sm.abi, functionName:
|
|
209
|
+
address: sm.address, abi: sm.abi, functionName: fns.access,
|
|
153
210
|
args: [datanetId, target], account: clients.account,
|
|
154
211
|
}).catch((e) => {
|
|
155
212
|
const decoded = decodeRevert(e);
|
|
@@ -159,7 +216,8 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
159
216
|
simulated: true,
|
|
160
217
|
datanetId: datanetId.toString(),
|
|
161
218
|
to: target,
|
|
162
|
-
|
|
219
|
+
token: this.token,
|
|
220
|
+
...feeFields,
|
|
163
221
|
gas: sim.request.gas?.toString() ?? null,
|
|
164
222
|
});
|
|
165
223
|
return 0;
|
|
@@ -170,7 +228,7 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
170
228
|
try {
|
|
171
229
|
const nonce = await nextNonce(clients.publicClient, clients.account.address);
|
|
172
230
|
tx = await clients.walletClient.writeContract({
|
|
173
|
-
address: sm.address, abi: sm.abi, functionName:
|
|
231
|
+
address: sm.address, abi: sm.abi, functionName: fns.access,
|
|
174
232
|
args: [datanetId, target],
|
|
175
233
|
chain: clients.walletClient.chain, account: clients.account, nonce,
|
|
176
234
|
});
|
|
@@ -181,12 +239,9 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
181
239
|
await markFailed(this.idempotencyKey, COMMAND, args, decoded.code);
|
|
182
240
|
throw cliError(decoded.code, 'grant-access tx failed to submit', decoded.hint);
|
|
183
241
|
}
|
|
184
|
-
// markSubmitted BEFORE waitForReceipt — closes the retry-resend window.
|
|
185
242
|
if (this.idempotencyKey) {
|
|
186
243
|
await markSubmitted(this.idempotencyKey, COMMAND, args, tx, {
|
|
187
|
-
datanetId: datanetId.toString(),
|
|
188
|
-
to: target,
|
|
189
|
-
feeREPPO: { raw: fee.toString(), formatted: formatUnits(fee, 18) },
|
|
244
|
+
datanetId: datanetId.toString(), to: target, token: this.token, ...feeFields,
|
|
190
245
|
});
|
|
191
246
|
}
|
|
192
247
|
const receipt = await waitForWriteReceipt(clients.publicClient, tx);
|
|
@@ -195,13 +250,18 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
195
250
|
await markFailed(this.idempotencyKey, COMMAND, args, 'TX_REVERTED', tx);
|
|
196
251
|
throw cliError('TX_REVERTED', `grant-access tx reverted: ${tx}`);
|
|
197
252
|
}
|
|
253
|
+
const feePaid = tokenFeeFromReceipt(receipt, feeTokenAddress, clients.account.address, feeTokenDecimals);
|
|
198
254
|
const result = {
|
|
199
255
|
txHash: tx,
|
|
200
256
|
gasEth: receiptGasEth(receipt),
|
|
201
|
-
|
|
257
|
+
feePaid,
|
|
258
|
+
// Legacy top-level field for back-compat with pre-0.8.5 consumers that
|
|
259
|
+
// read `reppoFee`; only meaningful on the REPPO path.
|
|
260
|
+
...(this.token === 'reppo' ? { reppoFee: feePaid } : {}),
|
|
202
261
|
datanetId: datanetId.toString(),
|
|
203
262
|
to: target,
|
|
204
|
-
|
|
263
|
+
token: this.token,
|
|
264
|
+
...feeFields,
|
|
205
265
|
block: receipt.blockNumber.toString(),
|
|
206
266
|
basescanUrl: cfg.network === 'mainnet'
|
|
207
267
|
? `https://basescan.org/tx/${tx}`
|
|
@@ -209,9 +269,11 @@ export class GrantAccessCommand extends BaseCommand {
|
|
|
209
269
|
};
|
|
210
270
|
if (this.idempotencyKey)
|
|
211
271
|
await markConfirmed(this.idempotencyKey, COMMAND, args, result, tx);
|
|
272
|
+
// Show the on-chain fee quote (always correct); feePaid in JSON is the
|
|
273
|
+
// receipt-derived actual, which can read 0 for non-standard transfer flows.
|
|
212
274
|
emit(result, [
|
|
213
275
|
`✓ Granted ${target} access to datanet ${datanetId}`,
|
|
214
|
-
` fee
|
|
276
|
+
` fee: ${result.feeAmount.formatted} ${feeTokenSymbol}`,
|
|
215
277
|
` tx: ${result.basescanUrl}`,
|
|
216
278
|
` block: ${receipt.blockNumber}`,
|
|
217
279
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grant-access.js","sourceRoot":"","sources":["../../src/commands/grant-access.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grant-access.js","sourceRoot":"","sources":["../../src/commands/grant-access.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanet.d.ts","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC1C,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAgB,KAAK,aAA0B;IAE/C,OAAgB,KAAK,4BAUlB;IAEH,OAAO,SAAqC;IAC5C,IAAI,qBAA+H;IAE7H,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"datanet.d.ts","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC1C,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAgB,KAAK,aAA0B;IAE/C,OAAgB,KAAK,4BAUlB;IAEH,OAAO,SAAqC;IAC5C,IAAI,qBAA+H;IAE7H,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA8JhC,OAAO,CAAC,oBAAoB;IAW5B;;;;;OAKG;YACW,aAAa;IAW3B,OAAO,CAAC,UAAU;IAsBlB,uDAAuD;IACvD,OAAO,CAAC,aAAa;CAyBtB"}
|
|
@@ -22,7 +22,7 @@ import { privateKeyToAddress } from 'viem/accounts';
|
|
|
22
22
|
import { BaseCommand } from '../_base.js';
|
|
23
23
|
import { cliError, emit } from '../../output/format.js';
|
|
24
24
|
import { createReadClient } from '../../chain/clients.js';
|
|
25
|
-
import { trySubnetManager, tryVeReppo } from '../../chain/contracts.js';
|
|
25
|
+
import { trySubnetManager, tryVeReppo, erc20 } from '../../chain/contracts.js';
|
|
26
26
|
import { DEFAULT_PUBLIC_API_URL } from '../../api/public.js';
|
|
27
27
|
import { fetchSubnetByTokenId, numericToString } from '../../api/subnets.js';
|
|
28
28
|
function unavailable(reason) {
|
|
@@ -98,6 +98,46 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
98
98
|
? await client.readContract({ ...sm, functionName: 'getAccessFeeREPPO', args: [datanetId] })
|
|
99
99
|
.then((v) => ({ raw: v.toString(), formatted: formatUnits(v, 18) }))
|
|
100
100
|
: unavailable('datanet does not exist');
|
|
101
|
+
// Primary-token access fee — for datanets that charge access in their own
|
|
102
|
+
// token rather than REPPO. Best-effort and decimals-aware: a revert here
|
|
103
|
+
// (or a datanet with no primary token) must NOT break the REPPO answer.
|
|
104
|
+
let accessFeePrimaryToken = unavailable('not read');
|
|
105
|
+
let primaryToken;
|
|
106
|
+
if (valid) {
|
|
107
|
+
try {
|
|
108
|
+
const primaryAddr = await client.readContract({
|
|
109
|
+
...sm, functionName: 'getSubnetPrimaryToken', args: [datanetId],
|
|
110
|
+
});
|
|
111
|
+
// getSubnetPrimaryToken returns address(0) for REPPO-only datanets.
|
|
112
|
+
// Short-circuit BEFORE touching the token (mirrors grant-access.ts's
|
|
113
|
+
// guard): no decimals()/symbol()/fee read, and primaryToken stays
|
|
114
|
+
// undefined. The wording is DISTINCT from a read failure so callers
|
|
115
|
+
// can tell "this datanet has no primary token" apart from a transport
|
|
116
|
+
// error.
|
|
117
|
+
if (BigInt(primaryAddr) === 0n) {
|
|
118
|
+
accessFeePrimaryToken = unavailable('datanet has no primary token');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const ft = erc20(primaryAddr);
|
|
122
|
+
const [dec, sym, pFee] = await Promise.all([
|
|
123
|
+
client.readContract({ ...ft, functionName: 'decimals' }),
|
|
124
|
+
// symbol is cosmetic — best-effort: bytes32/non-standard tokens fail
|
|
125
|
+
// to decode against the `string` ABI; fall back to '' rather than abort.
|
|
126
|
+
client.readContract({ ...ft, functionName: 'symbol' }).catch(() => ''),
|
|
127
|
+
client.readContract({ ...sm, functionName: 'getAccessFeePrimaryToken', args: [datanetId] }),
|
|
128
|
+
]);
|
|
129
|
+
const decimals = Number(dec);
|
|
130
|
+
primaryToken = { address: primaryAddr, symbol: sym, decimals };
|
|
131
|
+
accessFeePrimaryToken = { raw: pFee.toString(), formatted: formatUnits(pFee, decimals) };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// The read failed (transport, or a non-standard token's decimals()/fee
|
|
136
|
+
// getter reverted). Best-effort — never break the REPPO answer above.
|
|
137
|
+
// Wording is distinct from the no-primary-token case above.
|
|
138
|
+
accessFeePrimaryToken = unavailable('primary-token access fee read failed');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
101
141
|
// Optional caller-access check.
|
|
102
142
|
const callerAddr = this.resolveCallerAddress(cfg.privateKey);
|
|
103
143
|
const callerAccess = callerAddr && valid
|
|
@@ -114,6 +154,8 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
114
154
|
valid,
|
|
115
155
|
currentEpoch,
|
|
116
156
|
accessFeeREPPO,
|
|
157
|
+
accessFeePrimaryToken,
|
|
158
|
+
...(primaryToken ? { primaryToken } : {}),
|
|
117
159
|
...(callerAccess ? { callerAccess } : {}),
|
|
118
160
|
metadata,
|
|
119
161
|
};
|
|
@@ -127,6 +169,12 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
127
169
|
`Current epoch: ${currentEpoch ?? '(unavailable)'}`,
|
|
128
170
|
`Access fee: ${feeFmt}`,
|
|
129
171
|
];
|
|
172
|
+
// Primary-token access fee — shown only when the datanet actually has a
|
|
173
|
+
// primary token (primaryToken present implies accessFeePrimaryToken is numeric).
|
|
174
|
+
if (primaryToken && 'formatted' in accessFeePrimaryToken) {
|
|
175
|
+
lines.push(`Access fee (primary): ${accessFeePrimaryToken.formatted} ${primaryToken.symbol} ` +
|
|
176
|
+
`(${primaryToken.address}, ${primaryToken.decimals} dp)`);
|
|
177
|
+
}
|
|
130
178
|
if (callerAccess) {
|
|
131
179
|
lines.push(`Caller: ${callerAccess.address}`);
|
|
132
180
|
lines.push(`Caller access: ${callerAccess.hasAccess}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanet.js","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAgB,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"datanet.js","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"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"}
|