@0xsequence/relayer 3.0.10 → 3.1.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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +34 -0
- package/dist/relayer/relayer.d.ts +3 -0
- package/dist/relayer/relayer.d.ts.map +1 -1
- package/dist/relayer/rpc-relayer/index.d.ts +3 -0
- package/dist/relayer/rpc-relayer/index.d.ts.map +1 -1
- package/dist/relayer/rpc-relayer/index.js +3 -3
- package/dist/relayer/standard/eip6963.d.ts +3 -0
- package/dist/relayer/standard/eip6963.d.ts.map +1 -1
- package/dist/relayer/standard/local.d.ts +3 -0
- package/dist/relayer/standard/local.d.ts.map +1 -1
- package/dist/relayer/standard/local.js +1 -1
- package/dist/relayer/standard/pk-relayer.d.ts +3 -0
- package/dist/relayer/standard/pk-relayer.d.ts.map +1 -1
- package/dist/relayer/standard/sequence.d.ts +3 -0
- package/dist/relayer/standard/sequence.d.ts.map +1 -1
- package/dist/relayer/standard/sequence.js +2 -1
- package/package.json +2 -2
- package/src/relayer/relayer.ts +7 -2
- package/src/relayer/rpc-relayer/index.ts +10 -5
- package/src/relayer/standard/eip6963.ts +7 -2
- package/src/relayer/standard/local.ts +8 -3
- package/src/relayer/standard/pk-relayer.ts +7 -2
- package/src/relayer/standard/sequence.ts +9 -3
- package/test/relayer/relayer.test.ts +55 -0
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# @0xsequence/relayer
|
|
2
2
|
|
|
3
|
+
## 3.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- WDK fix
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @0xsequence/wallet-primitives@3.0.12
|
|
10
|
+
|
|
11
|
+
## 3.1.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 55121af: Surface explicit sponsorship signal on `feeOptions` and an error marker on
|
|
16
|
+
`feeOptions` / `feeTokens`.
|
|
17
|
+
- `RpcRelayer.feeOptions` now returns `sponsored: boolean`, forwarded from the
|
|
18
|
+
server's `FeeOptionsReturn.sponsored`. The `Relayer` interface and all
|
|
19
|
+
bundled implementations (`RpcRelayer`, `SequenceRelayer`, `LocalRelayer`,
|
|
20
|
+
`EIP6963Relayer`, `PkRelayer`) carry the new field.
|
|
21
|
+
- When `feeOptions` swallows a transport / server error it now returns
|
|
22
|
+
`{ options: [], sponsored: false, failed: true }` (was `{ options: [] }`).
|
|
23
|
+
- When `feeTokens` swallows an error it now returns
|
|
24
|
+
`{ isFeeRequired: false, failed: true }` (was `{ isFeeRequired: false }`).
|
|
25
|
+
|
|
26
|
+
These changes are additive — existing consumers that ignore the new fields are
|
|
27
|
+
unaffected. Consumers that classified sponsorship by "no fee option attached"
|
|
28
|
+
should migrate to `sponsored === true` to distinguish a real subsidy from a
|
|
29
|
+
swallowed `/FeeOptions` error.
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- Fix for relayer sponsored fees
|
|
34
|
+
- Updated dependencies
|
|
35
|
+
- @0xsequence/wallet-primitives@3.0.11
|
|
36
|
+
|
|
3
37
|
## 3.0.10
|
|
4
38
|
|
|
5
39
|
### Patch Changes
|
|
@@ -11,10 +11,13 @@ export interface Relayer {
|
|
|
11
11
|
isFeeRequired: boolean;
|
|
12
12
|
tokens?: FeeToken[];
|
|
13
13
|
paymentAddress?: Address.Address;
|
|
14
|
+
failed?: boolean;
|
|
14
15
|
}>;
|
|
15
16
|
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[], data?: Hex.Hex): Promise<{
|
|
16
17
|
options: FeeOption[];
|
|
17
18
|
quote?: FeeQuote;
|
|
19
|
+
sponsored: boolean;
|
|
20
|
+
failed?: boolean;
|
|
18
21
|
}>;
|
|
19
22
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{
|
|
20
23
|
opHash: Hex.Hex;
|
|
@@ -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;
|
|
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;QACnB,aAAa,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;QACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAC,CAAA;IAEF,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,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAE5F,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"}
|
|
@@ -20,10 +20,13 @@ export declare class RpcRelayer implements Relayer {
|
|
|
20
20
|
isFeeRequired: boolean;
|
|
21
21
|
tokens?: RpcFeeToken[];
|
|
22
22
|
paymentAddress?: Address.Address;
|
|
23
|
+
failed?: boolean;
|
|
23
24
|
}>;
|
|
24
25
|
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[], data?: Hex.Hex): Promise<{
|
|
25
26
|
options: FeeOption[];
|
|
26
27
|
quote?: FeeQuote;
|
|
28
|
+
sponsored: boolean;
|
|
29
|
+
failed?: boolean;
|
|
27
30
|
}>;
|
|
28
31
|
sendMetaTxn(walletAddress: Address.Address, to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote, preconditions?: TransactionPrecondition[]): Promise<{
|
|
29
32
|
opHash: Hex.Hex;
|
|
@@ -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;
|
|
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;QACzB,aAAa,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAC;IAqBI,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,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAuCtF,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"}
|
|
@@ -99,7 +99,7 @@ export class RpcRelayer {
|
|
|
99
99
|
}
|
|
100
100
|
catch (e) {
|
|
101
101
|
console.warn('RpcRelayer.feeTokens failed:', e);
|
|
102
|
-
return { isFeeRequired: false };
|
|
102
|
+
return { isFeeRequired: false, failed: true };
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
async feeOptions(wallet, chainId, to, calls, data) {
|
|
@@ -127,11 +127,11 @@ export class RpcRelayer {
|
|
|
127
127
|
value: option.value,
|
|
128
128
|
gasLimit: option.gasLimit,
|
|
129
129
|
}));
|
|
130
|
-
return { options, quote };
|
|
130
|
+
return { options, quote, sponsored: result.sponsored };
|
|
131
131
|
}
|
|
132
132
|
catch (e) {
|
|
133
133
|
console.warn('RpcRelayer.feeOptions failed:', e);
|
|
134
|
-
return { options: [] };
|
|
134
|
+
return { options: [], sponsored: false, failed: true };
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
async sendMetaTxn(walletAddress, to, data, chainId, quote, preconditions) {
|
|
@@ -15,10 +15,13 @@ export declare class EIP6963Relayer implements Relayer {
|
|
|
15
15
|
isFeeRequired: boolean;
|
|
16
16
|
tokens?: FeeToken[];
|
|
17
17
|
paymentAddress?: Address.Address;
|
|
18
|
+
failed?: boolean;
|
|
18
19
|
}>;
|
|
19
20
|
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[]): Promise<{
|
|
20
21
|
options: FeeOption[];
|
|
21
22
|
quote?: FeeQuote;
|
|
23
|
+
sponsored: boolean;
|
|
24
|
+
failed?: boolean;
|
|
22
25
|
}>;
|
|
23
26
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, _?: FeeQuote): Promise<{
|
|
24
27
|
opHash: Hex.Hex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eip6963.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/eip6963.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAA;AAE9E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAEjF,qBAAa,cAAe,YAAW,OAAO;IAC5C,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,aAAY;IAChC,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,IAAI,EAAE,mBAAmB,CAAA;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,MAAM,EAAE,qBAAqB;IAOzC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,SAAS,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"eip6963.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/eip6963.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAA;AAE9E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAEjF,qBAAa,cAAe,YAAW,OAAO;IAC5C,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,aAAY;IAChC,SAAgB,EAAE,EAAE,MAAM,CAAA;IAC1B,SAAgB,IAAI,EAAE,mBAAmB,CAAA;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,MAAM,EAAE,qBAAqB;IAOzC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvE,SAAS,IAAI,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;QACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAC;IAIF,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,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAItF,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC;IAI5G,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI5D,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;CAGjF;AAKD,wBAAgB,eAAe,yBAK9B;AAID,wBAAgB,WAAW,IAAI,cAAc,EAAE,CAW9C"}
|
|
@@ -29,10 +29,13 @@ export declare class LocalRelayer implements Relayer {
|
|
|
29
29
|
isFeeRequired: boolean;
|
|
30
30
|
tokens?: FeeToken[];
|
|
31
31
|
paymentAddress?: Address.Address;
|
|
32
|
+
failed?: boolean;
|
|
32
33
|
}>;
|
|
33
34
|
feeOptions(_wallet: Address.Address, _chainId: number, _to: Address.Address, _calls: Payload.Call[]): Promise<{
|
|
34
35
|
options: FeeOption[];
|
|
35
36
|
quote?: FeeQuote;
|
|
37
|
+
sponsored: boolean;
|
|
38
|
+
failed?: boolean;
|
|
36
39
|
}>;
|
|
37
40
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote, preconditions?: TransactionPrecondition[], checkInterval?: number): Promise<{
|
|
38
41
|
opHash: Hex.Hex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,EAAe,OAAO,EAAE,GAAG,EAAsB,MAAM,IAAI,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAoBjF,KAAK,iCAAiC,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEzE,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC3G,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACrD,IAAI,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACnE,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAA;CACpG;AAED,qBAAa,YAAa,YAAW,OAAO;aAKd,QAAQ,EAAE,eAAe;IAJrD,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,WAAU;IAC9B,SAAgB,EAAE,WAAU;gBAEA,QAAQ,EAAE,eAAe;IAErD,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAUjE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY;IAIlE,SAAS,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export class LocalRelayer {
|
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
feeOptions(_wallet, _chainId, _to, _calls) {
|
|
32
|
-
return Promise.resolve({ options: [] });
|
|
32
|
+
return Promise.resolve({ options: [], sponsored: false });
|
|
33
33
|
}
|
|
34
34
|
async relay(to, data, chainId, quote, preconditions, checkInterval = 5000) {
|
|
35
35
|
// Helper function to check all preconditions
|
|
@@ -14,10 +14,13 @@ export declare class PkRelayer implements Relayer {
|
|
|
14
14
|
isFeeRequired: boolean;
|
|
15
15
|
tokens?: FeeToken[];
|
|
16
16
|
paymentAddress?: Address.Address;
|
|
17
|
+
failed?: boolean;
|
|
17
18
|
}>;
|
|
18
19
|
feeOptions(wallet: Address.Address, chainId: number, to: Address.Address, calls: Payload.Call[]): Promise<{
|
|
19
20
|
options: FeeOption[];
|
|
20
21
|
quote?: FeeQuote;
|
|
22
|
+
sponsored: boolean;
|
|
23
|
+
failed?: boolean;
|
|
21
24
|
}>;
|
|
22
25
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, _?: FeeQuote): Promise<{
|
|
23
26
|
opHash: Hex.Hex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pk-relayer.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/pk-relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAA6D,MAAM,IAAI,CAAA;AAEtG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,qBAAa,SAAU,YAAW,OAAO;IAQrC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,QAAO;IAC3B,SAAgB,EAAE,QAAO;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAGpC,UAAU,EAAE,GAAG,CAAC,GAAG,EACF,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IA0FxC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E,SAAS,IAAI,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"pk-relayer.d.ts","sourceRoot":"","sources":["../../../src/relayer/standard/pk-relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAA6D,MAAM,IAAI,CAAA;AAEtG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAExD,qBAAa,SAAU,YAAW,OAAO;IAQrC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,SAAgB,IAAI,aAAY;IAChC,SAAgB,IAAI,QAAO;IAC3B,SAAgB,EAAE,QAAO;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAGpC,UAAU,EAAE,GAAG,CAAC,GAAG,EACF,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IA0FxC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E,SAAS,IAAI,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;QACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAC;IAIF,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,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAItF,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAA;KAAE,CAAC;IAQ5G,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI5D,iBAAiB,CAAC,aAAa,EAAE,YAAY,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CAIpF"}
|
|
@@ -13,10 +13,13 @@ export declare class SequenceRelayer implements Relayer {
|
|
|
13
13
|
isFeeRequired: boolean;
|
|
14
14
|
tokens?: FeeToken[];
|
|
15
15
|
paymentAddress?: Address.Address;
|
|
16
|
+
failed?: boolean;
|
|
16
17
|
}>;
|
|
17
18
|
feeOptions(wallet: Address.Address, _chainId: number, to: Address.Address, calls: Payload.Call[], transactionData?: Hex.Hex): Promise<{
|
|
18
19
|
options: FeeOption[];
|
|
19
20
|
quote?: FeeQuote;
|
|
21
|
+
sponsored: boolean;
|
|
22
|
+
failed?: boolean;
|
|
20
23
|
}>;
|
|
21
24
|
checkPrecondition(_precondition: TransactionPrecondition): Promise<boolean>;
|
|
22
25
|
relay(to: Address.Address, data: Hex.Hex, _chainId: number, quote?: FeeQuote): Promise<{
|
|
@@ -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;
|
|
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;QACzB,aAAa,EAAE,OAAO,CAAA;QACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;QACnB,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;QAChC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAC;IAgBI,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,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAetF,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"}
|
|
@@ -32,10 +32,11 @@ export class SequenceRelayer {
|
|
|
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
34
|
const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]);
|
|
35
|
-
const { options, quote } = await this.service.feeOptions({ wallet, to, data });
|
|
35
|
+
const { options, quote, sponsored } = await this.service.feeOptions({ wallet, to, data });
|
|
36
36
|
return {
|
|
37
37
|
options,
|
|
38
38
|
quote: quote ? { _tag: 'FeeQuote', _quote: quote } : undefined,
|
|
39
|
+
sponsored,
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
async checkPrecondition(_precondition) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsequence/relayer",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -26,7 +26,7 @@
|
|
|
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.12"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc",
|
package/src/relayer/relayer.ts
CHANGED
|
@@ -11,7 +11,12 @@ export interface Relayer {
|
|
|
11
11
|
|
|
12
12
|
isAvailable(wallet: Address.Address, chainId: number): Promise<boolean>
|
|
13
13
|
|
|
14
|
-
feeTokens(): Promise<{
|
|
14
|
+
feeTokens(): Promise<{
|
|
15
|
+
isFeeRequired: boolean
|
|
16
|
+
tokens?: FeeToken[]
|
|
17
|
+
paymentAddress?: Address.Address
|
|
18
|
+
failed?: boolean
|
|
19
|
+
}>
|
|
15
20
|
|
|
16
21
|
feeOptions(
|
|
17
22
|
wallet: Address.Address,
|
|
@@ -19,7 +24,7 @@ export interface Relayer {
|
|
|
19
24
|
to: Address.Address,
|
|
20
25
|
calls: Payload.Call[],
|
|
21
26
|
data?: Hex.Hex,
|
|
22
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }>
|
|
27
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }>
|
|
23
28
|
|
|
24
29
|
relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }>
|
|
25
30
|
|
|
@@ -123,7 +123,12 @@ export class RpcRelayer implements Relayer {
|
|
|
123
123
|
return Promise.resolve(this.chainId === chainId)
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
async feeTokens(): Promise<{
|
|
126
|
+
async feeTokens(): Promise<{
|
|
127
|
+
isFeeRequired: boolean
|
|
128
|
+
tokens?: RpcFeeToken[]
|
|
129
|
+
paymentAddress?: Address.Address
|
|
130
|
+
failed?: boolean
|
|
131
|
+
}> {
|
|
127
132
|
try {
|
|
128
133
|
const { isFeeRequired, tokens, paymentAddress } = await this.client.feeTokens()
|
|
129
134
|
if (isFeeRequired) {
|
|
@@ -140,7 +145,7 @@ export class RpcRelayer implements Relayer {
|
|
|
140
145
|
}
|
|
141
146
|
} catch (e) {
|
|
142
147
|
console.warn('RpcRelayer.feeTokens failed:', e)
|
|
143
|
-
return { isFeeRequired: false }
|
|
148
|
+
return { isFeeRequired: false, failed: true }
|
|
144
149
|
}
|
|
145
150
|
}
|
|
146
151
|
|
|
@@ -150,7 +155,7 @@ export class RpcRelayer implements Relayer {
|
|
|
150
155
|
to: Address.Address,
|
|
151
156
|
calls: Payload.Call[],
|
|
152
157
|
data?: Hex.Hex,
|
|
153
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
158
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> {
|
|
154
159
|
// IMPORTANT:
|
|
155
160
|
// The relayer FeeOptions endpoint simulates `eth_call(to, data)`.
|
|
156
161
|
// Callers that already built a wallet transaction should pass its `to` and `data`.
|
|
@@ -182,10 +187,10 @@ export class RpcRelayer implements Relayer {
|
|
|
182
187
|
gasLimit: option.gasLimit,
|
|
183
188
|
}))
|
|
184
189
|
|
|
185
|
-
return { options, quote }
|
|
190
|
+
return { options, quote, sponsored: result.sponsored }
|
|
186
191
|
} catch (e) {
|
|
187
192
|
console.warn('RpcRelayer.feeOptions failed:', e)
|
|
188
|
-
return { options: [] }
|
|
193
|
+
return { options: [], sponsored: false, failed: true }
|
|
189
194
|
}
|
|
190
195
|
}
|
|
191
196
|
|
|
@@ -23,7 +23,12 @@ export class EIP6963Relayer implements Relayer {
|
|
|
23
23
|
return this.relayer.isAvailable(wallet, chainId)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
feeTokens(): Promise<{
|
|
26
|
+
feeTokens(): Promise<{
|
|
27
|
+
isFeeRequired: boolean
|
|
28
|
+
tokens?: FeeToken[]
|
|
29
|
+
paymentAddress?: Address.Address
|
|
30
|
+
failed?: boolean
|
|
31
|
+
}> {
|
|
27
32
|
return this.relayer.feeTokens()
|
|
28
33
|
}
|
|
29
34
|
|
|
@@ -32,7 +37,7 @@ export class EIP6963Relayer implements Relayer {
|
|
|
32
37
|
chainId: number,
|
|
33
38
|
to: Address.Address,
|
|
34
39
|
calls: Payload.Call[],
|
|
35
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
40
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> {
|
|
36
41
|
return this.relayer.feeOptions(wallet, chainId, to, calls)
|
|
37
42
|
}
|
|
38
43
|
|
|
@@ -56,7 +56,12 @@ export class LocalRelayer implements Relayer {
|
|
|
56
56
|
return new LocalRelayer(new EIP1193ProviderAdapter(provider))
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
feeTokens(): Promise<{
|
|
59
|
+
feeTokens(): Promise<{
|
|
60
|
+
isFeeRequired: boolean
|
|
61
|
+
tokens?: FeeToken[]
|
|
62
|
+
paymentAddress?: Address.Address
|
|
63
|
+
failed?: boolean
|
|
64
|
+
}> {
|
|
60
65
|
return Promise.resolve({
|
|
61
66
|
isFeeRequired: false,
|
|
62
67
|
})
|
|
@@ -67,8 +72,8 @@ export class LocalRelayer implements Relayer {
|
|
|
67
72
|
_chainId: number,
|
|
68
73
|
_to: Address.Address,
|
|
69
74
|
_calls: Payload.Call[],
|
|
70
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
71
|
-
return Promise.resolve({ options: [] })
|
|
75
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> {
|
|
76
|
+
return Promise.resolve({ options: [], sponsored: false })
|
|
72
77
|
}
|
|
73
78
|
|
|
74
79
|
async relay(
|
|
@@ -107,7 +107,12 @@ export class PkRelayer implements Relayer {
|
|
|
107
107
|
return providerChainId === chainId
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
feeTokens(): Promise<{
|
|
110
|
+
feeTokens(): Promise<{
|
|
111
|
+
isFeeRequired: boolean
|
|
112
|
+
tokens?: FeeToken[]
|
|
113
|
+
paymentAddress?: Address.Address
|
|
114
|
+
failed?: boolean
|
|
115
|
+
}> {
|
|
111
116
|
return this.relayer.feeTokens()
|
|
112
117
|
}
|
|
113
118
|
|
|
@@ -116,7 +121,7 @@ export class PkRelayer implements Relayer {
|
|
|
116
121
|
chainId: number,
|
|
117
122
|
to: Address.Address,
|
|
118
123
|
calls: Payload.Call[],
|
|
119
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
124
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> {
|
|
120
125
|
return this.relayer.feeOptions(wallet, chainId, to, calls)
|
|
121
126
|
}
|
|
122
127
|
|
|
@@ -17,7 +17,12 @@ export class SequenceRelayer implements Relayer {
|
|
|
17
17
|
return true
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
async feeTokens(): Promise<{
|
|
20
|
+
async feeTokens(): Promise<{
|
|
21
|
+
isFeeRequired: boolean
|
|
22
|
+
tokens?: FeeToken[]
|
|
23
|
+
paymentAddress?: Address.Address
|
|
24
|
+
failed?: boolean
|
|
25
|
+
}> {
|
|
21
26
|
const { isFeeRequired, tokens, paymentAddress } = await this.service.feeTokens()
|
|
22
27
|
if (isFeeRequired) {
|
|
23
28
|
Address.assert(paymentAddress)
|
|
@@ -39,17 +44,18 @@ export class SequenceRelayer implements Relayer {
|
|
|
39
44
|
to: Address.Address,
|
|
40
45
|
calls: Payload.Call[],
|
|
41
46
|
transactionData?: Hex.Hex,
|
|
42
|
-
): Promise<{ options: FeeOption[]; quote?: FeeQuote }> {
|
|
47
|
+
): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> {
|
|
43
48
|
const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)')
|
|
44
49
|
const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to)
|
|
45
50
|
const signature = '0x0001' // TODO: use a stub signature
|
|
46
51
|
const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature])
|
|
47
52
|
|
|
48
|
-
const { options, quote } = await this.service.feeOptions({ wallet, to, data })
|
|
53
|
+
const { options, quote, sponsored } = await this.service.feeOptions({ wallet, to, data })
|
|
49
54
|
|
|
50
55
|
return {
|
|
51
56
|
options,
|
|
52
57
|
quote: quote ? { _tag: 'FeeQuote', _quote: quote } : undefined,
|
|
58
|
+
sponsored,
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
|
|
@@ -294,6 +294,7 @@ describe('Relayer', () => {
|
|
|
294
294
|
vi.mocked(mockRelayer.feeOptions).mockResolvedValue({
|
|
295
295
|
options: [],
|
|
296
296
|
quote: undefined,
|
|
297
|
+
sponsored: false,
|
|
297
298
|
})
|
|
298
299
|
vi.mocked(mockRelayer.relay).mockResolvedValue({
|
|
299
300
|
opHash: TEST_OP_HASH,
|
|
@@ -375,6 +376,60 @@ describe('Relayer', () => {
|
|
|
375
376
|
data: expectedData,
|
|
376
377
|
})
|
|
377
378
|
})
|
|
379
|
+
|
|
380
|
+
it('should propagate sponsored:true from the server', async () => {
|
|
381
|
+
const fetchImpl = vi.fn(
|
|
382
|
+
async () => new Response(JSON.stringify({ options: [], sponsored: true }), { status: 200 }),
|
|
383
|
+
)
|
|
384
|
+
const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl)
|
|
385
|
+
|
|
386
|
+
const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall])
|
|
387
|
+
|
|
388
|
+
expect(result.sponsored).toBe(true)
|
|
389
|
+
expect(result.options).toEqual([])
|
|
390
|
+
expect(result.failed).toBeUndefined()
|
|
391
|
+
})
|
|
392
|
+
|
|
393
|
+
it('should propagate sponsored:false from the server', async () => {
|
|
394
|
+
const fetchImpl = vi.fn(
|
|
395
|
+
async () => new Response(JSON.stringify({ options: [], sponsored: false }), { status: 200 }),
|
|
396
|
+
)
|
|
397
|
+
const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl)
|
|
398
|
+
|
|
399
|
+
const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall])
|
|
400
|
+
|
|
401
|
+
expect(result.sponsored).toBe(false)
|
|
402
|
+
expect(result.failed).toBeUndefined()
|
|
403
|
+
})
|
|
404
|
+
|
|
405
|
+
it('should return sponsored:false and failed:true when the server errors', async () => {
|
|
406
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
|
407
|
+
const fetchImpl = vi.fn(
|
|
408
|
+
async () =>
|
|
409
|
+
new Response(JSON.stringify({ error: 'Aborted', code: 1005, msg: 'simulation failed' }), { status: 400 }),
|
|
410
|
+
)
|
|
411
|
+
const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl)
|
|
412
|
+
|
|
413
|
+
const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall])
|
|
414
|
+
|
|
415
|
+
expect(result).toEqual({ options: [], sponsored: false, failed: true })
|
|
416
|
+
expect(warn).toHaveBeenCalled()
|
|
417
|
+
warn.mockRestore()
|
|
418
|
+
})
|
|
419
|
+
})
|
|
420
|
+
|
|
421
|
+
describe('RpcRelayer.feeTokens', () => {
|
|
422
|
+
it('should return failed:true when the server errors', async () => {
|
|
423
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
|
424
|
+
const fetchImpl = vi.fn(async () => new Response('boom', { status: 500 }))
|
|
425
|
+
const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl)
|
|
426
|
+
|
|
427
|
+
const result = await relayer.feeTokens()
|
|
428
|
+
|
|
429
|
+
expect(result).toEqual({ isFeeRequired: false, failed: true })
|
|
430
|
+
expect(warn).toHaveBeenCalled()
|
|
431
|
+
warn.mockRestore()
|
|
432
|
+
})
|
|
378
433
|
})
|
|
379
434
|
|
|
380
435
|
describe('Type compatibility', () => {
|