@jinn-network/client 0.1.0-canary.adfd078d
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/LICENSE +21 -0
- package/README.md +162 -0
- package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
- package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
- package/dist/adapters/adapter.d.ts +11 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/local/adapter.d.ts +20 -0
- package/dist/adapters/local/adapter.js +146 -0
- package/dist/adapters/local/adapter.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +29 -0
- package/dist/adapters/mech/adapter.js +332 -0
- package/dist/adapters/mech/adapter.js.map +1 -0
- package/dist/adapters/mech/claim-policy.d.ts +40 -0
- package/dist/adapters/mech/claim-policy.js +104 -0
- package/dist/adapters/mech/claim-policy.js.map +1 -0
- package/dist/adapters/mech/contracts.d.ts +44 -0
- package/dist/adapters/mech/contracts.js +323 -0
- package/dist/adapters/mech/contracts.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +43 -0
- package/dist/adapters/mech/ipfs.js +142 -0
- package/dist/adapters/mech/ipfs.js.map +1 -0
- package/dist/adapters/mech/safe.d.ts +15 -0
- package/dist/adapters/mech/safe.js +113 -0
- package/dist/adapters/mech/safe.js.map +1 -0
- package/dist/adapters/mech/types.d.ts +561 -0
- package/dist/adapters/mech/types.js +340 -0
- package/dist/adapters/mech/types.js.map +1 -0
- package/dist/api/balance-build.d.ts +22 -0
- package/dist/api/balance-build.js +37 -0
- package/dist/api/balance-build.js.map +1 -0
- package/dist/api/fleet-build.d.ts +62 -0
- package/dist/api/fleet-build.js +91 -0
- package/dist/api/fleet-build.js.map +1 -0
- package/dist/api/gather-status.d.ts +20 -0
- package/dist/api/gather-status.js +137 -0
- package/dist/api/gather-status.js.map +1 -0
- package/dist/api/history-build.d.ts +32 -0
- package/dist/api/history-build.js +48 -0
- package/dist/api/history-build.js.map +1 -0
- package/dist/api/peers.d.ts +27 -0
- package/dist/api/peers.js +94 -0
- package/dist/api/peers.js.map +1 -0
- package/dist/api/rewards-build.d.ts +20 -0
- package/dist/api/rewards-build.js +42 -0
- package/dist/api/rewards-build.js.map +1 -0
- package/dist/api/server.d.ts +34 -0
- package/dist/api/server.js +130 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/status-build.d.ts +92 -0
- package/dist/api/status-build.js +175 -0
- package/dist/api/status-build.js.map +1 -0
- package/dist/api/status-rollup-build.d.ts +36 -0
- package/dist/api/status-rollup-build.js +69 -0
- package/dist/api/status-rollup-build.js.map +1 -0
- package/dist/auth/erc8128.d.ts +43 -0
- package/dist/auth/erc8128.js +88 -0
- package/dist/auth/erc8128.js.map +1 -0
- package/dist/bin/jinn.d.ts +11 -0
- package/dist/bin/jinn.js +20 -0
- package/dist/bin/jinn.js.map +1 -0
- package/dist/build-meta.json +3 -0
- package/dist/chain-read-errors.d.ts +9 -0
- package/dist/chain-read-errors.js +43 -0
- package/dist/chain-read-errors.js.map +1 -0
- package/dist/cli/action.d.ts +26 -0
- package/dist/cli/action.js +56 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/command.d.ts +62 -0
- package/dist/cli/command.js +29 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.js +46 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.js +165 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/claim-rewards.d.ts +3 -0
- package/dist/cli/commands/claim-rewards.js +121 -0
- package/dist/cli/commands/claim-rewards.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +151 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fleet-scale.d.ts +3 -0
- package/dist/cli/commands/fleet-scale.js +449 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +3 -0
- package/dist/cli/commands/fleet.js +45 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/fund-requirements.d.ts +3 -0
- package/dist/cli/commands/fund-requirements.js +139 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +61 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/keys-backup.d.ts +3 -0
- package/dist/cli/commands/keys-backup.js +107 -0
- package/dist/cli/commands/keys-backup.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.js +69 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +3 -0
- package/dist/cli/commands/rewards.js +54 -0
- package/dist/cli/commands/rewards.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.js +96 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +82 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/submit-intent.d.ts +3 -0
- package/dist/cli/commands/submit-intent.js +169 -0
- package/dist/cli/commands/submit-intent.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.js +114 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/withdraw.d.ts +3 -0
- package/dist/cli/commands/withdraw.js +181 -0
- package/dist/cli/commands/withdraw.js.map +1 -0
- package/dist/cli/deployment-digest.d.ts +10 -0
- package/dist/cli/deployment-digest.js +25 -0
- package/dist/cli/deployment-digest.js.map +1 -0
- package/dist/cli/execution-context.d.ts +50 -0
- package/dist/cli/execution-context.js +154 -0
- package/dist/cli/execution-context.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +37 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +132 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection-context.d.ts +10 -0
- package/dist/cli/introspection-context.js +60 -0
- package/dist/cli/introspection-context.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.js +35 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/password.d.ts +12 -0
- package/dist/cli/password.js +51 -0
- package/dist/cli/password.js.map +1 -0
- package/dist/config.d.ts +174 -0
- package/dist/config.js +252 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/creator.d.ts +24 -0
- package/dist/daemon/creator.js +80 -0
- package/dist/daemon/creator.js.map +1 -0
- package/dist/daemon/daemon.d.ts +60 -0
- package/dist/daemon/daemon.js +158 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/delivery-watcher.d.ts +10 -0
- package/dist/daemon/delivery-watcher.js +37 -0
- package/dist/daemon/delivery-watcher.js.map +1 -0
- package/dist/daemon/restorer.d.ts +19 -0
- package/dist/daemon/restorer.js +82 -0
- package/dist/daemon/restorer.js.map +1 -0
- package/dist/daemon/reward-claim-loop.d.ts +38 -0
- package/dist/daemon/reward-claim-loop.js +48 -0
- package/dist/daemon/reward-claim-loop.js.map +1 -0
- package/dist/discovery/registry.d.ts +43 -0
- package/dist/discovery/registry.js +104 -0
- package/dist/discovery/registry.js.map +1 -0
- package/dist/discovery/subgraph.d.ts +37 -0
- package/dist/discovery/subgraph.js +87 -0
- package/dist/discovery/subgraph.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +79 -0
- package/dist/earning/bootstrap.js +989 -0
- package/dist/earning/bootstrap.js.map +1 -0
- package/dist/earning/contracts.d.ts +431 -0
- package/dist/earning/contracts.js +518 -0
- package/dist/earning/contracts.js.map +1 -0
- package/dist/earning/evidence-simhash.d.ts +59 -0
- package/dist/earning/evidence-simhash.js +87 -0
- package/dist/earning/evidence-simhash.js.map +1 -0
- package/dist/earning/fleet-display-index.d.ts +8 -0
- package/dist/earning/fleet-display-index.js +12 -0
- package/dist/earning/fleet-display-index.js.map +1 -0
- package/dist/earning/fleet-retire.d.ts +28 -0
- package/dist/earning/fleet-retire.js +75 -0
- package/dist/earning/fleet-retire.js.map +1 -0
- package/dist/earning/jinn-rewards.d.ts +62 -0
- package/dist/earning/jinn-rewards.js +81 -0
- package/dist/earning/jinn-rewards.js.map +1 -0
- package/dist/earning/next-service-index.d.ts +4 -0
- package/dist/earning/next-service-index.js +7 -0
- package/dist/earning/next-service-index.js.map +1 -0
- package/dist/earning/orphan-sweep.d.ts +33 -0
- package/dist/earning/orphan-sweep.js +157 -0
- package/dist/earning/orphan-sweep.js.map +1 -0
- package/dist/earning/reconcile.d.ts +37 -0
- package/dist/earning/reconcile.js +216 -0
- package/dist/earning/reconcile.js.map +1 -0
- package/dist/earning/safe-adapter.d.ts +70 -0
- package/dist/earning/safe-adapter.js +228 -0
- package/dist/earning/safe-adapter.js.map +1 -0
- package/dist/earning/stolas-claim.d.ts +47 -0
- package/dist/earning/stolas-claim.js +115 -0
- package/dist/earning/stolas-claim.js.map +1 -0
- package/dist/earning/store.d.ts +36 -0
- package/dist/earning/store.js +156 -0
- package/dist/earning/store.js.map +1 -0
- package/dist/earning/types.d.ts +123 -0
- package/dist/earning/types.js +64 -0
- package/dist/earning/types.js.map +1 -0
- package/dist/earning/viem-clients.d.ts +9 -0
- package/dist/earning/viem-clients.js +22 -0
- package/dist/earning/viem-clients.js.map +1 -0
- package/dist/earning/wallet.d.ts +20 -0
- package/dist/earning/wallet.js +103 -0
- package/dist/earning/wallet.js.map +1 -0
- package/dist/errors/envelope.d.ts +41 -0
- package/dist/errors/envelope.js +48 -0
- package/dist/errors/envelope.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +281 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.js +205 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/operator-errors.d.ts +16 -0
- package/dist/operator-errors.js +88 -0
- package/dist/operator-errors.js.map +1 -0
- package/dist/preflight/claude-binary.d.ts +19 -0
- package/dist/preflight/claude-binary.js +44 -0
- package/dist/preflight/claude-binary.js.map +1 -0
- package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
- package/dist/preflight/claude-invocation-envelope.js +67 -0
- package/dist/preflight/claude-invocation-envelope.js.map +1 -0
- package/dist/runner/claude.d.ts +15 -0
- package/dist/runner/claude.js +193 -0
- package/dist/runner/claude.js.map +1 -0
- package/dist/runner/runner.d.ts +11 -0
- package/dist/runner/runner.js +2 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/simple.d.ts +8 -0
- package/dist/runner/simple.js +11 -0
- package/dist/runner/simple.js.map +1 -0
- package/dist/store/store.d.ts +74 -0
- package/dist/store/store.js +173 -0
- package/dist/store/store.js.map +1 -0
- package/dist/tx-retry.d.ts +55 -0
- package/dist/tx-retry.js +214 -0
- package/dist/tx-retry.js.map +1 -0
- package/dist/types/desired-state.d.ts +41 -0
- package/dist/types/desired-state.js +16 -0
- package/dist/types/desired-state.js.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.js +17 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/withdraw/args.d.ts +29 -0
- package/dist/withdraw/args.js +198 -0
- package/dist/withdraw/args.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
- package/dist/withdraw/run-withdraw-plan.js +257 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -0
- package/dist/x402/acquire.d.ts +6 -0
- package/dist/x402/acquire.js +32 -0
- package/dist/x402/acquire.js.map +1 -0
- package/dist/x402/facilitator.d.ts +11 -0
- package/dist/x402/facilitator.js +52 -0
- package/dist/x402/facilitator.js.map +1 -0
- package/dist/x402/handler.d.ts +15 -0
- package/dist/x402/handler.js +40 -0
- package/dist/x402/handler.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { encodeFunctionData, decodeEventLog, } from 'viem';
|
|
2
|
+
import { MECH_MARKETPLACE_ABI, MECH_ABI, JINN_ROUTER_ABI, JINN_ROUTER_CLAIM_DELIVERY_V1_ABI, JINN_ROUTER_CLAIM_DELIVERY_V2_ABI, CLAIM_REGISTRY_ABI, NATIVE_PAYMENT_TYPE, } from './types.js';
|
|
3
|
+
import { executeSafeTransaction } from './safe.js';
|
|
4
|
+
import { isRecoverableTransactionError, waitForTransactionReceiptWithRetry, backoffDelay, } from '../../tx-retry.js';
|
|
5
|
+
export async function submitRestorationJob(publicClient, walletClient, safeAddress, routerAddress, mechAddress, requestDataHex, priceWei, responseTimeout) {
|
|
6
|
+
const calldata = encodeFunctionData({
|
|
7
|
+
abi: JINN_ROUTER_ABI,
|
|
8
|
+
functionName: 'createRestorationJob',
|
|
9
|
+
args: [requestDataHex, mechAddress, priceWei, responseTimeout, NATIVE_PAYMENT_TYPE, '0x'],
|
|
10
|
+
});
|
|
11
|
+
const txHash = await executeSafeTransaction(publicClient, walletClient, {
|
|
12
|
+
safeAddress,
|
|
13
|
+
to: routerAddress,
|
|
14
|
+
value: priceWei,
|
|
15
|
+
data: calldata,
|
|
16
|
+
});
|
|
17
|
+
const receipt = await waitForTransactionReceiptWithRetry(publicClient, txHash, {
|
|
18
|
+
onRetry: ({ attempt, message }) => {
|
|
19
|
+
console.error(`[router] wait restoration receipt retry ${attempt}: ${message}`);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
const requestIds = [];
|
|
23
|
+
for (const log of receipt.logs) {
|
|
24
|
+
try {
|
|
25
|
+
const decoded = decodeEventLog({
|
|
26
|
+
abi: JINN_ROUTER_ABI,
|
|
27
|
+
data: log.data,
|
|
28
|
+
topics: log.topics,
|
|
29
|
+
});
|
|
30
|
+
if (decoded.eventName === 'RestorationJobCreated') {
|
|
31
|
+
const args = decoded.args;
|
|
32
|
+
requestIds.push(String(args.requestId));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Not our event
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return requestIds;
|
|
40
|
+
}
|
|
41
|
+
export async function submitEvaluationJob(publicClient, walletClient, safeAddress, routerAddress, restorationRequestId, mechAddress, requestDataHex, priceWei, responseTimeout) {
|
|
42
|
+
const calldata = encodeFunctionData({
|
|
43
|
+
abi: JINN_ROUTER_ABI,
|
|
44
|
+
functionName: 'createEvaluationJob',
|
|
45
|
+
args: [restorationRequestId, requestDataHex, mechAddress, priceWei, responseTimeout, NATIVE_PAYMENT_TYPE, '0x'],
|
|
46
|
+
});
|
|
47
|
+
const txHash = await executeSafeTransaction(publicClient, walletClient, {
|
|
48
|
+
safeAddress,
|
|
49
|
+
to: routerAddress,
|
|
50
|
+
value: priceWei,
|
|
51
|
+
data: calldata,
|
|
52
|
+
});
|
|
53
|
+
const receipt = await waitForTransactionReceiptWithRetry(publicClient, txHash, {
|
|
54
|
+
onRetry: ({ attempt, message }) => {
|
|
55
|
+
console.error(`[router] wait evaluation receipt retry ${attempt}: ${message}`);
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
const requestIds = [];
|
|
59
|
+
for (const log of receipt.logs) {
|
|
60
|
+
try {
|
|
61
|
+
const decoded = decodeEventLog({
|
|
62
|
+
abi: JINN_ROUTER_ABI,
|
|
63
|
+
data: log.data,
|
|
64
|
+
topics: log.topics,
|
|
65
|
+
});
|
|
66
|
+
if (decoded.eventName === 'EvaluationJobCreated') {
|
|
67
|
+
const args = decoded.args;
|
|
68
|
+
requestIds.push(String(args.requestId));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Not our event
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return requestIds;
|
|
76
|
+
}
|
|
77
|
+
const CLAIM_RETRY_ATTEMPTS = 6;
|
|
78
|
+
const CLAIM_RETRY_DELAY_MS = 2000;
|
|
79
|
+
const ZERO_EVIDENCE = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
80
|
+
export async function claimDelivery(publicClient, walletClient, safeAddress, routerAddress, requestId, options) {
|
|
81
|
+
const calldata = options.variant === 'v2'
|
|
82
|
+
? encodeFunctionData({
|
|
83
|
+
abi: JINN_ROUTER_CLAIM_DELIVERY_V2_ABI,
|
|
84
|
+
functionName: 'claimDelivery',
|
|
85
|
+
args: [requestId, options.evidenceHash ?? ZERO_EVIDENCE],
|
|
86
|
+
})
|
|
87
|
+
: encodeFunctionData({
|
|
88
|
+
abi: JINN_ROUTER_CLAIM_DELIVERY_V1_ABI,
|
|
89
|
+
functionName: 'claimDelivery',
|
|
90
|
+
args: [requestId],
|
|
91
|
+
});
|
|
92
|
+
for (let attempt = 1; attempt <= CLAIM_RETRY_ATTEMPTS; attempt++) {
|
|
93
|
+
try {
|
|
94
|
+
return await executeSafeTransaction(publicClient, walletClient, {
|
|
95
|
+
safeAddress,
|
|
96
|
+
to: routerAddress,
|
|
97
|
+
value: 0n,
|
|
98
|
+
data: calldata,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
103
|
+
// AlreadyClaimed — idempotent, treat as success
|
|
104
|
+
if (message.includes('AlreadyClaimed')) {
|
|
105
|
+
console.error(`[router] claimDelivery: already claimed ${requestId}`);
|
|
106
|
+
return '0x';
|
|
107
|
+
}
|
|
108
|
+
// RequestNotFound — not a router request, skip entirely
|
|
109
|
+
if (message.includes('RequestNotFound')) {
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
// NotDelivered — marketplace state may not have settled yet, retry
|
|
113
|
+
if (message.includes('NotDelivered') && attempt < CLAIM_RETRY_ATTEMPTS) {
|
|
114
|
+
console.error(`[router] claimDelivery: not yet delivered, retry ${attempt}/${CLAIM_RETRY_ATTEMPTS}`);
|
|
115
|
+
await new Promise(r => setTimeout(r, CLAIM_RETRY_DELAY_MS));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (isRecoverableTransactionError(err) && attempt < CLAIM_RETRY_ATTEMPTS) {
|
|
119
|
+
console.error(`[router] claimDelivery: transient error, retry ${attempt}/${CLAIM_RETRY_ATTEMPTS}`);
|
|
120
|
+
await backoffDelay(attempt - 1, CLAIM_RETRY_DELAY_MS, 10_000);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
throw new Error(`claimDelivery failed after ${CLAIM_RETRY_ATTEMPTS} attempts for ${requestId}`);
|
|
127
|
+
}
|
|
128
|
+
// ── ClaimRegistry helpers ──────────────────────────────────────────────────
|
|
129
|
+
export async function claimJob(publicClient, walletClient, safeAddress, claimRegistryAddress, requestId) {
|
|
130
|
+
const data = encodeFunctionData({
|
|
131
|
+
abi: CLAIM_REGISTRY_ABI,
|
|
132
|
+
functionName: 'claimJob',
|
|
133
|
+
args: [requestId],
|
|
134
|
+
});
|
|
135
|
+
try {
|
|
136
|
+
const txHash = await executeSafeTransaction(publicClient, walletClient, { safeAddress, to: claimRegistryAddress, value: 0n, data });
|
|
137
|
+
await waitForTransactionReceiptWithRetry(publicClient, txHash, {
|
|
138
|
+
onRetry: ({ attempt, message }) => {
|
|
139
|
+
console.error(`[claim-registry] wait receipt retry ${attempt}: ${message}`);
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
return txHash;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
146
|
+
if (message.includes('JobAlreadyClaimed')) {
|
|
147
|
+
return ''; // Already claimed by someone else
|
|
148
|
+
}
|
|
149
|
+
if (message.includes('IneligibleToClaim')) {
|
|
150
|
+
return ''; // Not eligible
|
|
151
|
+
}
|
|
152
|
+
if (message.includes('GS013') || message.includes('execution reverted')) {
|
|
153
|
+
// Safe execution failed (inner call reverted) — treat as claim failure
|
|
154
|
+
return '';
|
|
155
|
+
}
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export async function getJobClaim(publicClient, claimRegistryAddress, requestId) {
|
|
160
|
+
const result = await publicClient.readContract({
|
|
161
|
+
address: claimRegistryAddress,
|
|
162
|
+
abi: CLAIM_REGISTRY_ABI,
|
|
163
|
+
functionName: 'getJobClaim',
|
|
164
|
+
args: [requestId],
|
|
165
|
+
});
|
|
166
|
+
return { claimer: result[0], expiresAt: result[1] };
|
|
167
|
+
}
|
|
168
|
+
export async function getMechDeliveryRate(publicClient, mechAddress) {
|
|
169
|
+
return publicClient.readContract({
|
|
170
|
+
address: mechAddress,
|
|
171
|
+
abi: MECH_ABI,
|
|
172
|
+
functionName: 'maxDeliveryRate',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
export async function getTimeoutBounds(publicClient, marketplaceAddress) {
|
|
176
|
+
const [min, max] = await Promise.all([
|
|
177
|
+
publicClient.readContract({
|
|
178
|
+
address: marketplaceAddress,
|
|
179
|
+
abi: MECH_MARKETPLACE_ABI,
|
|
180
|
+
functionName: 'minResponseTimeout',
|
|
181
|
+
}),
|
|
182
|
+
publicClient.readContract({
|
|
183
|
+
address: marketplaceAddress,
|
|
184
|
+
abi: MECH_MARKETPLACE_ABI,
|
|
185
|
+
functionName: 'maxResponseTimeout',
|
|
186
|
+
}),
|
|
187
|
+
]);
|
|
188
|
+
return { min, max };
|
|
189
|
+
}
|
|
190
|
+
export async function pollDeliverEvents(publicClient, mechAddress, fromBlock, toBlock) {
|
|
191
|
+
return publicClient.getLogs({
|
|
192
|
+
address: mechAddress,
|
|
193
|
+
fromBlock,
|
|
194
|
+
toBlock,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
export async function scanRestorationJobs(publicClient, routerAddress, creator, fromBlock, toBlock) {
|
|
198
|
+
const results = [];
|
|
199
|
+
const chunkSize = 9999n;
|
|
200
|
+
for (let start = fromBlock; start <= toBlock; start += chunkSize + 1n) {
|
|
201
|
+
const end = start + chunkSize > toBlock ? toBlock : start + chunkSize;
|
|
202
|
+
const logs = await publicClient.getLogs({
|
|
203
|
+
address: routerAddress,
|
|
204
|
+
fromBlock: start,
|
|
205
|
+
toBlock: end,
|
|
206
|
+
});
|
|
207
|
+
for (const log of logs) {
|
|
208
|
+
try {
|
|
209
|
+
const decoded = decodeEventLog({
|
|
210
|
+
abi: JINN_ROUTER_ABI,
|
|
211
|
+
data: log.data,
|
|
212
|
+
topics: log.topics,
|
|
213
|
+
});
|
|
214
|
+
if (decoded.eventName === 'RestorationJobCreated') {
|
|
215
|
+
const args = decoded.args;
|
|
216
|
+
if (args.creator.toLowerCase() === creator.toLowerCase()) {
|
|
217
|
+
results.push({ requestId: String(args.requestId), creator: String(args.creator) });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch { }
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return results;
|
|
225
|
+
}
|
|
226
|
+
export async function scanEvaluationJobs(publicClient, routerAddress, creator, fromBlock, toBlock) {
|
|
227
|
+
const results = [];
|
|
228
|
+
const chunkSize = 9999n;
|
|
229
|
+
for (let start = fromBlock; start <= toBlock; start += chunkSize + 1n) {
|
|
230
|
+
const end = start + chunkSize > toBlock ? toBlock : start + chunkSize;
|
|
231
|
+
const logs = await publicClient.getLogs({
|
|
232
|
+
address: routerAddress,
|
|
233
|
+
fromBlock: start,
|
|
234
|
+
toBlock: end,
|
|
235
|
+
});
|
|
236
|
+
for (const log of logs) {
|
|
237
|
+
try {
|
|
238
|
+
const decoded = decodeEventLog({
|
|
239
|
+
abi: JINN_ROUTER_ABI,
|
|
240
|
+
data: log.data,
|
|
241
|
+
topics: log.topics,
|
|
242
|
+
});
|
|
243
|
+
if (decoded.eventName === 'EvaluationJobCreated') {
|
|
244
|
+
const args = decoded.args;
|
|
245
|
+
if (args.creator.toLowerCase() === creator.toLowerCase()) {
|
|
246
|
+
results.push({
|
|
247
|
+
requestId: String(args.requestId),
|
|
248
|
+
restorationRequestId: String(args.restorationRequestId),
|
|
249
|
+
creator: String(args.creator),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch { }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return results;
|
|
258
|
+
}
|
|
259
|
+
export function decodeMarketplaceRequestLogs(logs) {
|
|
260
|
+
const results = [];
|
|
261
|
+
for (const log of logs) {
|
|
262
|
+
try {
|
|
263
|
+
const decoded = decodeEventLog({
|
|
264
|
+
abi: MECH_MARKETPLACE_ABI,
|
|
265
|
+
data: log.data,
|
|
266
|
+
topics: log.topics,
|
|
267
|
+
});
|
|
268
|
+
if (decoded.eventName === 'MarketplaceRequest') {
|
|
269
|
+
const args = decoded.args;
|
|
270
|
+
for (let i = 0; i < args.requestIds.length; i++) {
|
|
271
|
+
results.push({
|
|
272
|
+
requestId: String(args.requestIds[i]),
|
|
273
|
+
requestDataHex: String(args.requestDatas[i]),
|
|
274
|
+
priorityMech: String(args.priorityMech),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Not a MarketplaceRequest event — skip
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return results;
|
|
284
|
+
}
|
|
285
|
+
export function decodeDeliverLogs(logs) {
|
|
286
|
+
const results = [];
|
|
287
|
+
for (const log of logs) {
|
|
288
|
+
try {
|
|
289
|
+
const decoded = decodeEventLog({
|
|
290
|
+
abi: MECH_ABI,
|
|
291
|
+
data: log.data,
|
|
292
|
+
topics: log.topics,
|
|
293
|
+
});
|
|
294
|
+
if (decoded.eventName === 'Deliver') {
|
|
295
|
+
const args = decoded.args;
|
|
296
|
+
results.push({
|
|
297
|
+
requestId: String(args.requestId),
|
|
298
|
+
deliveryDataHex: String(args.data),
|
|
299
|
+
mechAddress: String(args.mechServiceMultisig),
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// Not a Deliver event — skip
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return results;
|
|
308
|
+
}
|
|
309
|
+
// ── Delivery ─────────────────────────────────────────────────────────────────
|
|
310
|
+
export async function callDeliverToMarketplace(publicClient, walletClient, safeAddress, mechContractAddress, requestIds, datas) {
|
|
311
|
+
const calldata = encodeFunctionData({
|
|
312
|
+
abi: MECH_ABI,
|
|
313
|
+
functionName: 'deliverToMarketplace',
|
|
314
|
+
args: [requestIds, datas],
|
|
315
|
+
});
|
|
316
|
+
return executeSafeTransaction(publicClient, walletClient, {
|
|
317
|
+
safeAddress,
|
|
318
|
+
to: mechContractAddress,
|
|
319
|
+
value: 0n,
|
|
320
|
+
data: calldata,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/adapters/mech/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Hex } from 'viem';
|
|
2
|
+
import type { DesiredState, RestorationResult } from '../../types/index.js';
|
|
3
|
+
export interface DesiredStatePayload {
|
|
4
|
+
desiredStateId: string;
|
|
5
|
+
description: string;
|
|
6
|
+
context?: Record<string, unknown>;
|
|
7
|
+
type?: 'restoration' | 'evaluation';
|
|
8
|
+
attemptId?: string;
|
|
9
|
+
attemptNumber?: number;
|
|
10
|
+
restorationRequestId?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RestorationResultPayload {
|
|
13
|
+
requestId: string;
|
|
14
|
+
data: string;
|
|
15
|
+
artifacts?: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function buildDesiredStatePayload(state: DesiredState): DesiredStatePayload;
|
|
18
|
+
export declare function parseDesiredStateFromPayload(payload: Record<string, unknown>): DesiredState;
|
|
19
|
+
export declare function buildResultPayload(requestId: string, result: RestorationResult): RestorationResultPayload;
|
|
20
|
+
/**
|
|
21
|
+
* Upload JSON to IPFS via the Autonolas registry.
|
|
22
|
+
* Uses pushJsonToIpfs from mech-client-ts — the same function jinn-node uses.
|
|
23
|
+
* Returns [digestHex, cidString].
|
|
24
|
+
*/
|
|
25
|
+
export declare function uploadToIpfs(_registryUrl: string, data: unknown): Promise<string>;
|
|
26
|
+
export declare function fetchFromIpfs(gatewayUrl: string, cid: string): Promise<unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Extract the 32-byte SHA256 digest from a CIDv1 string.
|
|
29
|
+
*
|
|
30
|
+
* CIDv1 structure (base32): multibase + version + codec + multihash
|
|
31
|
+
* Multihash: [0x12 (sha2-256)] [0x20 (32 bytes)] [32 bytes digest]
|
|
32
|
+
*
|
|
33
|
+
* The Mech marketplace uses the raw 32-byte digest as requestData on-chain.
|
|
34
|
+
*/
|
|
35
|
+
export declare function cidToDigestHex(cid: string): Hex;
|
|
36
|
+
/**
|
|
37
|
+
* Construct an Autonolas IPFS gateway URL from a raw SHA256 digest hex string.
|
|
38
|
+
*/
|
|
39
|
+
export declare function digestHexToGatewayUrl(digestHex: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Fetch content from IPFS using a raw SHA256 digest hex.
|
|
42
|
+
*/
|
|
43
|
+
export declare function fetchFromDigest(digestHex: string): Promise<unknown>;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { IPFS_GATEWAY_PREFIX } from './types.js';
|
|
2
|
+
export function buildDesiredStatePayload(state) {
|
|
3
|
+
return {
|
|
4
|
+
desiredStateId: state.id,
|
|
5
|
+
description: state.description,
|
|
6
|
+
context: state.context,
|
|
7
|
+
type: state.type,
|
|
8
|
+
attemptId: state.attemptId,
|
|
9
|
+
attemptNumber: state.attemptNumber,
|
|
10
|
+
restorationRequestId: state.restorationRequestId,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function parseDesiredStateFromPayload(payload) {
|
|
14
|
+
return {
|
|
15
|
+
id: payload.desiredStateId ?? '',
|
|
16
|
+
description: payload.description ?? '',
|
|
17
|
+
context: payload.context,
|
|
18
|
+
type: payload.type,
|
|
19
|
+
attemptId: payload.attemptId,
|
|
20
|
+
attemptNumber: payload.attemptNumber,
|
|
21
|
+
restorationRequestId: payload.restorationRequestId,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function buildResultPayload(requestId, result) {
|
|
25
|
+
return {
|
|
26
|
+
requestId,
|
|
27
|
+
data: result.data,
|
|
28
|
+
artifacts: result.artifacts,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Upload JSON to IPFS via the Autonolas registry.
|
|
33
|
+
* Uses pushJsonToIpfs from mech-client-ts — the same function jinn-node uses.
|
|
34
|
+
* Returns [digestHex, cidString].
|
|
35
|
+
*/
|
|
36
|
+
export async function uploadToIpfs(_registryUrl, data) {
|
|
37
|
+
const { pushJsonToIpfs } = await import('@jinn-network/mech-client-ts/dist/ipfs.js');
|
|
38
|
+
const [, cidString] = await pushJsonToIpfs(data);
|
|
39
|
+
return cidString;
|
|
40
|
+
}
|
|
41
|
+
export async function fetchFromIpfs(gatewayUrl, cid) {
|
|
42
|
+
const response = await fetch(`${gatewayUrl}/ipfs/${cid}`);
|
|
43
|
+
if (!response.ok)
|
|
44
|
+
throw new Error(`IPFS fetch failed: ${response.statusText}`);
|
|
45
|
+
return response.json();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract the 32-byte SHA256 digest from a CIDv1 string.
|
|
49
|
+
*
|
|
50
|
+
* CIDv1 structure (base32): multibase + version + codec + multihash
|
|
51
|
+
* Multihash: [0x12 (sha2-256)] [0x20 (32 bytes)] [32 bytes digest]
|
|
52
|
+
*
|
|
53
|
+
* The Mech marketplace uses the raw 32-byte digest as requestData on-chain.
|
|
54
|
+
*/
|
|
55
|
+
export function cidToDigestHex(cid) {
|
|
56
|
+
let bytes;
|
|
57
|
+
if (cid.startsWith('Qm')) {
|
|
58
|
+
// CIDv0 — base58btc encoded multihash directly
|
|
59
|
+
bytes = base58Decode(cid);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// CIDv1 — decode multibase, skip version byte and codec varint
|
|
63
|
+
const raw = cid.startsWith('b')
|
|
64
|
+
? base32Decode(cid.slice(1)) // strip 'b' multibase prefix
|
|
65
|
+
: base58Decode(cid.slice(1)); // strip 'z' multibase prefix
|
|
66
|
+
// Skip version (1 byte) and codec (1-2 bytes varint)
|
|
67
|
+
let offset = 1; // skip version
|
|
68
|
+
while (raw[offset] & 0x80)
|
|
69
|
+
offset++;
|
|
70
|
+
offset++; // skip last byte of varint
|
|
71
|
+
bytes = raw.slice(offset);
|
|
72
|
+
}
|
|
73
|
+
// bytes is now the multihash: [hashFn, length, ...digest]
|
|
74
|
+
if (bytes[0] !== 0x12 || bytes[1] !== 0x20) {
|
|
75
|
+
throw new Error(`Unsupported multihash: fn=0x${bytes[0].toString(16)}, len=${bytes[1]}`);
|
|
76
|
+
}
|
|
77
|
+
const digest = bytes.slice(2, 34);
|
|
78
|
+
return `0x${Buffer.from(digest).toString('hex')}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Construct an Autonolas IPFS gateway URL from a raw SHA256 digest hex string.
|
|
82
|
+
*/
|
|
83
|
+
export function digestHexToGatewayUrl(digestHex) {
|
|
84
|
+
const hex = digestHex.startsWith('0x') ? digestHex.slice(2) : digestHex;
|
|
85
|
+
return `${IPFS_GATEWAY_PREFIX}${hex}`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Fetch content from IPFS using a raw SHA256 digest hex.
|
|
89
|
+
*/
|
|
90
|
+
export async function fetchFromDigest(digestHex) {
|
|
91
|
+
const url = digestHexToGatewayUrl(digestHex);
|
|
92
|
+
const response = await fetch(url);
|
|
93
|
+
if (!response.ok)
|
|
94
|
+
throw new Error(`IPFS fetch failed: ${response.statusText}`);
|
|
95
|
+
return response.json();
|
|
96
|
+
}
|
|
97
|
+
// ── Base encoding helpers ────────────────────────────────────────────────────
|
|
98
|
+
const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
99
|
+
function base58Decode(str) {
|
|
100
|
+
const bytes = [0];
|
|
101
|
+
for (const char of str) {
|
|
102
|
+
const idx = BASE58_ALPHABET.indexOf(char);
|
|
103
|
+
if (idx < 0)
|
|
104
|
+
throw new Error(`Invalid base58 character: ${char}`);
|
|
105
|
+
let carry = idx;
|
|
106
|
+
for (let j = 0; j < bytes.length; j++) {
|
|
107
|
+
carry += bytes[j] * 58;
|
|
108
|
+
bytes[j] = carry & 0xff;
|
|
109
|
+
carry >>= 8;
|
|
110
|
+
}
|
|
111
|
+
while (carry > 0) {
|
|
112
|
+
bytes.push(carry & 0xff);
|
|
113
|
+
carry >>= 8;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const char of str) {
|
|
117
|
+
if (char !== '1')
|
|
118
|
+
break;
|
|
119
|
+
bytes.push(0);
|
|
120
|
+
}
|
|
121
|
+
return new Uint8Array(bytes.reverse());
|
|
122
|
+
}
|
|
123
|
+
const BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
|
|
124
|
+
function base32Decode(str) {
|
|
125
|
+
const input = str.toLowerCase().replace(/=+$/, '');
|
|
126
|
+
let bits = 0;
|
|
127
|
+
let value = 0;
|
|
128
|
+
const output = [];
|
|
129
|
+
for (const char of input) {
|
|
130
|
+
const idx = BASE32_ALPHABET.indexOf(char);
|
|
131
|
+
if (idx < 0)
|
|
132
|
+
throw new Error(`Invalid base32 character: ${char}`);
|
|
133
|
+
value = (value << 5) | idx;
|
|
134
|
+
bits += 5;
|
|
135
|
+
if (bits >= 8) {
|
|
136
|
+
output.push((value >> (bits - 8)) & 0xff);
|
|
137
|
+
bits -= 8;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return new Uint8Array(output);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=ipfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../../src/adapters/mech/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Address, type Hex, type PublicClient, type WalletClient, type Chain } from 'viem';
|
|
2
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
3
|
+
export declare function buildSafeSignature(signerAddress: string): Hex;
|
|
4
|
+
export interface SafeTransactionParams {
|
|
5
|
+
safeAddress: Address;
|
|
6
|
+
to: Address;
|
|
7
|
+
value: bigint;
|
|
8
|
+
data: Hex;
|
|
9
|
+
}
|
|
10
|
+
export declare function executeSafeTransaction(publicClient: PublicClient, walletClient: WalletClient, params: SafeTransactionParams): Promise<Hex>;
|
|
11
|
+
export declare function createClients(rpcUrl: string, privateKey: Hex, chain?: Chain): {
|
|
12
|
+
publicClient: PublicClient;
|
|
13
|
+
walletClient: WalletClient;
|
|
14
|
+
account: ReturnType<typeof privateKeyToAccount>;
|
|
15
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createPublicClient, createWalletClient, http, } from 'viem';
|
|
2
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
3
|
+
import { base } from 'viem/chains';
|
|
4
|
+
import { SAFE_ABI } from './types.js';
|
|
5
|
+
import { withRecoverableRetry, viemFeeOverridesForAttempt, } from '../../tx-retry.js';
|
|
6
|
+
export function buildSafeSignature(signerAddress) {
|
|
7
|
+
const r = signerAddress.toLowerCase().replace('0x', '').padStart(64, '0');
|
|
8
|
+
const s = '0'.repeat(64);
|
|
9
|
+
const v = '01';
|
|
10
|
+
return `0x${r}${s}${v}`;
|
|
11
|
+
}
|
|
12
|
+
// Per-Safe transaction lock to prevent nonce races when concurrent
|
|
13
|
+
// loops (creator + restorer) share the same Safe
|
|
14
|
+
const safeLocks = new Map();
|
|
15
|
+
export async function executeSafeTransaction(publicClient, walletClient, params) {
|
|
16
|
+
const lockKey = params.safeAddress.toLowerCase();
|
|
17
|
+
// Wait for any pending transaction on this Safe to complete
|
|
18
|
+
const pending = safeLocks.get(lockKey) ?? Promise.resolve();
|
|
19
|
+
let releaseLock;
|
|
20
|
+
const newLock = new Promise(resolve => { releaseLock = resolve; });
|
|
21
|
+
safeLocks.set(lockKey, newLock);
|
|
22
|
+
await pending;
|
|
23
|
+
try {
|
|
24
|
+
const hash = await executeSafeTransactionInner(publicClient, walletClient, params);
|
|
25
|
+
// Wait for the tx to mine before releasing the lock so the next caller sees
|
|
26
|
+
// the updated Safe nonce. Without this, the next signer reads a stale nonce
|
|
27
|
+
// (the broadcast tx is still pending) and the resulting signature recovers
|
|
28
|
+
// a different address at execution time, causing GS026 (invalid owner).
|
|
29
|
+
await publicClient.waitForTransactionReceipt({ hash });
|
|
30
|
+
return hash;
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
releaseLock();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function executeSafeTransactionInner(publicClient, walletClient, params) {
|
|
37
|
+
const { safeAddress, to, value, data } = params;
|
|
38
|
+
const account = walletClient.account;
|
|
39
|
+
if (!account)
|
|
40
|
+
throw new Error('Wallet client has no account');
|
|
41
|
+
return withRecoverableRetry(async (attemptIndex) => {
|
|
42
|
+
const nonce = await publicClient.readContract({
|
|
43
|
+
address: safeAddress,
|
|
44
|
+
abi: SAFE_ABI,
|
|
45
|
+
functionName: 'nonce',
|
|
46
|
+
});
|
|
47
|
+
const txHash = await publicClient.readContract({
|
|
48
|
+
address: safeAddress,
|
|
49
|
+
abi: SAFE_ABI,
|
|
50
|
+
functionName: 'getTransactionHash',
|
|
51
|
+
args: [
|
|
52
|
+
to,
|
|
53
|
+
value,
|
|
54
|
+
data,
|
|
55
|
+
0,
|
|
56
|
+
0n,
|
|
57
|
+
0n,
|
|
58
|
+
0n,
|
|
59
|
+
'0x0000000000000000000000000000000000000000',
|
|
60
|
+
'0x0000000000000000000000000000000000000000',
|
|
61
|
+
nonce,
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
const ethSignature = await walletClient.signMessage({
|
|
65
|
+
account,
|
|
66
|
+
message: { raw: txHash },
|
|
67
|
+
});
|
|
68
|
+
const sigBytes = Buffer.from(ethSignature.slice(2), 'hex');
|
|
69
|
+
sigBytes[64] = sigBytes[64] + 4;
|
|
70
|
+
const safeSignature = `0x${sigBytes.toString('hex')}`;
|
|
71
|
+
const feeOverrides = await viemFeeOverridesForAttempt(publicClient, attemptIndex);
|
|
72
|
+
return walletClient.writeContract({
|
|
73
|
+
address: safeAddress,
|
|
74
|
+
abi: SAFE_ABI,
|
|
75
|
+
functionName: 'execTransaction',
|
|
76
|
+
args: [
|
|
77
|
+
to,
|
|
78
|
+
value,
|
|
79
|
+
data,
|
|
80
|
+
0,
|
|
81
|
+
0n,
|
|
82
|
+
0n,
|
|
83
|
+
0n,
|
|
84
|
+
'0x0000000000000000000000000000000000000000',
|
|
85
|
+
'0x0000000000000000000000000000000000000000',
|
|
86
|
+
safeSignature,
|
|
87
|
+
],
|
|
88
|
+
account,
|
|
89
|
+
chain: walletClient.chain,
|
|
90
|
+
value: params.value,
|
|
91
|
+
...feeOverrides,
|
|
92
|
+
});
|
|
93
|
+
}, {
|
|
94
|
+
onRetry: ({ attempt, message }) => {
|
|
95
|
+
console.error(`[safe/viem] execTransaction retry ${attempt}: ${message}`);
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export function createClients(rpcUrl, privateKey, chain) {
|
|
100
|
+
const account = privateKeyToAccount(privateKey);
|
|
101
|
+
const selectedChain = chain ?? base;
|
|
102
|
+
const publicClient = createPublicClient({
|
|
103
|
+
chain: selectedChain,
|
|
104
|
+
transport: http(rpcUrl),
|
|
105
|
+
});
|
|
106
|
+
const walletClient = createWalletClient({
|
|
107
|
+
account,
|
|
108
|
+
chain: selectedChain,
|
|
109
|
+
transport: http(rpcUrl),
|
|
110
|
+
});
|
|
111
|
+
return { publicClient: publicClient, walletClient: walletClient, account };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=safe.js.map
|