@@ -3,6 +3,7 @@ package contracts
33import (
44 "context"
55 "errors"
6+ "math"
67 "math/big"
78 "testing"
89 "time"
@@ -26,6 +27,7 @@ const (
2627
2728var (
2829 zkGameAddr = common.Address {0x45 , 0x44 , 0x43 }
30+ zkWethAddr = common.Address {0x57 , 0x45 , 0x54 , 0x48 }
2931)
3032
3133var zkVersions = []contractVersion {
@@ -156,6 +158,141 @@ func TestZKGetAnchorStateRegistryAtPinnedBlock(t *testing.T) {
156158 }
157159}
158160
161+ func TestZKGetBondMetadataAtPinnedBlock (t * testing.T ) {
162+ for _ , version := range zkVersions {
163+ t .Run (version .String (), func (t * testing.T ) {
164+ stubRpc , contract := setupZKDisputeGameTest (t , version )
165+ block := rpcblock .ByHash (common.Hash {0x91 })
166+ expected := ZKBondMetadata {
167+ GameCreator : common.Address {0x01 },
168+ TotalBonds : big .NewInt (23 ),
169+ ChallengerBond : big .NewInt (7 ),
170+ }
171+ stubRpc .SetResponse (zkGameAddr , methodGameCreator , block , nil , []interface {}{expected .GameCreator })
172+ stubRpc .SetResponse (zkGameAddr , methodTotalBonds , block , nil , []interface {}{expected .TotalBonds })
173+ stubRpc .SetResponse (zkGameAddr , methodChallengerBond , block , nil , []interface {}{expected .ChallengerBond })
174+
175+ actual , err := contract .GetBondMetadata (t .Context (), block )
176+ require .NoError (t , err )
177+ require .Equal (t , expected , actual )
178+ })
179+ }
180+ }
181+
182+ func TestZKGetCreditsAtPinnedBlock (t * testing.T ) {
183+ for _ , version := range zkVersions {
184+ t .Run (version .String (), func (t * testing.T ) {
185+ stubRpc , contract := setupZKDisputeGameTest (t , version )
186+ block := rpcblock .ByNumber (492 )
187+ recipients := []common.Address {{0x01 }, {0x02 }, {0x03 }}
188+ expected := []* big.Int {big .NewInt (3 ), big .NewInt (5 ), big .NewInt (8 )}
189+ for i , recipient := range recipients {
190+ stubRpc .SetResponse (zkGameAddr , methodCredit , block , []interface {}{recipient }, []interface {}{expected [i ]})
191+ }
192+
193+ actual , err := contract .GetCredits (t .Context (), block , recipients ... )
194+ require .NoError (t , err )
195+ require .Equal (t , expected , actual )
196+
197+ empty , err := contract .GetCredits (t .Context (), block )
198+ require .NoError (t , err )
199+ require .Empty (t , empty )
200+ require .NotNil (t , empty )
201+ })
202+ }
203+ }
204+
205+ func TestZKGetWithdrawalsAtPinnedBlock (t * testing.T ) {
206+ for _ , version := range zkVersions {
207+ t .Run (version .String (), func (t * testing.T ) {
208+ stubRpc , contract := setupZKDisputeGameTest (t , version )
209+ stubRpc .AddContract (zkWethAddr , snapshots .LoadDelayedWETHABI ())
210+ block := rpcblock .ByHash (common.Hash {0x92 })
211+ recipients := []common.Address {{0x01 }, {0x02 }}
212+ expected := []* WithdrawalRequest {
213+ {Amount : big .NewInt (11 ), Timestamp : big .NewInt (101 )},
214+ {Amount : big .NewInt (13 ), Timestamp : big .NewInt (103 )},
215+ }
216+ stubRpc .SetResponse (zkGameAddr , methodWETH , block , nil , []interface {}{zkWethAddr })
217+ for i , recipient := range recipients {
218+ stubRpc .SetResponse (zkWethAddr , methodWithdrawals , block , []interface {}{zkGameAddr , recipient }, []interface {}{expected [i ].Amount , expected [i ].Timestamp })
219+ }
220+
221+ actual , err := contract .GetWithdrawals (t .Context (), block , recipients ... )
222+ require .NoError (t , err )
223+ require .Equal (t , expected , actual )
224+
225+ _ , emptyContract := setupZKDisputeGameTest (t , version )
226+ empty , err := emptyContract .GetWithdrawals (t .Context (), block )
227+ require .NoError (t , err )
228+ require .Empty (t , empty )
229+ require .NotNil (t , empty )
230+ })
231+ }
232+ }
233+
234+ func TestZKGetBalanceAndDelayAtPinnedBlock (t * testing.T ) {
235+ for _ , version := range zkVersions {
236+ t .Run (version .String (), func (t * testing.T ) {
237+ stubRpc , contract := setupZKDisputeGameTest (t , version )
238+ stubRpc .AddContract (zkWethAddr , snapshots .LoadDelayedWETHABI ())
239+ block := rpcblock .ByNumber (493 )
240+ balance := big .NewInt (144 )
241+ delaySeconds := int64 (77 )
242+ stubRpc .SetResponse (zkGameAddr , methodWETH , block , nil , []interface {}{zkWethAddr })
243+ stubRpc .AddExpectedCall (batchingTest .NewGetBalanceCall (zkWethAddr , block , balance ))
244+ stubRpc .SetResponse (zkWethAddr , methodDelay , block , nil , []interface {}{big .NewInt (delaySeconds )})
245+
246+ actualBalance , actualDelay , actualAddr , err := contract .GetBalanceAndDelay (t .Context (), block )
247+ require .NoError (t , err )
248+ require .Equal (t , balance , actualBalance )
249+ require .Equal (t , time .Duration (delaySeconds )* time .Second , actualDelay )
250+ require .Equal (t , zkWethAddr , actualAddr )
251+ })
252+ }
253+ }
254+
255+ func TestZKGetBalanceAndDelayRejectsDurationOverflow (t * testing.T ) {
256+ for _ , version := range zkVersions {
257+ t .Run (version .String (), func (t * testing.T ) {
258+ stubRpc , contract := setupZKDisputeGameTest (t , version )
259+ stubRpc .AddContract (zkWethAddr , snapshots .LoadDelayedWETHABI ())
260+ block := rpcblock .ByNumber (493 )
261+ tooManySeconds := big .NewInt (math .MaxInt64 / int64 (time .Second ) + 1 )
262+ stubRpc .SetResponse (zkGameAddr , methodWETH , block , nil , []interface {}{zkWethAddr })
263+ stubRpc .AddExpectedCall (batchingTest .NewGetBalanceCall (zkWethAddr , block , big .NewInt (144 )))
264+ stubRpc .SetResponse (zkWethAddr , methodDelay , block , nil , []interface {}{tooManySeconds })
265+
266+ _ , _ , _ , err := contract .GetBalanceAndDelay (t .Context (), block )
267+ require .ErrorContains (t , err , "withdrawal delay too big for time.Duration" )
268+ })
269+ }
270+ }
271+
272+ func TestZKGetBalanceAndDelayAcceptsMaxDuration (t * testing.T ) {
273+ for _ , version := range zkVersions {
274+ t .Run (version .String (), func (t * testing.T ) {
275+ stubRpc , contract := setupZKDisputeGameTest (t , version )
276+ stubRpc .AddContract (zkWethAddr , snapshots .LoadDelayedWETHABI ())
277+ block := rpcblock .ByNumber (493 )
278+ maxSeconds := int64 (math .MaxInt64 / int64 (time .Second ))
279+ stubRpc .SetResponse (zkGameAddr , methodWETH , block , nil , []interface {}{zkWethAddr })
280+ stubRpc .AddExpectedCall (batchingTest .NewGetBalanceCall (zkWethAddr , block , big .NewInt (144 )))
281+ stubRpc .SetResponse (zkWethAddr , methodDelay , block , nil , []interface {}{big .NewInt (maxSeconds )})
282+
283+ _ , actualDelay , _ , err := contract .GetBalanceAndDelay (t .Context (), block )
284+ require .NoError (t , err )
285+ require .Equal (t , time .Duration (maxSeconds )* time .Second , actualDelay )
286+ })
287+ }
288+ }
289+
290+ func TestValidateResultCount (t * testing.T ) {
291+ require .NoError (t , validateResultCount (2 , 2 ))
292+ require .ErrorContains (t , validateResultCount (2 , 1 ), "expected 2 results but got 1" )
293+ require .ErrorContains (t , validateResultCount (2 , 3 ), "expected 2 results but got 3" )
294+ }
295+
159296func TestZKGetGameRange (t * testing.T ) {
160297 for _ , version := range zkVersions {
161298 version := version
0 commit comments