0xtrails 0.2.0 → 0.2.1
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/dist/analytics.d.ts +1 -0
- package/dist/analytics.d.ts.map +1 -1
- package/dist/{ccip-D6ToCrWc.js → ccip-BbfANth7.js} +1 -1
- package/dist/chains.d.ts.map +1 -1
- package/dist/config.d.ts +1 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/constants.d.ts +2 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/gasless.d.ts +19 -7
- package/dist/gasless.d.ts.map +1 -1
- package/dist/{index-BqgeTLL8.js → index-WpIVoh3X.js} +27626 -26572
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -68
- package/dist/indexerClient.d.ts +10 -0
- package/dist/indexerClient.d.ts.map +1 -1
- package/dist/intentEntrypoint.d.ts +40 -14
- package/dist/intentEntrypoint.d.ts.map +1 -1
- package/dist/intents.d.ts.map +1 -1
- package/dist/prepareSend.d.ts +11 -8
- package/dist/prepareSend.d.ts.map +1 -1
- package/dist/relayer.d.ts.map +1 -1
- package/dist/trails.d.ts.map +1 -1
- package/dist/trailsClient.d.ts.map +1 -1
- package/dist/trailsRouter.d.ts +22 -0
- package/dist/trailsRouter.d.ts.map +1 -0
- package/dist/transactions.d.ts +0 -1
- package/dist/transactions.d.ts.map +1 -1
- package/dist/widget/components/AccountSettings.d.ts.map +1 -1
- package/dist/widget/components/ClassicSwap.d.ts.map +1 -1
- package/dist/widget/components/ConfigDisplay.d.ts.map +1 -1
- package/dist/widget/components/ConnectWallet.d.ts.map +1 -1
- package/dist/widget/components/ConnectedWallets.d.ts.map +1 -1
- package/dist/widget/components/Earn.d.ts.map +1 -1
- package/dist/widget/components/FeeOption.d.ts +22 -0
- package/dist/widget/components/FeeOption.d.ts.map +1 -0
- package/dist/widget/components/FeeOptions.d.ts +13 -17
- package/dist/widget/components/FeeOptions.d.ts.map +1 -1
- package/dist/widget/components/Fund.d.ts.map +1 -1
- package/dist/widget/components/FundMethods.d.ts +1 -1
- package/dist/widget/components/FundMethods.d.ts.map +1 -1
- package/dist/widget/components/FundSendForm.d.ts.map +1 -1
- package/dist/widget/components/MeshConnectExchanges.d.ts +5 -2
- package/dist/widget/components/MeshConnectExchanges.d.ts.map +1 -1
- package/dist/widget/components/MeshConnectFlow.d.ts +2 -0
- package/dist/widget/components/MeshConnectFlow.d.ts.map +1 -1
- package/dist/widget/components/NativeGasOption.d.ts +12 -0
- package/dist/widget/components/NativeGasOption.d.ts.map +1 -0
- package/dist/widget/components/Pay.d.ts.map +1 -1
- package/dist/widget/components/PaySendForm.d.ts.map +1 -1
- package/dist/widget/components/QuoteDetails.d.ts.map +1 -1
- package/dist/widget/components/TokenSelector.d.ts.map +1 -1
- package/dist/widget/components/UserPreferences.d.ts.map +1 -1
- package/dist/widget/hooks/useBack.d.ts +2 -0
- package/dist/widget/hooks/useBack.d.ts.map +1 -1
- package/dist/widget/hooks/useCurrentScreen.d.ts +1 -1
- package/dist/widget/hooks/useCurrentScreen.d.ts.map +1 -1
- package/dist/widget/hooks/useDefaultTokenSelection.d.ts.map +1 -1
- package/dist/widget/hooks/useSelectedFeeToken.d.ts +32 -0
- package/dist/widget/hooks/useSelectedFeeToken.d.ts.map +1 -0
- package/dist/widget/hooks/useSelectedMeshExchange.d.ts +14 -0
- package/dist/widget/hooks/useSelectedMeshExchange.d.ts.map +1 -0
- package/dist/widget/hooks/useSendForm.d.ts +8 -13
- package/dist/widget/hooks/useSendForm.d.ts.map +1 -1
- package/dist/widget/index.js +1 -1
- package/dist/widget/widget.d.ts.map +1 -1
- package/package.json +29 -28
- package/src/analytics.ts +6 -0
- package/src/chains.ts +10 -0
- package/src/config.ts +25 -10
- package/src/constants.ts +11 -10
- package/src/gasless.ts +162 -109
- package/src/index.ts +1 -1
- package/src/indexerClient.ts +73 -1
- package/src/intentEntrypoint.ts +66 -101
- package/src/intents.ts +0 -2
- package/src/prepareSend.ts +1409 -887
- package/src/relayer.ts +4 -3
- package/src/trails.ts +1 -3
- package/src/trailsClient.ts +4 -1
- package/src/{balanceInjector.ts → trailsRouter.ts} +14 -14
- package/src/transactions.ts +4 -54
- package/src/widget/compiled.css +1 -1
- package/src/widget/components/AccountSettings.tsx +7 -1
- package/src/widget/components/ClassicSwap.tsx +173 -175
- package/src/widget/components/ConfigDisplay.tsx +34 -1
- package/src/widget/components/ConnectWallet.tsx +168 -11
- package/src/widget/components/ConnectedWallets.tsx +184 -102
- package/src/widget/components/DebugToast.tsx +3 -3
- package/src/widget/components/Earn.tsx +4 -27
- package/src/widget/components/FeeOption.tsx +78 -0
- package/src/widget/components/FeeOptions.tsx +192 -127
- package/src/widget/components/Fund.tsx +18 -27
- package/src/widget/components/FundMethods.tsx +3 -3
- package/src/widget/components/FundSendForm.tsx +0 -33
- package/src/widget/components/MeshConnectExchanges.tsx +32 -3
- package/src/widget/components/MeshConnectFlow.tsx +23 -4
- package/src/widget/components/NativeGasOption.tsx +99 -0
- package/src/widget/components/Pay.tsx +36 -32
- package/src/widget/components/PaySendForm.tsx +0 -37
- package/src/widget/components/QuoteDetails.tsx +0 -29
- package/src/widget/components/TokenSelector.tsx +11 -0
- package/src/widget/components/TransferPendingVertical.tsx +1 -1
- package/src/widget/components/UserPreferences.tsx +3 -4
- package/src/widget/hooks/useBack.tsx +4 -0
- package/src/widget/hooks/useCurrentScreen.tsx +1 -0
- package/src/widget/hooks/useDefaultTokenSelection.tsx +3 -7
- package/src/widget/hooks/useSelectedFeeToken.tsx +299 -0
- package/src/widget/hooks/useSelectedMeshExchange.tsx +46 -0
- package/src/widget/hooks/useSendForm.ts +78 -23
- package/src/widget/widget.tsx +173 -111
- package/dist/balanceInjector.d.ts +0 -22
- package/dist/balanceInjector.d.ts.map +0 -1
package/dist/widget/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../../src/widget/widget.tsx"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAA;AAIzC,OAAO,KAUN,MAAM,OAAO,CAAA;AAKd,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAWtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAoExC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAItC,OAAO,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../../src/widget/widget.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xtrails",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "SDK for Trails",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,51 +22,43 @@
|
|
|
22
22
|
"author": "",
|
|
23
23
|
"license": "Apache-2.0",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@0xsequence/account": "^2.3.
|
|
26
|
-
"@0xsequence/api": "^2.3.
|
|
27
|
-
"@0xsequence/connect": "^5.3.
|
|
28
|
-
"@0xsequence/core": "^2.3.
|
|
25
|
+
"@0xsequence/account": "^2.3.30",
|
|
26
|
+
"@0xsequence/api": "^2.3.30",
|
|
27
|
+
"@0xsequence/connect": "^5.3.23",
|
|
28
|
+
"@0xsequence/core": "^2.3.30",
|
|
29
29
|
"@0xsequence/design-system": "^2.2.5",
|
|
30
|
-
"@0xsequence/guard": "^2.3.
|
|
31
|
-
"@0xsequence/hooks": "^5.3.
|
|
32
|
-
"@0xsequence/indexer": "^2.3.
|
|
33
|
-
"@0xsequence/metadata": "^2.3.
|
|
34
|
-
"@0xsequence/network": "^2.3.
|
|
35
|
-
"@0xsequence/relayer": "^2.3.
|
|
36
|
-
"@0xsequence/sessions": "^2.3.
|
|
37
|
-
"@0xsequence/signhub": "^2.3.
|
|
38
|
-
"@0xsequence/trails-api": "^0.1.
|
|
30
|
+
"@0xsequence/guard": "^2.3.30",
|
|
31
|
+
"@0xsequence/hooks": "^5.3.23",
|
|
32
|
+
"@0xsequence/indexer": "^2.3.30",
|
|
33
|
+
"@0xsequence/metadata": "^2.3.30",
|
|
34
|
+
"@0xsequence/network": "^2.3.30",
|
|
35
|
+
"@0xsequence/relayer": "^2.3.30",
|
|
36
|
+
"@0xsequence/sessions": "^2.3.30",
|
|
37
|
+
"@0xsequence/signhub": "^2.3.30",
|
|
38
|
+
"@0xsequence/trails-api": "^0.1.1",
|
|
39
39
|
"@0xsequence/wallet-core": "^0.0.0-20250917144328",
|
|
40
40
|
"@0xsequence/wallet-primitives": "^0.0.0-20250917144328",
|
|
41
41
|
"@aave/react": "^0.4.0",
|
|
42
42
|
"@databeat/tracker": "^0.9.3",
|
|
43
|
+
"@emotion/is-prop-valid": "^1.3.4",
|
|
43
44
|
"@meshconnect/web-link-sdk": "3.2.14",
|
|
44
45
|
"@reservoir0x/relay-sdk": "^2.4.0",
|
|
45
|
-
"@tanstack/react-query": "5.90.
|
|
46
|
+
"@tanstack/react-query": "^5.90.3",
|
|
46
47
|
"@types/qrcode": "^1.5.5",
|
|
47
48
|
"buffer": "^6.0.3",
|
|
48
|
-
"framer-motion": "^12.23.
|
|
49
|
+
"framer-motion": "^12.23.24",
|
|
49
50
|
"lucide-react": "^0.493.0",
|
|
50
|
-
"motion": "^12.23.
|
|
51
|
+
"motion": "^12.23.24",
|
|
51
52
|
"ox": "^0.7.2",
|
|
52
53
|
"qrcode": "^1.5.4"
|
|
53
54
|
},
|
|
54
|
-
"peerDependencies": {
|
|
55
|
-
"@0xsequence/hooks": "^5.3.13",
|
|
56
|
-
"@tanstack/react-query": "^5.85.5",
|
|
57
|
-
"ethers": "^6.15.0",
|
|
58
|
-
"react": "^19.0.0",
|
|
59
|
-
"react-dom": "^19.0.0",
|
|
60
|
-
"viem": "^2.37.11",
|
|
61
|
-
"wagmi": "^2.16.9"
|
|
62
|
-
},
|
|
63
55
|
"devDependencies": {
|
|
64
56
|
"@tailwindcss/cli": "^4.1.14",
|
|
65
57
|
"@testing-library/jest-dom": "^6.9.1",
|
|
66
58
|
"@testing-library/react": "^16.3.0",
|
|
67
|
-
"@types/node": "^22.18.
|
|
59
|
+
"@types/node": "^22.18.10",
|
|
68
60
|
"@types/react": "^19.2.2",
|
|
69
|
-
"@types/react-dom": "^19.2.
|
|
61
|
+
"@types/react-dom": "^19.2.2",
|
|
70
62
|
"@vitejs/plugin-react": "^4.7.0",
|
|
71
63
|
"dotenv": "^16.6.1",
|
|
72
64
|
"globals": "^15.15.0",
|
|
@@ -81,6 +73,15 @@
|
|
|
81
73
|
"vite-plugin-dts": "^4.5.4",
|
|
82
74
|
"vitest": "^3.2.4"
|
|
83
75
|
},
|
|
76
|
+
"peerDependencies": {
|
|
77
|
+
"@0xsequence/hooks": "^5.3.23",
|
|
78
|
+
"@tanstack/react-query": "^5.90.3",
|
|
79
|
+
"ethers": "^6.15.0",
|
|
80
|
+
"react": "^19.2.0",
|
|
81
|
+
"react-dom": "^19.2.0",
|
|
82
|
+
"viem": "^2.38.2",
|
|
83
|
+
"wagmi": "^2.18.0"
|
|
84
|
+
},
|
|
84
85
|
"exports": {
|
|
85
86
|
".": {
|
|
86
87
|
"import": "./dist/index.js",
|
package/src/analytics.ts
CHANGED
|
@@ -4,9 +4,14 @@ import { DATABEAT_KEY, DATABEAT_SERVER } from "./constants.js"
|
|
|
4
4
|
import { getQueryParam } from "./queryParams.js"
|
|
5
5
|
import { getSequenceProjectAccessKey, getEnvVar } from "./config.js"
|
|
6
6
|
import { logger } from "./logger.js"
|
|
7
|
+
import packageJson from "../package.json" with { type: "json" }
|
|
7
8
|
|
|
8
9
|
let checkoutIdSingleton: string | null = null
|
|
9
10
|
|
|
11
|
+
export function getSdkVersion() {
|
|
12
|
+
return packageJson.version || "dev"
|
|
13
|
+
}
|
|
14
|
+
|
|
10
15
|
export function hasCheckoutId() {
|
|
11
16
|
return checkoutIdSingleton !== null
|
|
12
17
|
}
|
|
@@ -180,6 +185,7 @@ abstract class BaseAnalytics {
|
|
|
180
185
|
...this.getDocumentProps(),
|
|
181
186
|
...this.getWindowProps(),
|
|
182
187
|
sequenceProjectAccessKey: getSequenceProjectAccessKey(),
|
|
188
|
+
sdkVersion: getSdkVersion(),
|
|
183
189
|
}
|
|
184
190
|
}
|
|
185
191
|
|
package/src/chains.ts
CHANGED
|
@@ -197,6 +197,16 @@ export function getChainInfo(
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
+
// Override explorer URLs for specific chains
|
|
201
|
+
if (chainId === katana.id && chainInfo) {
|
|
202
|
+
chainInfo.blockExplorers = {
|
|
203
|
+
default: {
|
|
204
|
+
name: "Katanascan",
|
|
205
|
+
url: "https://katanascan.com", // use katanascan instead of explorer.katanarpc.com
|
|
206
|
+
},
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
200
210
|
return chainInfo
|
|
201
211
|
}
|
|
202
212
|
|
package/src/config.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./constants.js"
|
|
16
16
|
import { getQueryParam } from "./queryParams.js"
|
|
17
17
|
|
|
18
|
-
type SequenceEnv = "prod" | "dev" | "local" | "cors-anywhere"
|
|
18
|
+
export type SequenceEnv = "prod" | "dev" | "local" | "cors-anywhere"
|
|
19
19
|
|
|
20
20
|
export const globalConfig: {
|
|
21
21
|
sequenceProjectAccessKey: string
|
|
@@ -53,12 +53,18 @@ export function declareSequenceEnv(): SequenceEnv {
|
|
|
53
53
|
if (getEnvVar("ENV") === "development" || getEnvVar("ENV") === "dev") {
|
|
54
54
|
return "dev"
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
|
|
57
|
+
// Special handling for Cloudflare Pages branches
|
|
58
|
+
const cfPagesBranch = getEnvVar("CF_PAGES_BRANCH")
|
|
59
|
+
if (cfPagesBranch) {
|
|
60
|
+
// If running on Cloudflare Pages, all branches except "production" default to dev
|
|
61
|
+
if (cfPagesBranch === "prod" || cfPagesBranch === "production") {
|
|
62
|
+
return "prod"
|
|
63
|
+
}
|
|
64
|
+
return "dev"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (getEnvVar("ENV") === "production" || getEnvVar("ENV") === "prod") {
|
|
62
68
|
return "prod"
|
|
63
69
|
}
|
|
64
70
|
}
|
|
@@ -101,14 +107,21 @@ export function declareSequenceNodeGatewayUrl() {
|
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
export function declareSequenceProjectAccessKey() {
|
|
110
|
+
const sequenceEnv = declareSequenceEnv()
|
|
111
|
+
|
|
112
|
+
// Check for explicit env var override
|
|
104
113
|
if (typeof process !== "undefined") {
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
const envVarKey = getEnvVar("SEQUENCE_PROJECT_ACCESS_KEY")
|
|
115
|
+
if (envVarKey) {
|
|
116
|
+
return envVarKey
|
|
107
117
|
}
|
|
108
118
|
}
|
|
109
|
-
|
|
119
|
+
|
|
120
|
+
// Use dev/prod keys based on environment
|
|
121
|
+
if (sequenceEnv === "prod") {
|
|
110
122
|
return PROD_SEQUENCE_PROJECT_ACCESS_KEY
|
|
111
123
|
}
|
|
124
|
+
|
|
112
125
|
return DEV_SEQUENCE_PROJECT_ACCESS_KEY
|
|
113
126
|
}
|
|
114
127
|
|
|
@@ -176,6 +189,7 @@ export function setSequenceEnv(sequenceEnv: SequenceEnv) {
|
|
|
176
189
|
setSequenceApiUrl(PROD_SEQUENCE_API_URL)
|
|
177
190
|
setTrailsApiUrl(PROD_TRAILS_API_URL)
|
|
178
191
|
setSequenceNodeGatewayUrl(PROD_SEQUENCE_NODE_GATEWAY_URL)
|
|
192
|
+
setSequenceProjectAccessKey(PROD_SEQUENCE_PROJECT_ACCESS_KEY)
|
|
179
193
|
}
|
|
180
194
|
|
|
181
195
|
if (sequenceEnv === "local") {
|
|
@@ -192,6 +206,7 @@ export function setSequenceEnv(sequenceEnv: SequenceEnv) {
|
|
|
192
206
|
setSequenceApiUrl(DEV_SEQUENCE_API_URL)
|
|
193
207
|
setTrailsApiUrl(DEV_TRAILS_API_URL)
|
|
194
208
|
setSequenceNodeGatewayUrl(DEV_SEQUENCE_NODE_GATEWAY_URL)
|
|
209
|
+
setSequenceProjectAccessKey(DEV_SEQUENCE_PROJECT_ACCESS_KEY)
|
|
195
210
|
}
|
|
196
211
|
}
|
|
197
212
|
|
package/src/constants.ts
CHANGED
|
@@ -14,10 +14,13 @@ export const SEQUENCE_V3_CONTRACT_ADDRESSES_OVERRIDES: AddressOverrides = {
|
|
|
14
14
|
sequenceWalletMainModuleAddress: SEQUENCE_V3_CONTRACT_ADDRESSES.stage1,
|
|
15
15
|
sequenceWalletMainModuleUpgradableAddress:
|
|
16
16
|
SEQUENCE_V3_CONTRACT_ADDRESSES.stage2,
|
|
17
|
-
}
|
|
17
|
+
} as AddressOverrides
|
|
18
|
+
|
|
19
|
+
export const TRAILS_ROUTER_ADDRESS =
|
|
20
|
+
"0x07abd6f71aE3EAD08b2B6D5d091eE24d32dc1Dfa"
|
|
18
21
|
|
|
19
|
-
export const
|
|
20
|
-
"
|
|
22
|
+
export const TRAILS_INTENT_ENTRYPOINT_ADDRESS =
|
|
23
|
+
"0xf9dF60584Da03f8D83fF1Bed663465734B2221a7"
|
|
21
24
|
|
|
22
25
|
export const ATTESATION_SIGNER_ADDRESS =
|
|
23
26
|
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
|
|
@@ -33,12 +36,12 @@ export const DEV_SEQUENCE_INDEXER_URL = "https://dev-indexer.sequence.app"
|
|
|
33
36
|
export const DEV_SEQUENCE_API_URL = "https://dev-api.sequence.app"
|
|
34
37
|
export const DEV_TRAILS_API_URL = "https://dev-trails-api.sequence-dev.app"
|
|
35
38
|
|
|
39
|
+
// TODO: Update with new single address once latest contracts are deployed
|
|
36
40
|
export const intentEntrypoints: Record<number, `0x${string}`> = {
|
|
37
|
-
8453: "
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
137: "0x4dBb20eA3A969F1A44d7653D4Dc8632B853E36DE",
|
|
41
|
+
8453: "0x80DB82D640F9Df20Cfe89fa4E70B0EcC56f3715c", // Base
|
|
42
|
+
42161: "0x20CC15eb516Ba56398c28CE1A567e3a82889Db46", // Arbitrum One
|
|
43
|
+
137: "0x1C69bCdcD751785F2a3b815333B46AB150370E6E", // Polygon
|
|
44
|
+
747474: "0x814A110fF7c664C26e6c3e2E6E85C23291e4359e", // Katana
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
// This is used for Sequence Indexer and API
|
|
@@ -57,5 +60,3 @@ export const DEFAULT_WALLETCONNECT_PROJECT_ID =
|
|
|
57
60
|
export const SITE_URL = "https://trails.build/"
|
|
58
61
|
|
|
59
62
|
export const DEFAULT_SLIPPAGE_TOLERANCE = "0.05" // 0.001 = 0.1%, 0.005 = 0.5%, 0.03 = 3%, 0.05 = 5%
|
|
60
|
-
|
|
61
|
-
export const MINIMUM_USD_AMOUNT_FOR_SWAP = "0.15"
|
package/src/gasless.ts
CHANGED
|
@@ -6,17 +6,13 @@ import type {
|
|
|
6
6
|
PublicClient,
|
|
7
7
|
WalletClient,
|
|
8
8
|
} from "viem"
|
|
9
|
-
import {
|
|
10
|
-
encodeFunctionData,
|
|
11
|
-
erc20Abi,
|
|
12
|
-
getAddress,
|
|
13
|
-
maxUint256,
|
|
14
|
-
parseAbi,
|
|
15
|
-
} from "viem"
|
|
9
|
+
import { encodeFunctionData, erc20Abi, getAddress, parseAbi } from "viem"
|
|
16
10
|
import { PERMIT_ABI, TRANSFER_ABI, TRANSFER_FROM_ABI } from "./abi.js"
|
|
17
11
|
import { attemptSwitchChain } from "./chainSwitch.js"
|
|
18
12
|
import { logger } from "./logger.js"
|
|
19
13
|
|
|
14
|
+
const intentEntrypointDomainName = "TrailsIntentEntrypoint"
|
|
15
|
+
|
|
20
16
|
export function splitSignature(signature: `0x${string}`): {
|
|
21
17
|
r: `0x${string}`
|
|
22
18
|
s: `0x${string}`
|
|
@@ -159,6 +155,14 @@ export async function getPermitSignature({
|
|
|
159
155
|
throw new Error("No account found")
|
|
160
156
|
}
|
|
161
157
|
|
|
158
|
+
// Validate that the connected wallet matches the token owner
|
|
159
|
+
if (walletClient.account.address.toLowerCase() !== signer.toLowerCase()) {
|
|
160
|
+
throw new Error(
|
|
161
|
+
`Connected wallet (${walletClient.account.address}) does not match token owner (${signer}). ` +
|
|
162
|
+
`Please connect the wallet that owns the tokens.`,
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
162
166
|
// Get permit signature from connected account
|
|
163
167
|
const nonce = await publicClient.readContract({
|
|
164
168
|
address: tokenAddress as `0x${string}`,
|
|
@@ -204,16 +208,71 @@ export async function getPermitSignature({
|
|
|
204
208
|
],
|
|
205
209
|
functionName: "version",
|
|
206
210
|
})) as string
|
|
207
|
-
|
|
211
|
+
logger.console.log("[trails-sdk] Token version from contract:", version)
|
|
212
|
+
} catch (error) {
|
|
208
213
|
logger.console.warn(
|
|
209
214
|
"[trails-sdk] Token does not implement version(), defaulting to '1'",
|
|
215
|
+
error,
|
|
210
216
|
)
|
|
211
217
|
}
|
|
212
218
|
|
|
213
|
-
|
|
219
|
+
// Special handling for Katana chain (747474)
|
|
220
|
+
// Katana USDC contract returns "0.5.0" from version() but uses "1" for EIP-712 domain
|
|
221
|
+
// The contract's version() is the implementation version, not the EIP-712 domain version
|
|
222
|
+
if (chain.id === 747474) {
|
|
223
|
+
logger.console.log(
|
|
224
|
+
"[trails-sdk] Katana chain detected, overriding version to '1' for EIP-712 domain compatibility",
|
|
225
|
+
)
|
|
226
|
+
version = "1"
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Log domain parameters for debugging
|
|
230
|
+
logger.console.log("[trails-sdk] Permit domain parameters:", {
|
|
214
231
|
name,
|
|
215
232
|
version,
|
|
216
233
|
chainId: chain.id,
|
|
234
|
+
verifyingContract: tokenAddress,
|
|
235
|
+
signer,
|
|
236
|
+
spender,
|
|
237
|
+
amount: amount.toString(),
|
|
238
|
+
nonce: nonce.toString(),
|
|
239
|
+
deadline: deadline.toString(),
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
// Try to read the domain separator from the contract for comparison
|
|
243
|
+
let contractDomainSeparator: string | null = null
|
|
244
|
+
try {
|
|
245
|
+
contractDomainSeparator = (await publicClient.readContract({
|
|
246
|
+
address: tokenAddress as `0x${string}`,
|
|
247
|
+
abi: [
|
|
248
|
+
{
|
|
249
|
+
name: "DOMAIN_SEPARATOR",
|
|
250
|
+
type: "function",
|
|
251
|
+
stateMutability: "view",
|
|
252
|
+
inputs: [],
|
|
253
|
+
outputs: [{ name: "", type: "bytes32" }],
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
functionName: "DOMAIN_SEPARATOR",
|
|
257
|
+
})) as string
|
|
258
|
+
logger.console.log(
|
|
259
|
+
"[trails-sdk] Contract domain separator:",
|
|
260
|
+
contractDomainSeparator,
|
|
261
|
+
)
|
|
262
|
+
} catch (error) {
|
|
263
|
+
logger.console.warn(
|
|
264
|
+
"[trails-sdk] Could not read DOMAIN_SEPARATOR from contract:",
|
|
265
|
+
error,
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Special handling for Katana chain ID
|
|
270
|
+
const chainId = chain.id
|
|
271
|
+
|
|
272
|
+
const domain = {
|
|
273
|
+
name,
|
|
274
|
+
version,
|
|
275
|
+
chainId,
|
|
217
276
|
verifyingContract: tokenAddress as `0x${string}`,
|
|
218
277
|
}
|
|
219
278
|
|
|
@@ -242,6 +301,7 @@ export async function getPermitSignature({
|
|
|
242
301
|
})
|
|
243
302
|
|
|
244
303
|
logger.console.log("[trails-sdk] Requesting permit signature...")
|
|
304
|
+
logger.console.log("[trails-sdk] Permit data:", permitData)
|
|
245
305
|
|
|
246
306
|
const signature = await walletClient.signTypedData({
|
|
247
307
|
account: walletClient.account,
|
|
@@ -251,6 +311,8 @@ export async function getPermitSignature({
|
|
|
251
311
|
message: permitData,
|
|
252
312
|
})
|
|
253
313
|
|
|
314
|
+
logger.console.log("[trails-sdk] Permit signature created:", signature)
|
|
315
|
+
|
|
254
316
|
const { v, r, s } = splitSignature(signature)
|
|
255
317
|
|
|
256
318
|
return { signature, deadline, v, r, s }
|
|
@@ -262,6 +324,10 @@ export type GetDepositToIntentWithPermitCalldataParams = {
|
|
|
262
324
|
amount: bigint
|
|
263
325
|
intentAddress: `0x${string}`
|
|
264
326
|
deadline: bigint
|
|
327
|
+
nonce: bigint
|
|
328
|
+
feeToken: `0x${string}`
|
|
329
|
+
feeAmount: bigint
|
|
330
|
+
feeCollector: `0x${string}`
|
|
265
331
|
permitAmount: bigint
|
|
266
332
|
// permit signature
|
|
267
333
|
v: number
|
|
@@ -279,6 +345,10 @@ export function getDepositToIntentWithPermitCalldata({
|
|
|
279
345
|
amount,
|
|
280
346
|
intentAddress,
|
|
281
347
|
deadline,
|
|
348
|
+
nonce,
|
|
349
|
+
feeToken,
|
|
350
|
+
feeAmount,
|
|
351
|
+
feeCollector,
|
|
282
352
|
permitAmount,
|
|
283
353
|
v,
|
|
284
354
|
r,
|
|
@@ -288,7 +358,7 @@ export function getDepositToIntentWithPermitCalldata({
|
|
|
288
358
|
sigS,
|
|
289
359
|
}: GetDepositToIntentWithPermitCalldataParams): Hex {
|
|
290
360
|
const abi = parseAbi([
|
|
291
|
-
"function depositToIntentWithPermit(address user, address token, uint256 amount, uint256 permitAmount, address intentAddress, uint256 deadline, uint8 v, bytes32 r, bytes32 s, uint8 sigV, bytes32 sigR, bytes32 sigS)",
|
|
361
|
+
"function depositToIntentWithPermit(address user, address token, uint256 amount, uint256 permitAmount, address intentAddress, uint256 deadline, uint256 nonce, address feeToken, uint256 feeAmount, address feeCollector, uint8 v, bytes32 r, bytes32 s, uint8 sigV, bytes32 sigR, bytes32 sigS)",
|
|
292
362
|
])
|
|
293
363
|
|
|
294
364
|
return encodeFunctionData({
|
|
@@ -301,6 +371,10 @@ export function getDepositToIntentWithPermitCalldata({
|
|
|
301
371
|
permitAmount,
|
|
302
372
|
intentAddress,
|
|
303
373
|
deadline,
|
|
374
|
+
nonce,
|
|
375
|
+
feeToken,
|
|
376
|
+
feeAmount,
|
|
377
|
+
feeCollector,
|
|
304
378
|
v,
|
|
305
379
|
r,
|
|
306
380
|
s,
|
|
@@ -317,6 +391,10 @@ export type GetDepositToIntentWithoutPermitCalldataParams = {
|
|
|
317
391
|
amount: bigint
|
|
318
392
|
intentAddress: `0x${string}`
|
|
319
393
|
deadline: bigint
|
|
394
|
+
nonce: bigint
|
|
395
|
+
feeToken: `0x${string}`
|
|
396
|
+
feeAmount: bigint
|
|
397
|
+
feeCollector: `0x${string}`
|
|
320
398
|
sigV: number
|
|
321
399
|
sigR: `0x${string}`
|
|
322
400
|
sigS: `0x${string}`
|
|
@@ -328,18 +406,35 @@ export function getDepositToIntentWithoutPermitCalldata({
|
|
|
328
406
|
amount,
|
|
329
407
|
intentAddress,
|
|
330
408
|
deadline,
|
|
409
|
+
nonce,
|
|
410
|
+
feeToken,
|
|
411
|
+
feeAmount,
|
|
412
|
+
feeCollector,
|
|
331
413
|
sigV,
|
|
332
414
|
sigR,
|
|
333
415
|
sigS,
|
|
334
416
|
}: GetDepositToIntentWithoutPermitCalldataParams): Hex {
|
|
335
417
|
const abi = parseAbi([
|
|
336
|
-
"function depositToIntent(address user, address token, uint256 amount, address intentAddress, uint256 deadline, uint8 sigV, bytes32 sigR, bytes32 sigS)",
|
|
418
|
+
"function depositToIntent(address user, address token, uint256 amount, address intentAddress, uint256 deadline, uint256 nonce, address feeToken, uint256 feeAmount, address feeCollector, uint8 sigV, bytes32 sigR, bytes32 sigS)",
|
|
337
419
|
])
|
|
338
420
|
|
|
339
421
|
return encodeFunctionData({
|
|
340
422
|
abi,
|
|
341
423
|
functionName: "depositToIntent",
|
|
342
|
-
args: [
|
|
424
|
+
args: [
|
|
425
|
+
user,
|
|
426
|
+
token,
|
|
427
|
+
amount,
|
|
428
|
+
intentAddress,
|
|
429
|
+
deadline,
|
|
430
|
+
nonce,
|
|
431
|
+
feeToken,
|
|
432
|
+
feeAmount,
|
|
433
|
+
feeCollector,
|
|
434
|
+
sigV,
|
|
435
|
+
sigR,
|
|
436
|
+
sigS,
|
|
437
|
+
],
|
|
343
438
|
})
|
|
344
439
|
}
|
|
345
440
|
|
|
@@ -354,100 +449,6 @@ export type GetDepositToIntentCallsParams = {
|
|
|
354
449
|
chain: Chain
|
|
355
450
|
}
|
|
356
451
|
|
|
357
|
-
export async function getDepositToIntentCalls({
|
|
358
|
-
publicClient,
|
|
359
|
-
walletClient,
|
|
360
|
-
account,
|
|
361
|
-
intentEntrypoint,
|
|
362
|
-
depositTokenAddress,
|
|
363
|
-
depositTokenAmount,
|
|
364
|
-
depositRecipient,
|
|
365
|
-
chain,
|
|
366
|
-
}: GetDepositToIntentCallsParams): Promise<
|
|
367
|
-
Array<{ to: `0x${string}`; data: `0x${string}`; value: `0x${string}` }>
|
|
368
|
-
> {
|
|
369
|
-
const permitAmount = maxUint256
|
|
370
|
-
const needsApproval = await getNeedsIntentEntrypointApproval({
|
|
371
|
-
client: publicClient,
|
|
372
|
-
token: depositTokenAddress,
|
|
373
|
-
account: account.address,
|
|
374
|
-
entrypoint: intentEntrypoint,
|
|
375
|
-
amount: BigInt(depositTokenAmount),
|
|
376
|
-
})
|
|
377
|
-
|
|
378
|
-
const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600) // 1 hour from now
|
|
379
|
-
|
|
380
|
-
let approvalSignature = null
|
|
381
|
-
if (needsApproval) {
|
|
382
|
-
approvalSignature = await getPermitSignature({
|
|
383
|
-
publicClient,
|
|
384
|
-
walletClient,
|
|
385
|
-
signer: account.address,
|
|
386
|
-
spender: intentEntrypoint,
|
|
387
|
-
tokenAddress: depositTokenAddress as `0x${string}`,
|
|
388
|
-
amount: permitAmount,
|
|
389
|
-
chain,
|
|
390
|
-
deadline,
|
|
391
|
-
})
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const {
|
|
395
|
-
v: signedIntentV,
|
|
396
|
-
r: signedIntentR,
|
|
397
|
-
s: signedIntentS,
|
|
398
|
-
} = await signIntent({
|
|
399
|
-
client: walletClient,
|
|
400
|
-
intentParams: {
|
|
401
|
-
user: account.address,
|
|
402
|
-
token: depositTokenAddress as `0x${string}`,
|
|
403
|
-
amount: BigInt(depositTokenAmount),
|
|
404
|
-
intentAddress: depositRecipient as `0x${string}`,
|
|
405
|
-
deadline,
|
|
406
|
-
chainId: chain.id,
|
|
407
|
-
contractAddress: intentEntrypoint,
|
|
408
|
-
},
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
let calldata = null
|
|
412
|
-
if (approvalSignature) {
|
|
413
|
-
calldata = getDepositToIntentWithPermitCalldata({
|
|
414
|
-
user: account.address,
|
|
415
|
-
token: depositTokenAddress as `0x${string}`,
|
|
416
|
-
amount: BigInt(depositTokenAmount),
|
|
417
|
-
permitAmount,
|
|
418
|
-
intentAddress: depositRecipient as `0x${string}`,
|
|
419
|
-
deadline,
|
|
420
|
-
v: approvalSignature.v,
|
|
421
|
-
r: approvalSignature.r,
|
|
422
|
-
s: approvalSignature.s,
|
|
423
|
-
sigV: signedIntentV,
|
|
424
|
-
sigR: signedIntentR,
|
|
425
|
-
sigS: signedIntentS,
|
|
426
|
-
})
|
|
427
|
-
} else {
|
|
428
|
-
calldata = getDepositToIntentWithoutPermitCalldata({
|
|
429
|
-
user: account.address,
|
|
430
|
-
token: depositTokenAddress as `0x${string}`,
|
|
431
|
-
amount: BigInt(depositTokenAmount),
|
|
432
|
-
intentAddress: depositRecipient as `0x${string}`,
|
|
433
|
-
deadline,
|
|
434
|
-
sigV: signedIntentV,
|
|
435
|
-
sigR: signedIntentR,
|
|
436
|
-
sigS: signedIntentS,
|
|
437
|
-
})
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const calls = [
|
|
441
|
-
{
|
|
442
|
-
to: intentEntrypoint as `0x${string}`,
|
|
443
|
-
data: calldata as `0x${string}`,
|
|
444
|
-
value: "0" as `0x${string}`,
|
|
445
|
-
},
|
|
446
|
-
]
|
|
447
|
-
|
|
448
|
-
return calls
|
|
449
|
-
}
|
|
450
|
-
|
|
451
452
|
export type GetNeedsIntentEntrypointApprovalParams = {
|
|
452
453
|
client: PublicClient
|
|
453
454
|
token: Address
|
|
@@ -473,6 +474,35 @@ export async function getNeedsIntentEntrypointApproval({
|
|
|
473
474
|
return allowance < amount
|
|
474
475
|
}
|
|
475
476
|
|
|
477
|
+
export type GetUserNonceParams = {
|
|
478
|
+
publicClient: PublicClient
|
|
479
|
+
userAddress: `0x${string}`
|
|
480
|
+
intentEntrypoint: `0x${string}`
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export async function getUserNonce({
|
|
484
|
+
publicClient,
|
|
485
|
+
userAddress,
|
|
486
|
+
intentEntrypoint,
|
|
487
|
+
}: GetUserNonceParams): Promise<bigint> {
|
|
488
|
+
const nonce = await publicClient.readContract({
|
|
489
|
+
address: intentEntrypoint as `0x${string}`,
|
|
490
|
+
abi: [
|
|
491
|
+
{
|
|
492
|
+
name: "nonces",
|
|
493
|
+
type: "function",
|
|
494
|
+
stateMutability: "view",
|
|
495
|
+
inputs: [{ name: "user", type: "address" }],
|
|
496
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
497
|
+
},
|
|
498
|
+
],
|
|
499
|
+
functionName: "nonces",
|
|
500
|
+
args: [userAddress],
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
return nonce as bigint
|
|
504
|
+
}
|
|
505
|
+
|
|
476
506
|
export type IntentParams = {
|
|
477
507
|
user: `0x${string}`
|
|
478
508
|
token: `0x${string}`
|
|
@@ -481,6 +511,9 @@ export type IntentParams = {
|
|
|
481
511
|
deadline: bigint
|
|
482
512
|
chainId: number
|
|
483
513
|
contractAddress: `0x${string}`
|
|
514
|
+
nonce: bigint
|
|
515
|
+
feeAmount: bigint
|
|
516
|
+
feeCollector: `0x${string}`
|
|
484
517
|
}
|
|
485
518
|
|
|
486
519
|
export type SignIntentParams = {
|
|
@@ -507,20 +540,36 @@ export async function signIntent({
|
|
|
507
540
|
contractAddress,
|
|
508
541
|
} = intentParams
|
|
509
542
|
|
|
543
|
+
// Validate that the connected wallet matches the user
|
|
544
|
+
if (!client.account) {
|
|
545
|
+
throw new Error("No account found")
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
if (client.account.address.toLowerCase() !== user.toLowerCase()) {
|
|
549
|
+
throw new Error(
|
|
550
|
+
`Connected wallet (${client.account.address}) does not match intent user (${user}). ` +
|
|
551
|
+
`Please connect the wallet that owns the tokens.`,
|
|
552
|
+
)
|
|
553
|
+
}
|
|
554
|
+
|
|
510
555
|
const domain = {
|
|
511
|
-
name:
|
|
556
|
+
name: intentEntrypointDomainName,
|
|
512
557
|
version: "1",
|
|
513
558
|
chainId,
|
|
514
559
|
verifyingContract: contractAddress, // ✅ This fixes the signature mismatch
|
|
515
560
|
}
|
|
516
561
|
|
|
517
562
|
const types = {
|
|
518
|
-
|
|
563
|
+
TrailsIntent: [
|
|
519
564
|
{ name: "user", type: "address" },
|
|
520
565
|
{ name: "token", type: "address" },
|
|
521
566
|
{ name: "amount", type: "uint256" },
|
|
522
567
|
{ name: "intentAddress", type: "address" },
|
|
523
568
|
{ name: "deadline", type: "uint256" },
|
|
569
|
+
{ name: "chainId", type: "uint256" },
|
|
570
|
+
{ name: "nonce", type: "uint256" },
|
|
571
|
+
{ name: "feeAmount", type: "uint256" },
|
|
572
|
+
{ name: "feeCollector", type: "address" },
|
|
524
573
|
],
|
|
525
574
|
}
|
|
526
575
|
|
|
@@ -530,13 +579,17 @@ export async function signIntent({
|
|
|
530
579
|
amount: BigInt(amount),
|
|
531
580
|
intentAddress: getAddress(intentAddress),
|
|
532
581
|
deadline: BigInt(deadline),
|
|
582
|
+
chainId: BigInt(chainId),
|
|
583
|
+
nonce: BigInt(intentParams.nonce),
|
|
584
|
+
feeAmount: BigInt(intentParams.feeAmount),
|
|
585
|
+
feeCollector: getAddress(intentParams.feeCollector),
|
|
533
586
|
}
|
|
534
587
|
|
|
535
588
|
const signature = await client.signTypedData({
|
|
536
589
|
account: client.account as Account,
|
|
537
590
|
domain,
|
|
538
591
|
types,
|
|
539
|
-
primaryType: "
|
|
592
|
+
primaryType: "TrailsIntent",
|
|
540
593
|
message,
|
|
541
594
|
})
|
|
542
595
|
|