@spicenet-io/spiceflow-core 0.9.0 → 0.10.0-order-amendments.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 +82 -0
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/conditionalIntents.d.ts +13 -1
- package/dist/conditionalIntents.d.ts.map +1 -1
- package/dist/index.cjs +199 -94
- package/dist/index.js +198 -94
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# @spicenet-io/spiceflow-core
|
|
2
|
+
|
|
3
|
+
Single source of truth for chain configs, token lists, logos, ABIs, and shared utilities across spiceflow repos.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm install @spicenet-io/spiceflow-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What's in here
|
|
12
|
+
|
|
13
|
+
### Chains
|
|
14
|
+
|
|
15
|
+
`CHAINS` is a record of all supported chains keyed by chain ID. Each entry has id, name, display name, network (mainnet/testnet), native currency, delegate contract address, block explorer, rpc url, and logo.
|
|
16
|
+
|
|
17
|
+
Helper functions: `getChainMeta(chainId)`, `getChainsByNetwork(network)`, `getChainIdsByNetwork(network)`, `getMainnetChains()`, `getTestnetChains()`, `getDelegateContract(chainId)`.
|
|
18
|
+
|
|
19
|
+
### Tokens
|
|
20
|
+
|
|
21
|
+
`TOKENS` is the official token list. Each token has symbol, name, equivalence group, logo, and deployments across chains (address, decimals, network per chain).
|
|
22
|
+
|
|
23
|
+
Helper functions: `getTokensForChain(chainId)`, `getTokenByAddress(address, chainId)`, `getEquivalentAddresses(tokenAddress)`, `areEquivalent(a, b)`, `isUsdDenominated(address)`, `isBtcDenominated(address)`.
|
|
24
|
+
|
|
25
|
+
### Logos
|
|
26
|
+
|
|
27
|
+
All chain and token logos are bundled as base64 data URIs in the package. They work directly in img src attributes with no network requests. To add a new logo, drop the PNG in `logos/` and reference it in the chain or token list. `npm run build` auto generates the base64 file.
|
|
28
|
+
|
|
29
|
+
### Utilities
|
|
30
|
+
|
|
31
|
+
`isNativeToken(address)` checks if an address is a native token (zero address, 0x0, or 0xeee...eee).
|
|
32
|
+
|
|
33
|
+
`normalizeNativeTokenAddress(address)` normalizes any native token address to the zero address.
|
|
34
|
+
|
|
35
|
+
`convertAmountBetweenDecimals(amount, fromDecimals, toDecimals)` converts token amounts between different decimal precisions.
|
|
36
|
+
|
|
37
|
+
`formatTokenAmount(amount, decimals)` formats a bigint token amount into a human readable string.
|
|
38
|
+
|
|
39
|
+
`truncateAddress(address)` shortens an address for display.
|
|
40
|
+
|
|
41
|
+
`withRetry(fn, maxRetries, delayMs)` retries an async function with exponential backoff.
|
|
42
|
+
|
|
43
|
+
Constants: `NATIVE_TOKEN_ADDRESS`, `ZERO_ADDRESS`, `ESCROW_ADDRESS`.
|
|
44
|
+
|
|
45
|
+
### ABIs
|
|
46
|
+
|
|
47
|
+
`DELEGATE_ABI`, `ERC20_ABI`, `WCBTC_ABI`.
|
|
48
|
+
|
|
49
|
+
### Authorization
|
|
50
|
+
|
|
51
|
+
`hashChainBatches(chainCalls)` hashes chain call batches for intent signing.
|
|
52
|
+
|
|
53
|
+
`getIntentHash(signatureType, nbf, exp, chainBatches)` computes the intent hash.
|
|
54
|
+
|
|
55
|
+
`getAccountNonce(address, publicClient)` gets the account nonce from chain.
|
|
56
|
+
|
|
57
|
+
### Core SDK
|
|
58
|
+
|
|
59
|
+
`SpiceFlowCore` class for building and submitting intents. Handles delegation signing, chain batch construction, intent signing, and transaction submission.
|
|
60
|
+
|
|
61
|
+
### HTTP
|
|
62
|
+
|
|
63
|
+
`fetchWithRetry(url, init, opts)` is a fetch wrapper with retry and exponential backoff.
|
|
64
|
+
|
|
65
|
+
`submitTransaction(baseUrl, request)` submits a transaction to the relayer API.
|
|
66
|
+
|
|
67
|
+
`getIntentStepStatus(txApiUrl, intentId, stepId)` checks intent execution status.
|
|
68
|
+
|
|
69
|
+
`prepareRFQT(txApiUrl, request)` prepares an RFQT quote.
|
|
70
|
+
|
|
71
|
+
## Adding a token
|
|
72
|
+
|
|
73
|
+
1. Drop the logo PNG in `logos/`
|
|
74
|
+
2. Add the token entry in `src/tokens/list.ts` with symbol, name, equivalence group, logo reference, and deployments
|
|
75
|
+
3. `npm run build` and publish
|
|
76
|
+
|
|
77
|
+
## Adding a chain
|
|
78
|
+
|
|
79
|
+
1. Drop the logo PNG in `logos/` if it's a new chain logo
|
|
80
|
+
2. Add the chain entry in `src/chains/list.ts`
|
|
81
|
+
3. Add token deployments on that chain in `src/tokens/list.ts`
|
|
82
|
+
4. `npm run build` and publish
|
package/dist/api.d.ts
CHANGED
|
@@ -93,6 +93,7 @@ export interface EstimateActionFeesResponse {
|
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
95
|
export interface RegisterConditionalIntentRequest {
|
|
96
|
+
executionWaits?: import("./conditionalIntents.js").ConditionalExecutionWait[];
|
|
96
97
|
authorization: ConditionalIntentAuthorization;
|
|
97
98
|
authorizationSignature: Hex;
|
|
98
99
|
triggerSpecification: Hex;
|
|
@@ -103,11 +104,19 @@ export interface RegisterConditionalIntentRequest {
|
|
|
103
104
|
};
|
|
104
105
|
}
|
|
105
106
|
export interface RegisterConditionalIntentResponse {
|
|
107
|
+
orderId?: string;
|
|
108
|
+
revisionId?: string;
|
|
109
|
+
revision?: number;
|
|
106
110
|
conditionalIntentId: Hash;
|
|
107
111
|
state: "armed" | "eligible" | "executing" | "reconciling" | "completed" | "cancelled" | "expired" | "failed" | "needs_attention";
|
|
108
112
|
readToken?: string;
|
|
109
113
|
}
|
|
110
114
|
export interface ConditionalIntentStatus {
|
|
115
|
+
/** Stable order identity across signed revisions. Legacy servers omit these fields. */
|
|
116
|
+
orderId?: string;
|
|
117
|
+
revisionId?: string;
|
|
118
|
+
revision?: number;
|
|
119
|
+
replacedBy?: Hash;
|
|
111
120
|
executionStatus?: string;
|
|
112
121
|
executionStopped?: boolean;
|
|
113
122
|
conditionalIntentId: Hash;
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { Address, Hash, Hex } from "viem";
|
|
2
2
|
import type { Call, TokenTransferConfig } from "./types.js";
|
|
3
|
+
/** Until-cancelled wire sentinel: 9999-12-31T23:59:59Z; safe in JS, SQL and signed EVM expiry. */
|
|
4
|
+
export declare const CONDITIONAL_INTENT_UNTIL_CANCELLED = 253402300799n;
|
|
3
5
|
export declare const CONDITIONAL_INTENT_VERSION: 1;
|
|
4
6
|
export type ConditionalTriggerSemantics = "state" | "event";
|
|
7
|
+
/** A signed, read-only prerequisite for an unsubmitted execution batch. */
|
|
8
|
+
export interface ConditionalExecutionWait {
|
|
9
|
+
batchIndex: number;
|
|
10
|
+
to: Address;
|
|
11
|
+
data: Hex;
|
|
12
|
+
/** Exact ABI uint256 return word required before submission. */
|
|
13
|
+
expected: bigint;
|
|
14
|
+
}
|
|
5
15
|
export interface ConditionalExecutionBatch {
|
|
6
16
|
chainId: bigint | number;
|
|
7
17
|
calls: Call[];
|
|
@@ -16,6 +26,8 @@ export interface ConditionalDelegationAuthorization {
|
|
|
16
26
|
yParity?: number;
|
|
17
27
|
}
|
|
18
28
|
export interface ConditionalIntentAuthorization {
|
|
29
|
+
/** Atomically supersedes this unclaimed intent; bound into the signature. */
|
|
30
|
+
replacesIntentId?: Hash;
|
|
19
31
|
owner: Address;
|
|
20
32
|
clientId: string;
|
|
21
33
|
serviceId: string;
|
|
@@ -57,7 +69,7 @@ export interface ConditionalReadAuthorization {
|
|
|
57
69
|
nonce: bigint;
|
|
58
70
|
}
|
|
59
71
|
/** Commits to ordered calls and service-consumed funding metadata, never signatures or display text. */
|
|
60
|
-
export declare function hashConditionalExecutionPlan(batches: ConditionalExecutionBatch[], delegationAuthorizations?: ConditionalDelegationAuthorization[]): Hash;
|
|
72
|
+
export declare function hashConditionalExecutionPlan(batches: ConditionalExecutionBatch[], delegationAuthorizations?: ConditionalDelegationAuthorization[], waits?: ConditionalExecutionWait[]): Hash;
|
|
61
73
|
/** Hash to pass to the wallet's existing EIP-191 signMessage({ message: { raw } }) path. */
|
|
62
74
|
export declare function hashConditionalIntentAuthorization(value: ConditionalIntentAuthorization): Hash;
|
|
63
75
|
export declare function getConditionalIntentId(authorizationHash: Hash): Hash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionalIntents.d.ts","sourceRoot":"","sources":["../src/conditionalIntents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAC;AACrD,MAAM,MAAM,2BAA2B,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,cAAc,EAAE,mBAAmB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,kCAAkC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC,EAAE,GAAG,CAAC;IACP,CAAC,EAAE,GAAG,CAAC;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,IAAI,CAAC;IACtB,iBAAiB,EAAE,IAAI,CAAC;IACxB,wBAAwB,EAAE,IAAI,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,2BAA2B,CAAC;IACvC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,EAAE,IAAI,CAAC;IACtB,wBAAwB,EAAE,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"conditionalIntents.d.ts","sourceRoot":"","sources":["../src/conditionalIntents.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
var index_exports = {};
|
|
21
21
|
__export(index_exports, {
|
|
22
22
|
CHAINS: () => CHAINS,
|
|
23
|
+
CONDITIONAL_INTENT_UNTIL_CANCELLED: () => CONDITIONAL_INTENT_UNTIL_CANCELLED,
|
|
23
24
|
CONDITIONAL_INTENT_VERSION: () => CONDITIONAL_INTENT_VERSION,
|
|
24
25
|
ChainBatchHashAbi: () => ChainBatchHashAbi,
|
|
25
26
|
DELEGATE_ABI: () => DELEGATE_ABI,
|
|
@@ -149,6 +150,7 @@ async function getRecentBlock(publicClient) {
|
|
|
149
150
|
|
|
150
151
|
// src/conditionalIntents.ts
|
|
151
152
|
var import_viem2 = require("viem");
|
|
153
|
+
var CONDITIONAL_INTENT_UNTIL_CANCELLED = 253402300799n;
|
|
152
154
|
var CONDITIONAL_INTENT_VERSION = 1;
|
|
153
155
|
var callTuple = [
|
|
154
156
|
{ name: "to", type: "address" },
|
|
@@ -169,44 +171,97 @@ var batchTuple = [
|
|
|
169
171
|
];
|
|
170
172
|
var zeroAddress = "0x0000000000000000000000000000000000000000";
|
|
171
173
|
function encodePlanTransfer(transfer) {
|
|
172
|
-
if (transfer.from === "solver")
|
|
173
|
-
|
|
174
|
-
|
|
174
|
+
if (transfer.from === "solver")
|
|
175
|
+
return [
|
|
176
|
+
1,
|
|
177
|
+
zeroAddress,
|
|
178
|
+
transfer.to,
|
|
179
|
+
transfer.token,
|
|
180
|
+
transfer.amount
|
|
181
|
+
];
|
|
182
|
+
if (transfer.from === "escrow")
|
|
183
|
+
return [
|
|
184
|
+
2,
|
|
185
|
+
zeroAddress,
|
|
186
|
+
transfer.to,
|
|
187
|
+
transfer.token,
|
|
188
|
+
transfer.amount
|
|
189
|
+
];
|
|
190
|
+
return [
|
|
191
|
+
0,
|
|
192
|
+
transfer.from,
|
|
193
|
+
transfer.to,
|
|
194
|
+
transfer.token,
|
|
195
|
+
transfer.amount
|
|
196
|
+
];
|
|
175
197
|
}
|
|
176
|
-
function hashConditionalExecutionPlan(batches, delegationAuthorizations = []) {
|
|
198
|
+
function hashConditionalExecutionPlan(batches, delegationAuthorizations = [], waits = []) {
|
|
177
199
|
const normalized = batches.map((batch) => [
|
|
178
200
|
BigInt(batch.chainId),
|
|
179
201
|
batch.calls,
|
|
180
202
|
batch.tokenTransfers.map(encodePlanTransfer)
|
|
181
203
|
]);
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
{
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
BigInt(
|
|
203
|
-
|
|
204
|
-
auth
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
204
|
+
const baseHash = (0, import_viem2.keccak256)(
|
|
205
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
206
|
+
[
|
|
207
|
+
{ type: "bytes32" },
|
|
208
|
+
{ type: "uint256" },
|
|
209
|
+
{ type: "tuple[]", components: batchTuple },
|
|
210
|
+
{
|
|
211
|
+
type: "tuple[]",
|
|
212
|
+
components: [
|
|
213
|
+
{ name: "address", type: "address" },
|
|
214
|
+
{ name: "chainId", type: "uint256" },
|
|
215
|
+
{ name: "nonce", type: "uint256" },
|
|
216
|
+
{ name: "r", type: "bytes32" },
|
|
217
|
+
{ name: "s", type: "bytes32" },
|
|
218
|
+
{ name: "yParity", type: "uint8" }
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
[
|
|
223
|
+
(0, import_viem2.keccak256)((0, import_viem2.stringToHex)("spice.conditional.execution-plan")),
|
|
224
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
225
|
+
normalized,
|
|
226
|
+
delegationAuthorizations.map((auth) => [
|
|
227
|
+
auth.address,
|
|
228
|
+
BigInt(auth.chainId),
|
|
229
|
+
BigInt(auth.nonce),
|
|
230
|
+
auth.r,
|
|
231
|
+
auth.s,
|
|
232
|
+
auth.yParity ?? 0
|
|
233
|
+
])
|
|
234
|
+
]
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
if (!waits.length) return baseHash;
|
|
238
|
+
return (0, import_viem2.keccak256)(
|
|
239
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
240
|
+
[
|
|
241
|
+
{ type: "bytes32" },
|
|
242
|
+
{ type: "bytes32" },
|
|
243
|
+
{
|
|
244
|
+
type: "tuple[]",
|
|
245
|
+
components: [
|
|
246
|
+
{ name: "batchIndex", type: "uint256" },
|
|
247
|
+
{ name: "to", type: "address" },
|
|
248
|
+
{ name: "data", type: "bytes" },
|
|
249
|
+
{ name: "expected", type: "uint256" }
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
],
|
|
253
|
+
[
|
|
254
|
+
(0, import_viem2.keccak256)((0, import_viem2.stringToHex)("spice.conditional.execution-waits.v1")),
|
|
255
|
+
baseHash,
|
|
256
|
+
waits.map((w) => ({
|
|
257
|
+
batchIndex: BigInt(w.batchIndex),
|
|
258
|
+
to: w.to,
|
|
259
|
+
data: w.data,
|
|
260
|
+
expected: w.expected
|
|
261
|
+
}))
|
|
262
|
+
]
|
|
263
|
+
)
|
|
264
|
+
);
|
|
210
265
|
}
|
|
211
266
|
var authorizationTypes = [
|
|
212
267
|
{ name: "domain", type: "bytes32" },
|
|
@@ -232,76 +287,125 @@ function semanticsValue(value) {
|
|
|
232
287
|
return value === "state" ? 0 : 1;
|
|
233
288
|
}
|
|
234
289
|
function hashConditionalIntentAuthorization(value) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
290
|
+
const original = (0, import_viem2.keccak256)(
|
|
291
|
+
(0, import_viem2.encodeAbiParameters)(authorizationTypes, [
|
|
292
|
+
hashText("spice.conditional.authorization"),
|
|
293
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
294
|
+
value.owner,
|
|
295
|
+
hashText(value.clientId),
|
|
296
|
+
hashText(value.serviceId),
|
|
297
|
+
value.authorizationNonce,
|
|
298
|
+
value.executionDigest,
|
|
299
|
+
value.executionPlanHash,
|
|
300
|
+
value.triggerSpecificationHash,
|
|
301
|
+
value.evaluator,
|
|
302
|
+
semanticsValue(value.semantics),
|
|
303
|
+
value.maxSignalAgeSeconds,
|
|
304
|
+
value.validAfter,
|
|
305
|
+
value.expiresAt,
|
|
306
|
+
BigInt(value.maxExecutions)
|
|
307
|
+
])
|
|
308
|
+
);
|
|
309
|
+
return value.replacesIntentId ? (0, import_viem2.keccak256)(
|
|
310
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
311
|
+
[{ type: "bytes32" }, { type: "bytes32" }, { type: "bytes32" }],
|
|
312
|
+
[
|
|
313
|
+
hashText("spice.conditional.amendment.v1"),
|
|
314
|
+
value.replacesIntentId,
|
|
315
|
+
original
|
|
316
|
+
]
|
|
317
|
+
)
|
|
318
|
+
) : original;
|
|
252
319
|
}
|
|
253
320
|
function getConditionalIntentId(authorizationHash) {
|
|
254
|
-
return (0, import_viem2.keccak256)(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
321
|
+
return (0, import_viem2.keccak256)(
|
|
322
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
323
|
+
[{ type: "bytes32" }, { type: "bytes32" }],
|
|
324
|
+
[hashText("spice.conditional.intent-id"), authorizationHash]
|
|
325
|
+
)
|
|
326
|
+
);
|
|
258
327
|
}
|
|
259
328
|
function hashConditionalSignal(value, serviceId) {
|
|
260
|
-
return (0, import_viem2.keccak256)(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
329
|
+
return (0, import_viem2.keccak256)(
|
|
330
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
331
|
+
[
|
|
332
|
+
{ name: "domain", type: "bytes32" },
|
|
333
|
+
{ name: "version", type: "uint256" },
|
|
334
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
335
|
+
{ name: "intentId", type: "bytes32" },
|
|
336
|
+
{ name: "executionDigest", type: "bytes32" },
|
|
337
|
+
{ name: "triggerSpecificationHash", type: "bytes32" },
|
|
338
|
+
{ name: "signalIdHash", type: "bytes32" },
|
|
339
|
+
{ name: "observedAt", type: "uint256" },
|
|
340
|
+
{ name: "validUntil", type: "uint256" },
|
|
341
|
+
{ name: "satisfied", type: "bool" },
|
|
342
|
+
{ name: "evidenceHash", type: "bytes32" }
|
|
343
|
+
],
|
|
344
|
+
[
|
|
345
|
+
hashText("spice.conditional.signal"),
|
|
346
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
347
|
+
hashText(serviceId),
|
|
348
|
+
value.intentId,
|
|
349
|
+
value.executionDigest,
|
|
350
|
+
value.triggerSpecificationHash,
|
|
351
|
+
hashText(value.signalId),
|
|
352
|
+
value.observedAt,
|
|
353
|
+
value.validUntil,
|
|
354
|
+
value.satisfied,
|
|
355
|
+
value.evidenceHash ?? "0x" + "00".repeat(32)
|
|
356
|
+
]
|
|
357
|
+
)
|
|
358
|
+
);
|
|
276
359
|
}
|
|
277
360
|
function hashConditionalCancellation(value) {
|
|
278
|
-
return (0, import_viem2.keccak256)(
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
361
|
+
return (0, import_viem2.keccak256)(
|
|
362
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
363
|
+
[
|
|
364
|
+
{ name: "domain", type: "bytes32" },
|
|
365
|
+
{ name: "version", type: "uint256" },
|
|
366
|
+
{ name: "owner", type: "address" },
|
|
367
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
368
|
+
{ name: "intentId", type: "bytes32" },
|
|
369
|
+
{ name: "cancellationNonce", type: "uint256" },
|
|
370
|
+
{ name: "expiresAt", type: "uint256" }
|
|
371
|
+
],
|
|
372
|
+
[
|
|
373
|
+
hashText("spice.conditional.cancel"),
|
|
374
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
375
|
+
value.owner,
|
|
376
|
+
hashText(value.serviceId),
|
|
377
|
+
value.intentId,
|
|
378
|
+
value.cancellationNonce,
|
|
379
|
+
value.expiresAt
|
|
380
|
+
]
|
|
381
|
+
)
|
|
382
|
+
);
|
|
290
383
|
}
|
|
291
384
|
function hashConditionalReadAuthorization(value) {
|
|
292
|
-
return (0, import_viem2.keccak256)(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
385
|
+
return (0, import_viem2.keccak256)(
|
|
386
|
+
(0, import_viem2.encodeAbiParameters)(
|
|
387
|
+
[
|
|
388
|
+
{ name: "domain", type: "bytes32" },
|
|
389
|
+
{ name: "version", type: "uint256" },
|
|
390
|
+
{ name: "owner", type: "address" },
|
|
391
|
+
{ name: "reader", type: "address" },
|
|
392
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
393
|
+
{ name: "intentId", type: "bytes32" },
|
|
394
|
+
{ name: "expiresAt", type: "uint256" },
|
|
395
|
+
{ name: "nonce", type: "uint256" }
|
|
396
|
+
],
|
|
397
|
+
[
|
|
398
|
+
hashText("spice.conditional.read"),
|
|
399
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
400
|
+
value.owner,
|
|
401
|
+
value.reader,
|
|
402
|
+
hashText(value.serviceId),
|
|
403
|
+
value.intentId ?? "0x" + "00".repeat(32),
|
|
404
|
+
value.expiresAt,
|
|
405
|
+
value.nonce
|
|
406
|
+
]
|
|
407
|
+
)
|
|
408
|
+
);
|
|
305
409
|
}
|
|
306
410
|
function conditionalHashMessage(hash) {
|
|
307
411
|
return hash;
|
|
@@ -3225,6 +3329,7 @@ var SPICE_COMBINED_FEE_RECIPIENT = SPICE_GAS_FEE_RECIPIENT;
|
|
|
3225
3329
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3226
3330
|
0 && (module.exports = {
|
|
3227
3331
|
CHAINS,
|
|
3332
|
+
CONDITIONAL_INTENT_UNTIL_CANCELLED,
|
|
3228
3333
|
CONDITIONAL_INTENT_VERSION,
|
|
3229
3334
|
ChainBatchHashAbi,
|
|
3230
3335
|
DELEGATE_ABI,
|
package/dist/index.js
CHANGED
|
@@ -53,6 +53,7 @@ async function getRecentBlock(publicClient) {
|
|
|
53
53
|
|
|
54
54
|
// src/conditionalIntents.ts
|
|
55
55
|
import { encodeAbiParameters as encodeAbiParameters2, keccak256 as keccak2562, stringToHex } from "viem";
|
|
56
|
+
var CONDITIONAL_INTENT_UNTIL_CANCELLED = 253402300799n;
|
|
56
57
|
var CONDITIONAL_INTENT_VERSION = 1;
|
|
57
58
|
var callTuple = [
|
|
58
59
|
{ name: "to", type: "address" },
|
|
@@ -73,44 +74,97 @@ var batchTuple = [
|
|
|
73
74
|
];
|
|
74
75
|
var zeroAddress = "0x0000000000000000000000000000000000000000";
|
|
75
76
|
function encodePlanTransfer(transfer) {
|
|
76
|
-
if (transfer.from === "solver")
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
if (transfer.from === "solver")
|
|
78
|
+
return [
|
|
79
|
+
1,
|
|
80
|
+
zeroAddress,
|
|
81
|
+
transfer.to,
|
|
82
|
+
transfer.token,
|
|
83
|
+
transfer.amount
|
|
84
|
+
];
|
|
85
|
+
if (transfer.from === "escrow")
|
|
86
|
+
return [
|
|
87
|
+
2,
|
|
88
|
+
zeroAddress,
|
|
89
|
+
transfer.to,
|
|
90
|
+
transfer.token,
|
|
91
|
+
transfer.amount
|
|
92
|
+
];
|
|
93
|
+
return [
|
|
94
|
+
0,
|
|
95
|
+
transfer.from,
|
|
96
|
+
transfer.to,
|
|
97
|
+
transfer.token,
|
|
98
|
+
transfer.amount
|
|
99
|
+
];
|
|
79
100
|
}
|
|
80
|
-
function hashConditionalExecutionPlan(batches, delegationAuthorizations = []) {
|
|
101
|
+
function hashConditionalExecutionPlan(batches, delegationAuthorizations = [], waits = []) {
|
|
81
102
|
const normalized = batches.map((batch) => [
|
|
82
103
|
BigInt(batch.chainId),
|
|
83
104
|
batch.calls,
|
|
84
105
|
batch.tokenTransfers.map(encodePlanTransfer)
|
|
85
106
|
]);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
{
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
BigInt(
|
|
107
|
-
|
|
108
|
-
auth
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
107
|
+
const baseHash = keccak2562(
|
|
108
|
+
encodeAbiParameters2(
|
|
109
|
+
[
|
|
110
|
+
{ type: "bytes32" },
|
|
111
|
+
{ type: "uint256" },
|
|
112
|
+
{ type: "tuple[]", components: batchTuple },
|
|
113
|
+
{
|
|
114
|
+
type: "tuple[]",
|
|
115
|
+
components: [
|
|
116
|
+
{ name: "address", type: "address" },
|
|
117
|
+
{ name: "chainId", type: "uint256" },
|
|
118
|
+
{ name: "nonce", type: "uint256" },
|
|
119
|
+
{ name: "r", type: "bytes32" },
|
|
120
|
+
{ name: "s", type: "bytes32" },
|
|
121
|
+
{ name: "yParity", type: "uint8" }
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
[
|
|
126
|
+
keccak2562(stringToHex("spice.conditional.execution-plan")),
|
|
127
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
128
|
+
normalized,
|
|
129
|
+
delegationAuthorizations.map((auth) => [
|
|
130
|
+
auth.address,
|
|
131
|
+
BigInt(auth.chainId),
|
|
132
|
+
BigInt(auth.nonce),
|
|
133
|
+
auth.r,
|
|
134
|
+
auth.s,
|
|
135
|
+
auth.yParity ?? 0
|
|
136
|
+
])
|
|
137
|
+
]
|
|
138
|
+
)
|
|
139
|
+
);
|
|
140
|
+
if (!waits.length) return baseHash;
|
|
141
|
+
return keccak2562(
|
|
142
|
+
encodeAbiParameters2(
|
|
143
|
+
[
|
|
144
|
+
{ type: "bytes32" },
|
|
145
|
+
{ type: "bytes32" },
|
|
146
|
+
{
|
|
147
|
+
type: "tuple[]",
|
|
148
|
+
components: [
|
|
149
|
+
{ name: "batchIndex", type: "uint256" },
|
|
150
|
+
{ name: "to", type: "address" },
|
|
151
|
+
{ name: "data", type: "bytes" },
|
|
152
|
+
{ name: "expected", type: "uint256" }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
[
|
|
157
|
+
keccak2562(stringToHex("spice.conditional.execution-waits.v1")),
|
|
158
|
+
baseHash,
|
|
159
|
+
waits.map((w) => ({
|
|
160
|
+
batchIndex: BigInt(w.batchIndex),
|
|
161
|
+
to: w.to,
|
|
162
|
+
data: w.data,
|
|
163
|
+
expected: w.expected
|
|
164
|
+
}))
|
|
165
|
+
]
|
|
166
|
+
)
|
|
167
|
+
);
|
|
114
168
|
}
|
|
115
169
|
var authorizationTypes = [
|
|
116
170
|
{ name: "domain", type: "bytes32" },
|
|
@@ -136,76 +190,125 @@ function semanticsValue(value) {
|
|
|
136
190
|
return value === "state" ? 0 : 1;
|
|
137
191
|
}
|
|
138
192
|
function hashConditionalIntentAuthorization(value) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
193
|
+
const original = keccak2562(
|
|
194
|
+
encodeAbiParameters2(authorizationTypes, [
|
|
195
|
+
hashText("spice.conditional.authorization"),
|
|
196
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
197
|
+
value.owner,
|
|
198
|
+
hashText(value.clientId),
|
|
199
|
+
hashText(value.serviceId),
|
|
200
|
+
value.authorizationNonce,
|
|
201
|
+
value.executionDigest,
|
|
202
|
+
value.executionPlanHash,
|
|
203
|
+
value.triggerSpecificationHash,
|
|
204
|
+
value.evaluator,
|
|
205
|
+
semanticsValue(value.semantics),
|
|
206
|
+
value.maxSignalAgeSeconds,
|
|
207
|
+
value.validAfter,
|
|
208
|
+
value.expiresAt,
|
|
209
|
+
BigInt(value.maxExecutions)
|
|
210
|
+
])
|
|
211
|
+
);
|
|
212
|
+
return value.replacesIntentId ? keccak2562(
|
|
213
|
+
encodeAbiParameters2(
|
|
214
|
+
[{ type: "bytes32" }, { type: "bytes32" }, { type: "bytes32" }],
|
|
215
|
+
[
|
|
216
|
+
hashText("spice.conditional.amendment.v1"),
|
|
217
|
+
value.replacesIntentId,
|
|
218
|
+
original
|
|
219
|
+
]
|
|
220
|
+
)
|
|
221
|
+
) : original;
|
|
156
222
|
}
|
|
157
223
|
function getConditionalIntentId(authorizationHash) {
|
|
158
|
-
return keccak2562(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
224
|
+
return keccak2562(
|
|
225
|
+
encodeAbiParameters2(
|
|
226
|
+
[{ type: "bytes32" }, { type: "bytes32" }],
|
|
227
|
+
[hashText("spice.conditional.intent-id"), authorizationHash]
|
|
228
|
+
)
|
|
229
|
+
);
|
|
162
230
|
}
|
|
163
231
|
function hashConditionalSignal(value, serviceId) {
|
|
164
|
-
return keccak2562(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
232
|
+
return keccak2562(
|
|
233
|
+
encodeAbiParameters2(
|
|
234
|
+
[
|
|
235
|
+
{ name: "domain", type: "bytes32" },
|
|
236
|
+
{ name: "version", type: "uint256" },
|
|
237
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
238
|
+
{ name: "intentId", type: "bytes32" },
|
|
239
|
+
{ name: "executionDigest", type: "bytes32" },
|
|
240
|
+
{ name: "triggerSpecificationHash", type: "bytes32" },
|
|
241
|
+
{ name: "signalIdHash", type: "bytes32" },
|
|
242
|
+
{ name: "observedAt", type: "uint256" },
|
|
243
|
+
{ name: "validUntil", type: "uint256" },
|
|
244
|
+
{ name: "satisfied", type: "bool" },
|
|
245
|
+
{ name: "evidenceHash", type: "bytes32" }
|
|
246
|
+
],
|
|
247
|
+
[
|
|
248
|
+
hashText("spice.conditional.signal"),
|
|
249
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
250
|
+
hashText(serviceId),
|
|
251
|
+
value.intentId,
|
|
252
|
+
value.executionDigest,
|
|
253
|
+
value.triggerSpecificationHash,
|
|
254
|
+
hashText(value.signalId),
|
|
255
|
+
value.observedAt,
|
|
256
|
+
value.validUntil,
|
|
257
|
+
value.satisfied,
|
|
258
|
+
value.evidenceHash ?? "0x" + "00".repeat(32)
|
|
259
|
+
]
|
|
260
|
+
)
|
|
261
|
+
);
|
|
180
262
|
}
|
|
181
263
|
function hashConditionalCancellation(value) {
|
|
182
|
-
return keccak2562(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
264
|
+
return keccak2562(
|
|
265
|
+
encodeAbiParameters2(
|
|
266
|
+
[
|
|
267
|
+
{ name: "domain", type: "bytes32" },
|
|
268
|
+
{ name: "version", type: "uint256" },
|
|
269
|
+
{ name: "owner", type: "address" },
|
|
270
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
271
|
+
{ name: "intentId", type: "bytes32" },
|
|
272
|
+
{ name: "cancellationNonce", type: "uint256" },
|
|
273
|
+
{ name: "expiresAt", type: "uint256" }
|
|
274
|
+
],
|
|
275
|
+
[
|
|
276
|
+
hashText("spice.conditional.cancel"),
|
|
277
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
278
|
+
value.owner,
|
|
279
|
+
hashText(value.serviceId),
|
|
280
|
+
value.intentId,
|
|
281
|
+
value.cancellationNonce,
|
|
282
|
+
value.expiresAt
|
|
283
|
+
]
|
|
284
|
+
)
|
|
285
|
+
);
|
|
194
286
|
}
|
|
195
287
|
function hashConditionalReadAuthorization(value) {
|
|
196
|
-
return keccak2562(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
288
|
+
return keccak2562(
|
|
289
|
+
encodeAbiParameters2(
|
|
290
|
+
[
|
|
291
|
+
{ name: "domain", type: "bytes32" },
|
|
292
|
+
{ name: "version", type: "uint256" },
|
|
293
|
+
{ name: "owner", type: "address" },
|
|
294
|
+
{ name: "reader", type: "address" },
|
|
295
|
+
{ name: "serviceIdHash", type: "bytes32" },
|
|
296
|
+
{ name: "intentId", type: "bytes32" },
|
|
297
|
+
{ name: "expiresAt", type: "uint256" },
|
|
298
|
+
{ name: "nonce", type: "uint256" }
|
|
299
|
+
],
|
|
300
|
+
[
|
|
301
|
+
hashText("spice.conditional.read"),
|
|
302
|
+
BigInt(CONDITIONAL_INTENT_VERSION),
|
|
303
|
+
value.owner,
|
|
304
|
+
value.reader,
|
|
305
|
+
hashText(value.serviceId),
|
|
306
|
+
value.intentId ?? "0x" + "00".repeat(32),
|
|
307
|
+
value.expiresAt,
|
|
308
|
+
value.nonce
|
|
309
|
+
]
|
|
310
|
+
)
|
|
311
|
+
);
|
|
209
312
|
}
|
|
210
313
|
function conditionalHashMessage(hash) {
|
|
211
314
|
return hash;
|
|
@@ -3136,6 +3239,7 @@ var SPICE_PLATFORM_FEE_RECIPIENT = "0xa4bB4c1D188B94c0cF691Dad213dE24169fA0A50";
|
|
|
3136
3239
|
var SPICE_COMBINED_FEE_RECIPIENT = SPICE_GAS_FEE_RECIPIENT;
|
|
3137
3240
|
export {
|
|
3138
3241
|
CHAINS,
|
|
3242
|
+
CONDITIONAL_INTENT_UNTIL_CANCELLED,
|
|
3139
3243
|
CONDITIONAL_INTENT_VERSION,
|
|
3140
3244
|
ChainBatchHashAbi,
|
|
3141
3245
|
DELEGATE_ABI,
|