@reppo/cli 0.2.0 → 0.3.0

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Command-line interface for [Reppo](https://reppo.ai) — mint pods, vote, lock REPPO, manage datanets. Built for **AI agents** as the primary user, but humans can use it too.
4
4
 
5
- > **Status:** v0.1.0. `auth`, `query balance`, `query datanet`, `query emissions-due`, `query pod`, `query voting-power`, `claim-emissions`, `extend-lock`, `grant-access`, `lock`, `mint-pod`, `register-agent`, `unlock`, and `vote` ship in this release. The remaining 2 commands (`create-datanet`, `swap`) are scaffolded but not yet wired.
5
+ > **Status:** v0.3.0 — fully wired against PodManager V2 on mainnet. Shipped: `auth`, `query balance`, `query datanet`, `query emissions-due`, `query pod`, `query voting-power`, `list datanets`, `list pods`, `claim-emissions`, `extend-lock`, `grant-access`, `lock`, `mint-pod`, `register-agent`, `unlock`, `vote`. Remaining 2 commands (`create-datanet`, `swap`) are scaffolded but not yet wired.
6
6
 
7
7
  ## Install
8
8
 
@@ -54,14 +54,14 @@ Errors **always** emit JSON on stderr regardless of mode, with a stable `code` f
54
54
 
55
55
  ### Write
56
56
 
57
- - `reppo vote --pod <id> --subnet <id> --like|--dislike` — cast an on-chain vote
58
- - `reppo mint-pod` — mint a pod NFT. Mainnet: `--share <0-100>`. Testnet: `--datanet <id> [--token reppo|primary]`. Optional `--to <addr>`.
57
+ - `reppo vote --pod <id> --votes <n> --like|--dislike` — cast a vote on a pod, spending `<n>` voting power
58
+ - `reppo mint-pod --datanet <id> [--token reppo|primary] [--to <addr>]` — mint a pod into a datanet
59
59
  - `reppo lock <amount> --duration <seconds>` — lock REPPO into veREPPO for voting power
60
60
  - `reppo unlock <lockupId> [--to <addr>]` — withdraw an expired veREPPO lockup, returning the locked REPPO
61
61
  - `reppo extend-lock <lockupId> --duration <seconds>` — extend an existing veREPPO lockup
62
62
  - `reppo grant-access --datanet <id> [--to <addr>]` — pay the REPPO access fee and grant `--to` access to a datanet
63
63
  - `reppo claim-emissions --pod <id> --epoch <n>` — claim a pod's emissions for an epoch
64
- - `reppo register-agent --name <s> --description <s>` — register a new agent identity on the Reppo platform; returns id + accessToken + a server-provisioned (unfunded) Base wallet address. Send ETH + REPPO to it before on-chain mints.
64
+ - `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.
65
65
  - `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
66
66
  - `reppo create-datanet ...` *(planned — currently dashboard-only; the REST endpoint requires a Privy session cookie which is browser auth)*
67
67
  - `reppo swap <from> <to> --amount <n>` *(planned, mainnet only)*
@@ -82,7 +82,7 @@ Also available as a Claude Code skill that teaches agents how to invoke this CLI
82
82
  claude plugin install reppo
83
83
  ```
84
84
 
85
- The skill ships with the same v0.1.0 alpha feature subset.
85
+ The skill ships with the same v0.3.0 feature subset.
86
86
 
87
87
  ## License
88
88
 
package/dist/bin.js CHANGED
@@ -23,7 +23,7 @@ import { VoteCommand } from './commands/vote.js';
23
23
  const cli = new Cli({
24
24
  binaryLabel: 'Reppo CLI',
25
25
  binaryName: 'reppo',
26
- binaryVersion: '0.2.0',
26
+ binaryVersion: '0.3.0',
27
27
  enableCapture: false,
28
28
  });
29
29
  cli.register(Builtins.HelpCommand);
@@ -1,36 +1,32 @@
1
- export declare const POD_MANAGER_MAINNET_ABI: readonly [{
2
- readonly name: "mintPod";
1
+ export declare const POD_MANAGER_ABI: readonly [{
2
+ readonly name: "mintPodWithREPPO";
3
3
  readonly type: "function";
4
4
  readonly stateMutability: "nonpayable";
5
5
  readonly inputs: readonly [{
6
6
  readonly type: "address";
7
7
  readonly name: "to";
8
8
  }, {
9
- readonly type: "uint8";
10
- readonly name: "emissionSharePercent";
11
- }];
12
- readonly outputs: readonly [{
13
9
  readonly type: "uint256";
14
- readonly name: "podId";
10
+ readonly name: "subnetId";
15
11
  }];
16
- }, {
17
- readonly name: "publishingFee";
18
- readonly type: "function";
19
- readonly stateMutability: "view";
20
- readonly inputs: readonly [];
21
12
  readonly outputs: readonly [{
22
13
  readonly type: "uint256";
14
+ readonly name: "podId";
23
15
  }];
24
16
  }, {
25
- readonly name: "ownerOf";
17
+ readonly name: "mintPodWithPrimaryToken";
26
18
  readonly type: "function";
27
- readonly stateMutability: "view";
19
+ readonly stateMutability: "nonpayable";
28
20
  readonly inputs: readonly [{
21
+ readonly type: "address";
22
+ readonly name: "to";
23
+ }, {
29
24
  readonly type: "uint256";
30
- readonly name: "tokenId";
25
+ readonly name: "subnetId";
31
26
  }];
32
27
  readonly outputs: readonly [{
33
- readonly type: "address";
28
+ readonly type: "uint256";
29
+ readonly name: "podId";
34
30
  }];
35
31
  }, {
36
32
  readonly name: "vote";
@@ -41,10 +37,10 @@ export declare const POD_MANAGER_MAINNET_ABI: readonly [{
41
37
  readonly name: "podId";
42
38
  }, {
43
39
  readonly type: "uint256";
44
- readonly name: "subnetId";
40
+ readonly name: "votes";
45
41
  }, {
46
42
  readonly type: "bool";
47
- readonly name: "like_";
43
+ readonly name: "upVote";
48
44
  }];
49
45
  readonly outputs: readonly [];
50
46
  }, {
@@ -60,129 +56,112 @@ export declare const POD_MANAGER_MAINNET_ABI: readonly [{
60
56
  }];
61
57
  readonly outputs: readonly [];
62
58
  }, {
63
- readonly name: "getPodEmissionsOfEpoch";
59
+ readonly name: "claimVoterEmissions";
64
60
  readonly type: "function";
65
- readonly stateMutability: "view";
61
+ readonly stateMutability: "nonpayable";
66
62
  readonly inputs: readonly [{
67
- readonly type: "uint256";
68
- readonly name: "epoch";
63
+ readonly type: "address";
64
+ readonly name: "voter";
69
65
  }, {
70
66
  readonly type: "uint256";
71
67
  readonly name: "podId";
72
- }];
73
- readonly outputs: readonly [{
68
+ }, {
74
69
  readonly type: "uint256";
70
+ readonly name: "epoch";
75
71
  }];
72
+ readonly outputs: readonly [];
76
73
  }, {
77
- readonly name: "hasPodOwnerClaimedEmissions";
74
+ readonly name: "ownerOf";
78
75
  readonly type: "function";
79
76
  readonly stateMutability: "view";
80
77
  readonly inputs: readonly [{
81
78
  readonly type: "uint256";
82
- readonly name: "epoch";
83
- }, {
84
- readonly type: "uint256";
85
- readonly name: "podId";
79
+ readonly name: "tokenId";
86
80
  }];
87
81
  readonly outputs: readonly [{
88
- readonly type: "bool";
82
+ readonly type: "address";
89
83
  }];
90
84
  }, {
91
- readonly name: "getEpochTotalVotes";
85
+ readonly name: "podValid";
92
86
  readonly type: "function";
93
87
  readonly stateMutability: "view";
94
88
  readonly inputs: readonly [{
95
89
  readonly type: "uint256";
96
- readonly name: "epoch";
90
+ readonly name: "podId";
97
91
  }];
98
92
  readonly outputs: readonly [{
99
- readonly type: "uint256";
93
+ readonly type: "bool";
100
94
  }];
101
95
  }, {
102
- readonly name: "Transfer";
103
- readonly type: "event";
104
- readonly inputs: readonly [{
105
- readonly type: "address";
106
- readonly name: "from";
107
- readonly indexed: true;
108
- }, {
109
- readonly type: "address";
110
- readonly name: "to";
111
- readonly indexed: true;
112
- }, {
113
- readonly type: "uint256";
114
- readonly name: "tokenId";
115
- readonly indexed: true;
116
- }];
117
- }];
118
- export declare const POD_MANAGER_TESTNET_ABI: readonly [{
119
- readonly name: "mintPodWithREPPO";
96
+ readonly name: "getPodValidityEpoch";
120
97
  readonly type: "function";
121
- readonly stateMutability: "nonpayable";
98
+ readonly stateMutability: "view";
122
99
  readonly inputs: readonly [{
123
- readonly type: "address";
124
- readonly name: "to";
125
- }, {
126
100
  readonly type: "uint256";
127
- readonly name: "subnetId";
101
+ readonly name: "podId";
128
102
  }];
129
103
  readonly outputs: readonly [{
130
104
  readonly type: "uint256";
131
- readonly name: "podId";
132
105
  }];
133
106
  }, {
134
- readonly name: "mintPodWithPrimaryToken";
107
+ readonly name: "getPodUpVotesOfEpoch";
135
108
  readonly type: "function";
136
- readonly stateMutability: "nonpayable";
109
+ readonly stateMutability: "view";
137
110
  readonly inputs: readonly [{
138
- readonly type: "address";
139
- readonly name: "to";
111
+ readonly type: "uint256";
112
+ readonly name: "epoch";
140
113
  }, {
141
114
  readonly type: "uint256";
142
- readonly name: "subnetId";
115
+ readonly name: "podId";
143
116
  }];
144
117
  readonly outputs: readonly [{
145
118
  readonly type: "uint256";
146
- readonly name: "podId";
147
119
  }];
148
120
  }, {
149
- readonly name: "ownerOf";
121
+ readonly name: "getPodDownVotesOfEpoch";
150
122
  readonly type: "function";
151
123
  readonly stateMutability: "view";
152
124
  readonly inputs: readonly [{
153
125
  readonly type: "uint256";
154
- readonly name: "tokenId";
126
+ readonly name: "epoch";
127
+ }, {
128
+ readonly type: "uint256";
129
+ readonly name: "podId";
155
130
  }];
156
131
  readonly outputs: readonly [{
157
- readonly type: "address";
132
+ readonly type: "uint256";
158
133
  }];
159
134
  }, {
160
- readonly name: "vote";
135
+ readonly name: "hasPodOwnerClaimedEmissions";
161
136
  readonly type: "function";
162
- readonly stateMutability: "nonpayable";
137
+ readonly stateMutability: "view";
163
138
  readonly inputs: readonly [{
164
139
  readonly type: "uint256";
165
- readonly name: "podId";
140
+ readonly name: "epoch";
166
141
  }, {
167
142
  readonly type: "uint256";
168
- readonly name: "subnetId";
169
- }, {
143
+ readonly name: "podId";
144
+ }];
145
+ readonly outputs: readonly [{
170
146
  readonly type: "bool";
171
- readonly name: "like_";
172
147
  }];
173
- readonly outputs: readonly [];
174
148
  }, {
175
- readonly name: "claimPodOwnerEmissions";
149
+ readonly name: "hasUserClaimedEmissions";
176
150
  readonly type: "function";
177
- readonly stateMutability: "nonpayable";
151
+ readonly stateMutability: "view";
178
152
  readonly inputs: readonly [{
179
153
  readonly type: "uint256";
180
- readonly name: "podId";
154
+ readonly name: "epoch";
181
155
  }, {
182
156
  readonly type: "uint256";
183
- readonly name: "epoch";
157
+ readonly name: "podId";
158
+ }, {
159
+ readonly type: "address";
160
+ readonly name: "user";
161
+ }];
162
+ readonly outputs: readonly [{
163
+ readonly type: "bool";
184
164
  }];
185
- readonly outputs: readonly [];
186
165
  }, {
187
166
  readonly name: "Transfer";
188
167
  readonly type: "event";
@@ -1 +1 @@
1
- {"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUlC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAErB,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAErB,CAAC"}
@@ -1,29 +1,33 @@
1
1
  /**
2
- * Minimal ABIs for the Reppo contract surface the CLI touches. Mainnet
3
- * is the canonical PodManager (`mintPod(to, emissionShare)`); testnet
4
- * is a fork of mainnet with subnet/datanet logic added for a client
5
- * experiment (`mintPodWithREPPO(to, subnetId)` /
6
- * `mintPodWithPrimaryToken(to, subnetId)`). Same method family, different
7
- * parameters. Voting + ve-token + subnet access ABIs are shared.
2
+ * Minimal ABIs for the Reppo contract surface the CLI touches.
3
+ *
4
+ * As of PodManager V2 (mainnet impl 0x474d4f03... verified on basescan),
5
+ * mainnet and testnet share the same PodManager shape:
6
+ * `mintPodWithREPPO(to, subnetId)` / `mintPodWithPrimaryToken(to, subnetId)`
7
+ * for minting, and `vote(podId, votes, upVote)` for voting.
8
+ *
9
+ * The pre-V2 mainnet variant `mintPod(to, emissionSharePercent)` and the
10
+ * `publishingFee()` getter are gone — fee logic moved into SubnetManager
11
+ * (`getAccessFeeREPPO(subnetId)`).
12
+ *
13
+ * The vote selector is unchanged (`vote(uint256,uint256,bool)`) but the
14
+ * second argument's meaning shifted from `subnetId` to `votes` (the voting
15
+ * power to spend on the call). The CLI now requires `--votes <n>`.
8
16
  */
9
17
  import { parseAbi } from 'viem';
10
- export const POD_MANAGER_MAINNET_ABI = parseAbi([
11
- 'function mintPod(address to, uint8 emissionSharePercent) returns (uint256 podId)',
12
- 'function publishingFee() view returns (uint256)',
13
- 'function ownerOf(uint256 tokenId) view returns (address)',
14
- 'function vote(uint256 podId, uint256 subnetId, bool like_)',
15
- 'function claimPodOwnerEmissions(uint256 podId, uint256 epoch)',
16
- 'function getPodEmissionsOfEpoch(uint256 epoch, uint256 podId) view returns (uint256)',
17
- 'function hasPodOwnerClaimedEmissions(uint256 epoch, uint256 podId) view returns (bool)',
18
- 'function getEpochTotalVotes(uint256 epoch) view returns (uint256)',
19
- 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',
20
- ]);
21
- export const POD_MANAGER_TESTNET_ABI = parseAbi([
18
+ export const POD_MANAGER_ABI = parseAbi([
22
19
  'function mintPodWithREPPO(address to, uint256 subnetId) returns (uint256 podId)',
23
20
  'function mintPodWithPrimaryToken(address to, uint256 subnetId) returns (uint256 podId)',
24
- 'function ownerOf(uint256 tokenId) view returns (address)',
25
- 'function vote(uint256 podId, uint256 subnetId, bool like_)',
21
+ 'function vote(uint256 podId, uint256 votes, bool upVote)',
26
22
  'function claimPodOwnerEmissions(uint256 podId, uint256 epoch)',
23
+ 'function claimVoterEmissions(address voter, uint256 podId, uint256 epoch)',
24
+ 'function ownerOf(uint256 tokenId) view returns (address)',
25
+ 'function podValid(uint256 podId) view returns (bool)',
26
+ 'function getPodValidityEpoch(uint256 podId) view returns (uint256)',
27
+ 'function getPodUpVotesOfEpoch(uint256 epoch, uint256 podId) view returns (uint256)',
28
+ 'function getPodDownVotesOfEpoch(uint256 epoch, uint256 podId) view returns (uint256)',
29
+ 'function hasPodOwnerClaimedEmissions(uint256 epoch, uint256 podId) view returns (bool)',
30
+ 'function hasUserClaimedEmissions(uint256 epoch, uint256 podId, address user) view returns (bool)',
27
31
  'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',
28
32
  ]);
29
33
  export const SUBNET_MANAGER_ABI = parseAbi([
@@ -1 +1 @@
1
- {"version":3,"file":"abis.js","sourceRoot":"","sources":["../../src/chain/abis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC9C,kFAAkF;IAClF,iDAAiD;IACjD,0DAA0D;IAC1D,4DAA4D;IAC5D,+DAA+D;IAC/D,sFAAsF;IACtF,wFAAwF;IACxF,mEAAmE;IACnE,mFAAmF;CACpF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC9C,iFAAiF;IACjF,wFAAwF;IACxF,0DAA0D;IAC1D,4DAA4D;IAC5D,+DAA+D;IAC/D,mFAAmF;CACpF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACzC,iEAAiE;IACjE,kFAAkF;IAClF,4DAA4D;IAC5D,qEAAqE;CACtE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,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"}
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;CACtE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,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"}
@@ -1,26 +1,29 @@
1
1
  /**
2
2
  * Network-aware contract resolver. Returns `{ address, abi }` for each
3
3
  * contract so callers can't accidentally pair the wrong ABI with the
4
- * wrong address (the mainnet vs testnet PodManager param variant is the most common
5
- * footgun: mainnet uses `mintPod(to, share)` while testnet uses
6
- * `mintPodWithREPPO(to, subnetId)`).
4
+ * wrong address.
5
+ *
6
+ * As of PodManager V2 (CLI 0.3.0+), mainnet and testnet share the same
7
+ * PodManager ABI. The pre-V2 mainnet-specific `mintPod(to, share)` /
8
+ * `publishingFee()` shape is gone; both networks use
9
+ * `mintPodWithREPPO(to, subnetId)` and `vote(podId, votes, upVote)`.
7
10
  *
8
11
  * Throws via requireAddress() if the network's address is the TBD
9
12
  * placeholder — fails loud rather than silently calling 0x0.
10
13
  */
11
14
  import type { Address } from 'viem';
12
15
  import { type Network } from './addresses.js';
13
- import { POD_MANAGER_MAINNET_ABI, POD_MANAGER_TESTNET_ABI, SUBNET_MANAGER_ABI, VE_REPPO_ABI, ERC20_ABI } from './abis.js';
16
+ import { POD_MANAGER_ABI, SUBNET_MANAGER_ABI, VE_REPPO_ABI, ERC20_ABI } from './abis.js';
14
17
  export interface Contract<TAbi> {
15
18
  address: Address;
16
19
  abi: TAbi;
17
20
  }
18
- export declare function podManager(network: Network): Contract<typeof POD_MANAGER_MAINNET_ABI | typeof POD_MANAGER_TESTNET_ABI>;
21
+ export declare function podManager(network: Network): Contract<typeof POD_MANAGER_ABI>;
19
22
  export declare function subnetManager(network: Network): Contract<typeof SUBNET_MANAGER_ABI>;
20
23
  export declare function veReppo(network: Network): Contract<typeof VE_REPPO_ABI>;
21
24
  export declare function reppoToken(network: Network): Contract<typeof ERC20_ABI>;
22
25
  export declare function usdcToken(network: Network): Contract<typeof ERC20_ABI>;
23
- export declare function tryPodManager(network: Network): Contract<typeof POD_MANAGER_MAINNET_ABI | typeof POD_MANAGER_TESTNET_ABI> | null;
26
+ export declare function tryPodManager(network: Network): Contract<typeof POD_MANAGER_ABI> | null;
24
27
  export declare function trySubnetManager(network: Network): Contract<typeof SUBNET_MANAGER_ABI> | null;
25
28
  export declare function tryVeReppo(network: Network): Contract<typeof VE_REPPO_ABI> | null;
26
29
  export declare function tryReppoToken(network: Network): Contract<typeof ERC20_ABI> | null;
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/chain/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAgC,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,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,uBAAuB,GAAG,OAAO,uBAAuB,CAAC,CAMtH;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,uBAAuB,GAAG,OAAO,uBAAuB,CAAC,GAAG,IAAI,CAIlF;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,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,10 +1,10 @@
1
1
  import { getAddresses, requireAddress } from './addresses.js';
2
- import { POD_MANAGER_MAINNET_ABI, POD_MANAGER_TESTNET_ABI, SUBNET_MANAGER_ABI, VE_REPPO_ABI, ERC20_ABI, } from './abis.js';
2
+ import { POD_MANAGER_ABI, SUBNET_MANAGER_ABI, VE_REPPO_ABI, ERC20_ABI, } from './abis.js';
3
3
  export function podManager(network) {
4
4
  const addrs = getAddresses(network);
5
5
  return {
6
6
  address: requireAddress(addrs.podManager, 'PodManager'),
7
- abi: network === 'mainnet' ? POD_MANAGER_MAINNET_ABI : POD_MANAGER_TESTNET_ABI,
7
+ abi: POD_MANAGER_ABI,
8
8
  };
9
9
  }
10
10
  export function subnetManager(network) {
@@ -49,7 +49,7 @@ export function tryPodManager(network) {
49
49
  const a = tryAddress(getAddresses(network).podManager);
50
50
  if (!a)
51
51
  return null;
52
- return { address: a, abi: network === 'mainnet' ? POD_MANAGER_MAINNET_ABI : POD_MANAGER_TESTNET_ABI };
52
+ return { address: a, abi: POD_MANAGER_ABI };
53
53
  }
54
54
  export function trySubnetManager(network) {
55
55
  const a = tryAddress(getAddresses(network).subnetManager);
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/chain/errors.ts"],"names":[],"mappings":"AAaA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAoCvD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/chain/errors.ts"],"names":[],"mappings":"AAaA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiDD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAoCvD"}
@@ -19,11 +19,37 @@ const SELECTORS = {
19
19
  code: 'PUBLISHER_LACKS_SUBNET_ACCESS',
20
20
  hint: 'Grant subnet access to the publisher: `reppo grant-access --subnet <id>`.',
21
21
  },
22
- // Voter-vs-publisher revert observed but not yet name-matched. Keep
23
- // the raw selector here so the hint still helps even without the name.
24
22
  '0x11e43eec': {
25
- code: 'VOTE_REJECTED_PRECONDITION',
26
- hint: 'Vote was rejected by an unidentified precondition. Common causes: voter is the pod publisher (publishers cannot vote on their own pods), or the voting window has closed for that epoch.',
23
+ code: 'POD_NOT_VALID_FOR_EPOCH',
24
+ hint: 'Pod is not valid for the current voting epoch. Check `reppo query pod <id>` to verify validity; pod publishers may need to republish.',
25
+ },
26
+ '0x7ded0cc1': {
27
+ code: 'CANNOT_VOTE_FOR_OWN_POD',
28
+ hint: 'Publishers cannot vote on their own pods. Use a different voter EOA — set REPPO_VOTER_PRIVATE_KEY to a wallet that did not mint the pod.',
29
+ },
30
+ '0x48582090': {
31
+ code: 'VOTER_LACKS_SUBNET_ACCESS',
32
+ hint: 'Voter lacks subnet access. Run `reppo grant-access --datanet <subnetId>` first.',
33
+ },
34
+ '0x076bb706': {
35
+ code: 'INVALID_SUBNET',
36
+ hint: 'Subnet id does not exist on SubnetManager. Run `reppo list datanets` to find a valid id.',
37
+ },
38
+ '0x826fbca3': {
39
+ code: 'POD_NOT_FOUND',
40
+ hint: 'Pod id does not exist. Run `reppo query pod <id>` to verify.',
41
+ },
42
+ '0x2e9fe0d6': {
43
+ code: 'POD_DOES_NOT_EXIST',
44
+ hint: 'Pod id does not exist. Run `reppo query pod <id>` to verify.',
45
+ },
46
+ '0xcdad98fd': {
47
+ code: 'ZERO_VOTES',
48
+ hint: 'Vote amount cannot be zero. Pass `--votes <n>` with n >= 1.',
49
+ },
50
+ '0x82b42900': {
51
+ code: 'UNAUTHORIZED',
52
+ hint: 'Caller is not authorized for this action.',
27
53
  },
28
54
  '0xfb8f41b2': {
29
55
  code: 'INSUFFICIENT_ALLOWANCE',
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/chain/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,MAAM,CAAC;AAOhE,MAAM,SAAS,GAAiC;IAC9C,YAAY,EAAE;QACZ,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,uIAAuI;KAC9I;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,+BAA+B;QACrC,IAAI,EAAE,2EAA2E;KAClF;IACD,oEAAoE;IACpE,uEAAuE;IACvE,YAAY,EAAE;QACZ,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,0LAA0L;KACjM;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,wBAAwB;QAC9B,IAAI,EAAE,mJAAmJ;KAC1J;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAgB,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,GAAG,YAAY,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,6BAA6B,CAEnE,CAAC;IACT,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAEhE,uEAAuE;IACvE,sEAAsE;IACtE,+CAA+C;IAC/C,MAAM,IAAI,GAAI,QAAoF,CAAC,IAAI,CAAC;IACxG,MAAM,GAAG,GAAI,QAAqD,CAAC,SAAS,CAAC;IAC7E,MAAM,GAAG,GAAI,QAA+C,CAAC,GAAG,CAAC;IACjE,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ;YAC3E,IAAI,EAAE,QAAQ,CAAC,YAAY;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO;QACL,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,QAAQ,EAAE;QAC/F,IAAI,EAAE,QAAQ,CAAC,YAAY;KAC5B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/chain/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claim-emissions.d.ts","sourceRoot":"","sources":["../../src/commands/claim-emissions.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AASzC,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAgB,KAAK,aAAyB;IAE9C,OAAgB,KAAK,4BAUlB;IAEH,GAAG,SAA8C;IACjD,KAAK,SAAgD;IACrD,cAAc,qBAAsC;IACpD,MAAM,UAAsC;IAEtC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CA2KjC"}
1
+ {"version":3,"file":"claim-emissions.d.ts","sourceRoot":"","sources":["../../src/commands/claim-emissions.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AASzC,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAgB,KAAK,aAAyB;IAE9C,OAAgB,KAAK,4BAUlB;IAEH,GAAG,SAA8C;IACjD,KAAK,SAAgD;IACrD,cAAc,qBAAsC;IACpD,MAAM,UAAsC;IAEtC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAsJjC"}
@@ -2,18 +2,15 @@
2
2
  * `reppo claim-emissions --pod <id> --epoch <n>` — claim a pod's
3
3
  * emissions for a given epoch.
4
4
  *
5
- * Pre-flight (mainnet, full ABI):
5
+ * Pre-flight (V2, both networks):
6
6
  * 1. INVALID_POD_ID, INVALID_EPOCH (parse)
7
7
  * 2. NOT_POD_OWNER (ownerOf(podId) !== caller)
8
8
  * 3. ALREADY_CLAIMED (hasPodOwnerClaimedEmissions(epoch, podId) === true)
9
- * 4. NO_EMISSIONS_DUE (getPodEmissionsOfEpoch(epoch, podId) === 0)
10
9
  *
11
- * Pre-flight (testnet, partial ABI):
12
- * 1. INVALID_POD_ID, INVALID_EPOCH
13
- * 2. NOT_POD_OWNER
14
- * (testnet ABI doesn't include hasPodOwnerClaimedEmissions or
15
- * getPodEmissionsOfEpoch — caller bears the cost of a doomed
16
- * re-claim. Documented in usage.)
10
+ * PodManager V2 does not expose a per-pod "emissions due" view, so the
11
+ * legacy NO_EMISSIONS_DUE pre-flight is gone — if there's nothing to
12
+ * claim the contract reverts and the structured decoder surfaces the
13
+ * code.
17
14
  *
18
15
  * Two-phase write protocol via peekIdempotent.
19
16
  *
@@ -21,7 +18,6 @@
21
18
  * across different (podId, epoch) is rejected with IDEMPOTENCY_ARGS_MISMATCH.
22
19
  */
23
20
  import { Option } from 'clipanion';
24
- import { formatUnits } from 'viem';
25
21
  import { BaseCommand } from './_base.js';
26
22
  import { cliError, emit } from '../output/format.js';
27
23
  import { createClients, nextNonce } from '../chain/clients.js';
@@ -93,25 +89,15 @@ export class ClaimEmissionsCommand extends BaseCommand {
93
89
  if (owner.toLowerCase() !== clients.account.address.toLowerCase()) {
94
90
  throw cliError('NOT_POD_OWNER', `Pod ${podId} is owned by ${owner}, not by the configured signer ${clients.account.address}.`, 'Use the private key of the pod owner.');
95
91
  }
96
- // Mainnet-only pre-flight: claim status + amount due.
97
- // Testnet's PodManager ABI doesn't expose these views (the testnet fork is leaner).
98
- let amountDue = null;
99
- if (cfg.network === 'mainnet') {
100
- const [alreadyClaimed, due] = await Promise.all([
101
- clients.publicClient.readContract({
102
- address: pm.address, abi: pm.abi, functionName: 'hasPodOwnerClaimedEmissions', args: [epoch, podId],
103
- }),
104
- clients.publicClient.readContract({
105
- address: pm.address, abi: pm.abi, functionName: 'getPodEmissionsOfEpoch', args: [epoch, podId],
106
- }),
107
- ]);
108
- if (alreadyClaimed) {
109
- throw cliError('ALREADY_CLAIMED', `Pod ${podId} emissions for epoch ${epoch} have already been claimed.`, 'Nothing to do — pick a different epoch.');
110
- }
111
- if (due === 0n) {
112
- throw cliError('NO_EMISSIONS_DUE', `Pod ${podId} has no emissions due for epoch ${epoch}.`, 'Try a different epoch (e.g. one where the pod received votes).');
113
- }
114
- amountDue = due;
92
+ // Pre-flight: already-claimed check. PodManager V2 does not
93
+ // expose a per-pod "emissions due" view, so we no longer pre-
94
+ // flight NO_EMISSIONS_DUE — the contract reverts cleanly if
95
+ // there's nothing to claim and the decoder surfaces the code.
96
+ const alreadyClaimed = await clients.publicClient.readContract({
97
+ address: pm.address, abi: pm.abi, functionName: 'hasPodOwnerClaimedEmissions', args: [epoch, podId],
98
+ });
99
+ if (alreadyClaimed) {
100
+ throw cliError('ALREADY_CLAIMED', `Pod ${podId} emissions for epoch ${epoch} have already been claimed.`, 'Nothing to do — pick a different epoch.');
115
101
  }
116
102
  if (this.dryRun) {
117
103
  const sim = await clients.publicClient.simulateContract({
@@ -126,9 +112,7 @@ export class ClaimEmissionsCommand extends BaseCommand {
126
112
  podId: podId.toString(),
127
113
  epoch: epoch.toString(),
128
114
  owner,
129
- ...(amountDue !== null
130
- ? { amountDue: { raw: amountDue.toString(), formatted: formatUnits(amountDue, 18) } }
131
- : { amountDue: { unavailable: 'testnet ABI does not expose getPodEmissionsOfEpoch' } }),
115
+ amountDue: { unavailable: 'PodManager V2 does not expose a per-pod emissions-due view' },
132
116
  gas: sim.request.gas?.toString() ?? null,
133
117
  });
134
118
  return 0;
@@ -163,9 +147,7 @@ export class ClaimEmissionsCommand extends BaseCommand {
163
147
  txHash: tx,
164
148
  podId: podId.toString(),
165
149
  epoch: epoch.toString(),
166
- ...(amountDue !== null
167
- ? { amountClaimed: { raw: amountDue.toString(), formatted: formatUnits(amountDue, 18) } }
168
- : { amountClaimed: { unavailable: 'testnet ABI does not expose getPodEmissionsOfEpoch' } }),
150
+ amountClaimed: { unavailable: 'PodManager V2 does not expose a per-pod emissions-due view' },
169
151
  block: receipt.blockNumber.toString(),
170
152
  basescanUrl: cfg.network === 'mainnet'
171
153
  ? `https://basescan.org/tx/${tx}`
@@ -173,12 +155,9 @@ export class ClaimEmissionsCommand extends BaseCommand {
173
155
  };
174
156
  if (this.idempotencyKey)
175
157
  await markConfirmed(this.idempotencyKey, COMMAND, args, result, tx);
176
- const amountStr = amountDue !== null
177
- ? `${formatUnits(amountDue, 18)} REPPO`
178
- : '(amount unknown — testnet)';
179
158
  emit(result, [
180
159
  `✓ Claimed pod ${podId} emissions for epoch ${epoch}`,
181
- ` amount: ${amountStr}`,
160
+ ` amount: (unknown — V2 has no per-pod emissions-due view)`,
182
161
  ` tx: ${result.basescanUrl}`,
183
162
  ` block: ${receipt.blockNumber}`,
184
163
  ]);