@0xsequence/relayer 3.0.6 → 3.0.8
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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +16 -0
- package/dist/relayer/relayer.d.ts +1 -1
- package/dist/relayer/relayer.d.ts.map +1 -1
- package/dist/relayer/rpc-relayer/index.d.ts +1 -1
- package/dist/relayer/rpc-relayer/index.d.ts.map +1 -1
- package/dist/relayer/rpc-relayer/index.js +8 -7
- package/dist/relayer/standard/sequence.d.ts +1 -1
- package/dist/relayer/standard/sequence.d.ts.map +1 -1
- package/dist/relayer/standard/sequence.js +2 -2
- package/package.json +5 -5
- package/src/relayer/relayer.ts +1 -0
- package/src/relayer/rpc-relayer/index.ts +8 -6
- package/src/relayer/standard/sequence.ts +2 -1
- package/test/relayer/relayer.test.ts +60 -7
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @0xsequence/relayer
|
|
2
2
|
|
|
3
|
+
## 3.0.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Bug fix for relayer fee options handling
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @0xsequence/wallet-primitives@3.0.8
|
|
10
|
+
|
|
11
|
+
## 3.0.7
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Minor bug fixes
|
|
16
|
+
- Updated dependencies
|
|
17
|
+
- @0xsequence/wallet-primitives@3.0.7
|
|
18
|
+
|
|
3
19
|
## 3.0.6
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -12,7 +12,7 @@ export interface Relayer {
|
|
|
12
12
|
tokens?: FeeToken[];
|
|
13
13
|
paymentAddress?: Address.Address;
|
|
14
14
|
}>;
|
|
15
|
-
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[]): Promise<{
|
|
15
|
+
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[], data?: Hex.Hex): Promise<{
|
|
16
16
|
options: FeeOption[];
|
|
17
17
|
quote?: FeeQuote;
|
|
18
18
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../../src/relayer/relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAErE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,CAAA;IAEf,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IAEV,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC,CAAA;IAEvG,UAAU,CACR,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../../src/relayer/relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAErE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,CAAA;IAEf,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IAEV,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC,CAAA;IAEvG,UAAU,CACR,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,EACrB,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAA;IAEtD,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC,CAAA;IAE1G,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAElE,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC7E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,OAAO,CAU9D"}
|
|
@@ -21,7 +21,7 @@ export declare class RpcRelayer implements Relayer {
|
|
|
21
21
|
tokens?: RpcFeeToken[];
|
|
22
22
|
paymentAddress?: Address.Address;
|
|
23
23
|
}>;
|
|
24
|
-
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[]): Promise<{
|
|
24
|
+
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[], data?: Hex.Hex): Promise<{
|
|
25
25
|
options: FeeOption[];
|
|
26
26
|
quote?: FeeQuote;
|
|
27
27
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/relayer/rpc-relayer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,QAAQ,IAAI,WAAW,EACvB,uBAAuB,EAExB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAe,MAAM,IAAI,CAAA;AAC9C,OAAO,EAAa,OAAO,EAAW,MAAM,+BAA+B,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAmB3E,OAAO,EAA0C,KAAK,EAAE,MAAM,MAAM,CAAA;AAGpE,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAuCjF,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,KAAG,KAgB1C,CAAA;AAED,qBAAa,UAAW,YAAW,OAAO;IACxC,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,SAAQ;IAC5B,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,OAAO,EAAE,MAAM,CAAA;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAQ;gBAE9B,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAqB3G,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC;IAqB1G,UAAU,CACd,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/relayer/rpc-relayer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,QAAQ,IAAI,WAAW,EACvB,uBAAuB,EAExB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAe,MAAM,IAAI,CAAA;AAC9C,OAAO,EAAa,OAAO,EAAW,MAAM,+BAA+B,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAmB3E,OAAO,EAA0C,KAAK,EAAE,MAAM,MAAM,CAAA;AAGpE,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAuCjF,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,KAAG,KAgB1C,CAAA;AAED,qBAAa,UAAW,YAAW,OAAO;IACxC,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,SAAQ;IAC5B,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,OAAO,EAAE,MAAM,CAAA;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAO;IACpB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAQ;gBAE9B,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAqB3G,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC;IAqB1G,UAAU,CACd,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,EACrB,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IAuChD,WAAW,CACf,aAAa,EAAE,OAAO,CAAC,OAAO,EAC9B,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,IAAI,EAAE,GAAG,CAAC,GAAG,EACb,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,QAAQ,EAChB,aAAa,CAAC,EAAE,uBAAuB,EAAE,GACxC,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC;IAyBzB,KAAK,CACT,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,IAAI,EAAE,GAAG,CAAC,GAAG,EACb,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,QAAQ,EAChB,aAAa,CAAC,EAAE,uBAAuB,EAAE,GACxC,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC;IAyBzB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CnE,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoKhF,OAAO,CAAC,uBAAuB;CAMhC"}
|
|
@@ -102,19 +102,20 @@ export class RpcRelayer {
|
|
|
102
102
|
return { isFeeRequired: false };
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
async feeOptions(wallet, chainId, to, calls) {
|
|
105
|
+
async feeOptions(wallet, chainId, to, calls, data) {
|
|
106
106
|
// IMPORTANT:
|
|
107
107
|
// The relayer FeeOptions endpoint simulates `eth_call(to, data)`.
|
|
108
|
-
// wallet
|
|
109
|
-
// This
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
108
|
+
// Callers that already built a wallet transaction should pass its `to` and `data`.
|
|
109
|
+
// This is required for undeployed wallets because the transaction must target the
|
|
110
|
+
// guest module and include the deploy call before executing from the wallet.
|
|
111
|
+
const callsStruct = { type: 'call', space: 0n, nonce: 0n, calls };
|
|
112
|
+
const feeOptionsTo = to;
|
|
113
|
+
const feeOptionsData = data ?? Hex.fromBytes(Payload.encode(callsStruct, to));
|
|
113
114
|
try {
|
|
114
115
|
const result = await this.client.feeOptions({
|
|
115
116
|
wallet,
|
|
116
117
|
to: feeOptionsTo,
|
|
117
|
-
data:
|
|
118
|
+
data: feeOptionsData,
|
|
118
119
|
}, { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) });
|
|
119
120
|
const quote = result.quote ? { _tag: 'FeeQuote', _quote: result.quote } : undefined;
|
|
120
121
|
const options = result.options.map((option) => ({
|
|
@@ -14,7 +14,7 @@ export declare class SequenceRelayer implements Relayer {
|
|
|
14
14
|
tokens?: FeeToken[];
|
|
15
15
|
paymentAddress?: Address.Address;
|
|
16
16
|
}>;
|
|
17
|
-
feeOptions(wallet: Address.Address, _chainId: number, to: Address.Address, calls: Payload.Call[]): Promise<{
|
|
17
|
+
feeOptions(wallet: Address.Address, _chainId: number, to: Address.Address, calls: Payload.Call[], transactionData?: Hex.Hex): Promise<{
|
|
18
18
|
options: FeeOption[];
|
|
19
19
|
quote?: FeeQuote;
|
|
20
20
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,uBAAuB,EAAsB,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACnH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAe,OAAO,EAAS,GAAG,EAAE,MAAM,IAAI,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,qBAAa,eAAgB,YAAW,OAAO;IAC7C,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,cAAa;IACjC,QAAQ,CAAC,EAAE,cAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,IAAI,EAAE,MAAM;IAIlB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC;IAgBvG,UAAU,CACd,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,uBAAuB,EAAsB,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACnH,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAe,OAAO,EAAS,GAAG,EAAE,MAAM,IAAI,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,qBAAa,eAAgB,YAAW,OAAO;IAC7C,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,cAAa;IACjC,QAAQ,CAAC,EAAE,cAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,IAAI,EAAE,MAAM;IAIlB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,SAAS,IAAI,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;KAAE,CAAC;IAgBvG,UAAU,CACd,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,OAAO,CAAC,OAAO,EACnB,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,EACrB,eAAe,CAAC,EAAE,GAAG,CAAC,GAAG,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IAchD,iBAAiB,CAAC,aAAa,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3E,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC;IAW3G,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAuC1E"}
|
|
@@ -27,11 +27,11 @@ export class SequenceRelayer {
|
|
|
27
27
|
isFeeRequired,
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
async feeOptions(wallet, _chainId, to, calls) {
|
|
30
|
+
async feeOptions(wallet, _chainId, to, calls, transactionData) {
|
|
31
31
|
const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)');
|
|
32
32
|
const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to);
|
|
33
33
|
const signature = '0x0001'; // TODO: use a stub signature
|
|
34
|
-
const data = AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]);
|
|
34
|
+
const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]);
|
|
35
35
|
const { options, quote } = await this.service.feeOptions({ wallet, to, data });
|
|
36
36
|
return {
|
|
37
37
|
options,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsequence/relayer",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "^25.3.0",
|
|
20
|
-
"typescript": "^
|
|
20
|
+
"typescript": "^6.0.3",
|
|
21
21
|
"vitest": "^4.0.18",
|
|
22
|
-
"@repo/
|
|
23
|
-
"@repo/
|
|
22
|
+
"@repo/eslint-config": "^0.0.1",
|
|
23
|
+
"@repo/typescript-config": "^0.0.1"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"mipd": "^0.0.7",
|
|
27
27
|
"ox": "^0.9.17",
|
|
28
28
|
"viem": "^2.40.3",
|
|
29
|
-
"@0xsequence/wallet-primitives": "^3.0.
|
|
29
|
+
"@0xsequence/wallet-primitives": "^3.0.8"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc",
|
package/src/relayer/relayer.ts
CHANGED
|
@@ -18,6 +18,7 @@ export interface Relayer {
|
|
|
18
18
|
chainId: number,
|
|
19
19
|
to: Address.Address,
|
|
20
20
|
calls: Payload.Call[],
|
|
21
|
+
data?: Hex.Hex,
|
|
21
22
|
): Promise<{ options: FeeOption[]; quote?: FeeQuote }>
|
|
22
23
|
|
|
23
24
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }>
|
|
@@ -149,22 +149,24 @@ export class RpcRelayer implements Relayer {
|
|
|
149
149
|
chainId: number,
|
|
150
150
|
to: Address.Address,
|
|
151
151
|
calls: Payload.Call[],
|
|
152
|
+
data?: Hex.Hex,
|
|
152
153
|
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
153
154
|
// IMPORTANT:
|
|
154
155
|
// The relayer FeeOptions endpoint simulates `eth_call(to, data)`.
|
|
155
|
-
// wallet
|
|
156
|
-
// This
|
|
157
|
-
|
|
156
|
+
// Callers that already built a wallet transaction should pass its `to` and `data`.
|
|
157
|
+
// This is required for undeployed wallets because the transaction must target the
|
|
158
|
+
// guest module and include the deploy call before executing from the wallet.
|
|
159
|
+
const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls }
|
|
158
160
|
|
|
159
|
-
const feeOptionsTo =
|
|
160
|
-
const
|
|
161
|
+
const feeOptionsTo = to
|
|
162
|
+
const feeOptionsData = data ?? Hex.fromBytes(Payload.encode(callsStruct, to))
|
|
161
163
|
|
|
162
164
|
try {
|
|
163
165
|
const result = await this.client.feeOptions(
|
|
164
166
|
{
|
|
165
167
|
wallet,
|
|
166
168
|
to: feeOptionsTo,
|
|
167
|
-
data:
|
|
169
|
+
data: feeOptionsData,
|
|
168
170
|
},
|
|
169
171
|
{ ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) },
|
|
170
172
|
)
|
|
@@ -38,11 +38,12 @@ export class SequenceRelayer implements Relayer {
|
|
|
38
38
|
_chainId: number,
|
|
39
39
|
to: Address.Address,
|
|
40
40
|
calls: Payload.Call[],
|
|
41
|
+
transactionData?: Hex.Hex,
|
|
41
42
|
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
42
43
|
const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)')
|
|
43
44
|
const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to)
|
|
44
45
|
const signature = '0x0001' // TODO: use a stub signature
|
|
45
|
-
const data = AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature])
|
|
46
|
+
const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature])
|
|
46
47
|
|
|
47
48
|
const { options, quote } = await this.service.feeOptions({ wallet, to, data })
|
|
48
49
|
|
|
@@ -91,13 +91,11 @@ describe('Relayer', () => {
|
|
|
91
91
|
})
|
|
92
92
|
|
|
93
93
|
it('should return false for non-objects', () => {
|
|
94
|
-
|
|
95
|
-
expect(
|
|
96
|
-
expect(
|
|
97
|
-
expect(
|
|
98
|
-
expect(
|
|
99
|
-
expect(() => Relayer.isRelayer(true)).toThrow()
|
|
100
|
-
// Arrays and objects should not throw, but should return false
|
|
94
|
+
expect(Relayer.isRelayer(null)).toBe(false)
|
|
95
|
+
expect(Relayer.isRelayer(undefined)).toBe(false)
|
|
96
|
+
expect(Relayer.isRelayer('string')).toBe(false)
|
|
97
|
+
expect(Relayer.isRelayer(123)).toBe(false)
|
|
98
|
+
expect(Relayer.isRelayer(true)).toBe(false)
|
|
101
99
|
expect(Relayer.isRelayer([])).toBe(false)
|
|
102
100
|
})
|
|
103
101
|
|
|
@@ -324,6 +322,61 @@ describe('Relayer', () => {
|
|
|
324
322
|
})
|
|
325
323
|
})
|
|
326
324
|
|
|
325
|
+
describe('RpcRelayer.feeOptions', () => {
|
|
326
|
+
const mockCall: Payload.Call = {
|
|
327
|
+
to: TEST_TO_ADDRESS,
|
|
328
|
+
value: 0n,
|
|
329
|
+
data: TEST_DATA,
|
|
330
|
+
gasLimit: 21000n,
|
|
331
|
+
delegateCall: false,
|
|
332
|
+
onlyFallback: false,
|
|
333
|
+
behaviorOnError: 'revert',
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const makeRelayer = () => {
|
|
337
|
+
const requests: Array<{ input: RequestInfo; init?: RequestInit }> = []
|
|
338
|
+
const fetchImpl = vi.fn(async (input: RequestInfo, init?: RequestInit) => {
|
|
339
|
+
requests.push({ input, init })
|
|
340
|
+
return new Response(JSON.stringify({ options: [], sponsored: false }), { status: 200 })
|
|
341
|
+
})
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
relayer: new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl),
|
|
345
|
+
requests,
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
it('should send provided transaction target and data when available', async () => {
|
|
350
|
+
const { relayer, requests } = makeRelayer()
|
|
351
|
+
|
|
352
|
+
await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall], TEST_DATA)
|
|
353
|
+
|
|
354
|
+
expect(requests).toHaveLength(1)
|
|
355
|
+
expect(requests[0]!.input).toBe('https://relayer.test/rpc/Relayer/FeeOptions')
|
|
356
|
+
expect(JSON.parse(requests[0]!.init!.body as string)).toEqual({
|
|
357
|
+
wallet: TEST_WALLET_ADDRESS,
|
|
358
|
+
to: TEST_TO_ADDRESS,
|
|
359
|
+
data: TEST_DATA,
|
|
360
|
+
})
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
it('should encode calls for the provided target when transaction data is not provided', async () => {
|
|
364
|
+
const { relayer, requests } = makeRelayer()
|
|
365
|
+
|
|
366
|
+
await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall])
|
|
367
|
+
|
|
368
|
+
const expectedData = Hex.fromBytes(
|
|
369
|
+
Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls: [mockCall] }, TEST_TO_ADDRESS),
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
expect(JSON.parse(requests[0]!.init!.body as string)).toEqual({
|
|
373
|
+
wallet: TEST_WALLET_ADDRESS,
|
|
374
|
+
to: TEST_TO_ADDRESS,
|
|
375
|
+
data: expectedData,
|
|
376
|
+
})
|
|
377
|
+
})
|
|
378
|
+
})
|
|
379
|
+
|
|
327
380
|
describe('Type compatibility', () => {
|
|
328
381
|
it('should work with Address and Hex types from ox', () => {
|
|
329
382
|
// Test that the interfaces work correctly with ox types
|