@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.
@@ -1,5 +1,5 @@
1
1
 
2
2
 
3
- > @0xsequence/relayer@3.0.6 build /home/taylan/development/sequence/sequence.js/packages/services/relayer
3
+ > @0xsequence/relayer@3.0.8 build /home/taylan/development/sequence/sequence.js/packages/services/relayer
4
4
  > tsc
5
5
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @0xsequence/relayer@3.0.6 lint /home/taylan/development/sequence/sequence.js/packages/services/relayer
2
+ > @0xsequence/relayer@3.0.8 lint /home/taylan/development/sequence/sequence.js/packages/services/relayer
3
3
  > eslint . --max-warnings 0
4
4
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @0xsequence/relayer@3.0.6 typecheck /home/taylan/development/sequence/sequence.js/packages/services/relayer
2
+ > @0xsequence/relayer@3.0.8 typecheck /home/taylan/development/sequence/sequence.js/packages/services/relayer
3
3
  > tsc --noEmit
4
4
 
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,GACpB,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"}
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,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IAsChD,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"}
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-webapp-v3 requests FeeOptions with `to = wallet` and `data = Payload.encode(calls, self=wallet)`.
109
- // This works for undeployed wallets and avoids guest-module simulation pitfalls.
110
- const callsStruct = { type: 'call', space: 0n, nonce: 0n, calls: calls };
111
- const feeOptionsTo = wallet;
112
- const data = Payload.encode(callsStruct, wallet);
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: Hex.fromBytes(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,GACpB,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"}
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.6",
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": "^5.9.3",
20
+ "typescript": "^6.0.3",
21
21
  "vitest": "^4.0.18",
22
- "@repo/typescript-config": "^0.0.1",
23
- "@repo/eslint-config": "^0.0.1"
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.6"
29
+ "@0xsequence/wallet-primitives": "^3.0.8"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc",
@@ -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-webapp-v3 requests FeeOptions with `to = wallet` and `data = Payload.encode(calls, self=wallet)`.
156
- // This works for undeployed wallets and avoids guest-module simulation pitfalls.
157
- const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls }
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 = wallet
160
- const data = Payload.encode(callsStruct, wallet)
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: Hex.fromBytes(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
- // These will throw due to the 'in' operator, so we need to test the actual behavior
95
- expect(() => Relayer.isRelayer(null)).toThrow()
96
- expect(() => Relayer.isRelayer(undefined)).toThrow()
97
- expect(() => Relayer.isRelayer('string')).toThrow()
98
- expect(() => Relayer.isRelayer(123)).toThrow()
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