Skip to content

Commit 1c3ef34

Browse files
committed
Update retrieve checker contract address and add tests for dispute handling
1 parent cf9018a commit 1c3ef34

File tree

3 files changed

+105
-1
lines changed

3 files changed

+105
-1
lines changed

lib/constants.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export const MAX_JITTER_BETWEEN_TASKS_IN_MS = 10_000 // 10 seconds
55
export const RPC_URL = 'https://api.calibration.node.glif.io/'
66
export const RPC_AUTH = 'KZLIUb9ejreYOm-mZFM3UNADE0ux6CrHjxnS2D2Qgb8='
77
export const MINER_TO_PEERID_CONTRACT_ADDRESS = '0x14183aD016Ddc83D638425D6328009aa390339Ce' // Contract address on the Filecoin EVM
8-
export const RETRIEVE_CHECKER_CONTRACT_ADDRESS = '0x917d506cd99c80230d2db53d096491a41d92300e' // Replace with actual address
8+
export const RETRIEVE_CHECKER_CONTRACT_ADDRESS = '0xD708573EdaeF9B2C4ce5242742bff99C0C3d7298' // Replace with actual address
99
export const MAX_REQUEST_DURATION_MS = 90_000

test.js

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import './test/http-assertions.test.js'
22
import './test/ipni-client.test.js'
33
import './test/miner-info.test.js'
44
import './test/multiaddr.test.js'
5+
import './test/retrieve-checker-client.test.js'
56

67
import './test/integration.js'
78
import './test/spark.js'

test/retrieve-checker-client.test.js

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import { test } from 'zinnia:test'
2+
import { assertEquals, assertRejects } from 'zinnia:assert'
3+
import { getPendingDisputes, submitDisputeResult } from '../lib/retrieve-checker-client.js'
4+
// dummy tests as of now
5+
// Mock environment and contract for testing
6+
const TEST_PRIVATE_KEY = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'
7+
8+
// Ensure private key is available in test environment
9+
Deno.env.set('CHECKER_PRIVATE_KEY', TEST_PRIVATE_KEY)
10+
11+
// Mock contract factory for testing
12+
function createMockContract(mockDisputes = {}) {
13+
return {
14+
getDisputesByStatus: async (status) => {
15+
return mockDisputes.ids || []
16+
},
17+
getDisputeDetails: async (id) => {
18+
const dispute = mockDisputes[id]
19+
if (!dispute) {
20+
throw new Error(`Dispute ID ${id} not found`)
21+
}
22+
return dispute
23+
},
24+
resolveDispute: async (disputeId, newStatus) => {
25+
mockDisputes.resolvedDisputes = mockDisputes.resolvedDisputes || []
26+
mockDisputes.resolvedDisputes.push({ disputeId, newStatus })
27+
// Return mock transaction and receipt for ethers compatibility
28+
return {
29+
hash: '0xmocktxhash',
30+
wait: async () => ({ blockNumber: 12345 })
31+
}
32+
}
33+
}
34+
}
35+
36+
test('getPendingDisputes returns empty array when no pending disputes exist', async () => {
37+
const mockContract = createMockContract()
38+
const result = await getPendingDisputes({ smartContract: mockContract })
39+
assertEquals(result, [])
40+
})
41+
42+
test('getPendingDisputes returns array of pending disputes', async () => {
43+
const mockDisputes = {
44+
ids: [1, 2],
45+
1: {
46+
disputeId: 1,
47+
cid: '0x' + Buffer.from('QmTest1').toString('hex'),
48+
spActorId: 12345
49+
},
50+
2: {
51+
disputeId: 2,
52+
cid: '0x' + Buffer.from('QmTest2').toString('hex'),
53+
spActorId: 67890
54+
}
55+
}
56+
const mockContract = createMockContract(mockDisputes)
57+
58+
const result = await getPendingDisputes({ smartContract: mockContract })
59+
assertEquals(result, [
60+
{ id: '1', cid: 'QmTest1', minerId: 'f012345' },
61+
{ id: '2', cid: 'QmTest2', minerId: 'f067890' }
62+
])
63+
})
64+
65+
test('submitDisputeResult resolves dispute with correct status for successful retrieval', async () => {
66+
const mockDisputes = { resolvedDisputes: [] }
67+
const mockContract = createMockContract(mockDisputes)
68+
69+
await submitDisputeResult(1, { statusCode: 200 }, { smartContract: mockContract })
70+
assertEquals(mockDisputes.resolvedDisputes, [
71+
{ disputeId: 1, newStatus: 2 } // DisputeStatus.Resolved
72+
])
73+
})
74+
75+
test('submitDisputeResult resolves dispute with failed status for timeout', async () => {
76+
const mockDisputes = { resolvedDisputes: [] }
77+
const mockContract = createMockContract(mockDisputes)
78+
79+
await submitDisputeResult(1, { statusCode: 200, timeout: true }, { smartContract: mockContract })
80+
assertEquals(mockDisputes.resolvedDisputes, [
81+
{ disputeId: 1, newStatus: 3 } // DisputeStatus.Failed
82+
])
83+
})
84+
85+
test('submitDisputeResult resolves dispute with failed status for error response', async () => {
86+
const mockDisputes = { resolvedDisputes: [] }
87+
const mockContract = createMockContract(mockDisputes)
88+
89+
await submitDisputeResult(1, { statusCode: 404 }, { smartContract: mockContract })
90+
assertEquals(mockDisputes.resolvedDisputes, [
91+
{ disputeId: 1, newStatus: 3 } // DisputeStatus.Failed
92+
])
93+
})
94+
95+
test('submitDisputeResult resolves dispute with rejected status for invalid check', async () => {
96+
const mockDisputes = { resolvedDisputes: [] }
97+
const mockContract = createMockContract(mockDisputes)
98+
99+
await submitDisputeResult(1, { statusCode: 302 }, { smartContract: mockContract })
100+
assertEquals(mockDisputes.resolvedDisputes, [
101+
{ disputeId: 1, newStatus: 4 } // DisputeStatus.Rejected
102+
])
103+
})

0 commit comments

Comments
 (0)