accounts 0.6.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/core/ExecutionError.d.ts +25 -0
  3. package/dist/core/ExecutionError.d.ts.map +1 -0
  4. package/dist/core/ExecutionError.js +170 -0
  5. package/dist/core/ExecutionError.js.map +1 -0
  6. package/dist/core/Schema.d.ts +33 -7
  7. package/dist/core/Schema.d.ts.map +1 -1
  8. package/dist/core/zod/rpc.d.ts +14 -1
  9. package/dist/core/zod/rpc.d.ts.map +1 -1
  10. package/dist/core/zod/rpc.js +14 -1
  11. package/dist/core/zod/rpc.js.map +1 -1
  12. package/dist/server/CliAuth.d.ts +110 -43
  13. package/dist/server/CliAuth.d.ts.map +1 -1
  14. package/dist/server/CliAuth.js +243 -155
  15. package/dist/server/CliAuth.js.map +1 -1
  16. package/dist/server/Handler.d.ts +0 -1
  17. package/dist/server/Handler.d.ts.map +1 -1
  18. package/dist/server/Handler.js +0 -1
  19. package/dist/server/Handler.js.map +1 -1
  20. package/dist/server/internal/handlers/relay.d.ts +29 -12
  21. package/dist/server/internal/handlers/relay.d.ts.map +1 -1
  22. package/dist/server/internal/handlers/relay.js +180 -125
  23. package/dist/server/internal/handlers/relay.js.map +1 -1
  24. package/dist/server/internal/handlers/sponsorship.d.ts +77 -0
  25. package/dist/server/internal/handlers/sponsorship.d.ts.map +1 -0
  26. package/dist/server/internal/handlers/sponsorship.js +96 -0
  27. package/dist/server/internal/handlers/sponsorship.js.map +1 -0
  28. package/dist/server/internal/handlers/utils.d.ts +3 -1
  29. package/dist/server/internal/handlers/utils.d.ts.map +1 -1
  30. package/dist/server/internal/handlers/utils.js +15 -12
  31. package/dist/server/internal/handlers/utils.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/core/ExecutionError.test.ts +205 -0
  34. package/src/core/ExecutionError.ts +189 -0
  35. package/src/core/Provider.test.ts +4 -2
  36. package/src/core/zod/rpc.ts +18 -1
  37. package/src/server/CliAuth.test-d.ts +6 -0
  38. package/src/server/CliAuth.test.ts +83 -0
  39. package/src/server/CliAuth.ts +331 -208
  40. package/src/server/Handler.ts +0 -1
  41. package/src/server/internal/handlers/relay.test.ts +318 -108
  42. package/src/server/internal/handlers/relay.ts +243 -138
  43. package/src/server/internal/handlers/sponsorship.ts +172 -0
  44. package/src/server/internal/handlers/utils.ts +15 -10
  45. package/dist/server/internal/handlers/feePayer.d.ts +0 -73
  46. package/dist/server/internal/handlers/feePayer.d.ts.map +0 -1
  47. package/dist/server/internal/handlers/feePayer.js +0 -184
  48. package/dist/server/internal/handlers/feePayer.js.map +0 -1
  49. package/src/server/internal/handlers/feePayer.test.ts +0 -336
  50. package/src/server/internal/handlers/feePayer.ts +0 -271
@@ -0,0 +1,77 @@
1
+ import type { Address, Client } from 'viem';
2
+ import type { LocalAccount } from 'viem/accounts';
3
+ import { Transaction } from 'viem/tempo';
4
+ /** Returns sponsor metadata for `eth_fillTransaction` responses. */
5
+ export declare function getSponsor(options: getSponsor.Options): getSponsor.ReturnType;
6
+ export declare namespace getSponsor {
7
+ type Options = {
8
+ /** Account used for sponsorship. */
9
+ account: LocalAccount;
10
+ /** Optional display name. */
11
+ name?: string | undefined;
12
+ /** Optional display URL. */
13
+ url?: string | undefined;
14
+ };
15
+ type ReturnType = {
16
+ /** Sponsor address. */
17
+ address: Address;
18
+ /** Sponsor display name. */
19
+ name?: string | undefined;
20
+ /** Sponsor display URL. */
21
+ url?: string | undefined;
22
+ };
23
+ }
24
+ /** Returns whether the fee payer approves a filled transaction. */
25
+ export declare function shouldSponsor(options: shouldSponsor.Options): Promise<boolean>;
26
+ export declare namespace shouldSponsor {
27
+ type Options = {
28
+ /** Sender address from the original request. */
29
+ sender?: Address | undefined;
30
+ /** Filled transaction to validate. */
31
+ transaction: Record<string, unknown>;
32
+ /** Optional sponsorship approval callback. */
33
+ validate?: ((request: Transaction.TransactionRequest) => boolean | Promise<boolean>) | undefined;
34
+ };
35
+ }
36
+ /** Returns whether a raw Tempo transaction is explicitly requesting sponsorship. */
37
+ export declare function requestsRawSponsorship(serialized: `0x${string}`): boolean;
38
+ /** Returns `true` when a fill request already has the fields needed for sponsorship signing. */
39
+ export declare function isPreparedTransaction(value: Record<string, unknown>): boolean;
40
+ /** Signs a filled transaction as the fee payer. */
41
+ export declare function sign(options: sign.Options): Promise<{
42
+ feePayerSignature: {
43
+ r: bigint;
44
+ s: bigint;
45
+ yParity: number;
46
+ };
47
+ from: `0x${string}` | undefined;
48
+ }>;
49
+ export declare namespace sign {
50
+ type Options = {
51
+ /** Account used as the fee payer. */
52
+ account: LocalAccount;
53
+ /** Filled transaction to sign. */
54
+ transaction: Record<string, unknown>;
55
+ /** Sender address from the original request. */
56
+ sender?: Address | undefined;
57
+ };
58
+ }
59
+ /** Handles `eth_signRawTransaction` and broadcast methods for sponsored Tempo transactions. */
60
+ export declare function handleRawTransaction(options: handleRawTransaction.Options): Promise<string>;
61
+ export declare namespace handleRawTransaction {
62
+ type Options = {
63
+ /** Account used as the fee payer. */
64
+ account: LocalAccount;
65
+ /** Client resolver keyed by transaction `chainId`. */
66
+ getClient: (chainId?: number | undefined) => Client;
67
+ /** Raw transaction method to handle. */
68
+ method: 'eth_signRawTransaction' | 'eth_sendRawTransaction' | 'eth_sendRawTransactionSync';
69
+ /** Incoming JSON-RPC request. */
70
+ request: {
71
+ params?: readonly unknown[] | undefined;
72
+ };
73
+ /** Optional sponsorship approval callback. */
74
+ validate?: ((request: Transaction.TransactionRequest) => boolean | Promise<boolean>) | undefined;
75
+ };
76
+ }
77
+ //# sourceMappingURL=sponsorship.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sponsorship.d.ts","sourceRoot":"","sources":["../../../../src/server/internal/handlers/sponsorship.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { RpcResponse, Signature } from 'ox';
2
+ import { TxEnvelopeTempo } from 'ox/tempo';
3
+ import { signTransaction } from 'viem/actions';
4
+ import { Transaction } from 'viem/tempo';
5
+ import * as Utils from './utils.js';
6
+ /** Returns sponsor metadata for `eth_fillTransaction` responses. */
7
+ export function getSponsor(options) {
8
+ const { account, name, url } = options;
9
+ return {
10
+ address: account.address,
11
+ ...(name ? { name } : {}),
12
+ ...(url ? { url } : {}),
13
+ };
14
+ }
15
+ /** Returns whether the fee payer approves a filled transaction. */
16
+ export async function shouldSponsor(options) {
17
+ const { sender, transaction, validate } = options;
18
+ if (!validate)
19
+ return true;
20
+ return await validate({
21
+ ...transaction,
22
+ from: sender,
23
+ });
24
+ }
25
+ /** Returns whether a raw Tempo transaction is explicitly requesting sponsorship. */
26
+ export function requestsRawSponsorship(serialized) {
27
+ if (!serialized.startsWith('0x76') && !serialized.startsWith('0x78'))
28
+ return false;
29
+ const transaction = Transaction.deserialize(serialized);
30
+ return 'feePayerSignature' in transaction && transaction.feePayerSignature === null;
31
+ }
32
+ /** Returns `true` when a fill request already has the fields needed for sponsorship signing. */
33
+ export function isPreparedTransaction(value) {
34
+ return (typeof value.from === 'string' &&
35
+ typeof Utils.resolveChainId(value.chainId) === 'number' &&
36
+ typeof value.gas !== 'undefined' &&
37
+ typeof value.nonce !== 'undefined' &&
38
+ (typeof value.maxFeePerGas !== 'undefined' || typeof value.gasPrice !== 'undefined'));
39
+ }
40
+ /** Signs a filled transaction as the fee payer. */
41
+ export async function sign(options) {
42
+ const { account, transaction, sender } = options;
43
+ const from = transaction.from ?? sender;
44
+ const { signature: _, ...withoutSenderSig } = transaction;
45
+ const prepared = { ...withoutSenderSig, from };
46
+ if (!prepared.from)
47
+ throw new RpcResponse.InvalidParamsError({
48
+ message: 'Transaction sender must be provided before fee payer signing.',
49
+ });
50
+ if (!account.sign)
51
+ throw new Error('Fee payer account cannot sign transactions.');
52
+ const feePayerSignature = Signature.from(await account.sign({
53
+ hash: TxEnvelopeTempo.getFeePayerSignPayload(TxEnvelopeTempo.from(prepared), {
54
+ sender: prepared.from,
55
+ }),
56
+ }));
57
+ return { ...prepared, feePayerSignature };
58
+ }
59
+ /** Handles `eth_signRawTransaction` and broadcast methods for sponsored Tempo transactions. */
60
+ export async function handleRawTransaction(options) {
61
+ const { account, getClient, method, request, validate } = options;
62
+ const serialized = request.params?.[0];
63
+ if (!serialized?.startsWith('0x76') && !serialized?.startsWith('0x78'))
64
+ throw new RpcResponse.InvalidParamsError({
65
+ message: 'Only Tempo (0x76/0x78) transactions are supported.',
66
+ });
67
+ const transaction = Transaction.deserialize(serialized);
68
+ if (!transaction.signature || !transaction.from)
69
+ throw new RpcResponse.InvalidParamsError({
70
+ message: 'Transaction must be signed by the sender before fee payer signing.',
71
+ });
72
+ if (validate && !(await validate(transaction)))
73
+ throw new RpcResponse.InvalidParamsError({
74
+ message: 'Sponsorship rejected.',
75
+ });
76
+ const client = getClient(transaction.chainId);
77
+ const serializedTransaction = toSerializedTransaction(await signTransaction(client, {
78
+ ...transaction,
79
+ account,
80
+ feePayer: account,
81
+ }));
82
+ if (method === 'eth_signRawTransaction')
83
+ return serializedTransaction;
84
+ return await client.request({
85
+ method: method,
86
+ params: [serializedTransaction],
87
+ });
88
+ }
89
+ function toSerializedTransaction(value) {
90
+ if (typeof value === 'string')
91
+ return value;
92
+ if (value && typeof value === 'object' && 'raw' in value && typeof value.raw === 'string')
93
+ return value.raw;
94
+ throw new Error('Expected a serialized transaction result.');
95
+ }
96
+ //# sourceMappingURL=sponsorship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sponsorship.js","sourceRoot":"","sources":["../../../../src/server/internal/handlers/sponsorship.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ import { type Client } from 'viem';
4
4
  import * as z from 'zod/mini';
5
5
  export declare function resolveChainId(value: unknown): number | undefined;
6
6
  export declare function formatFillTransactionRequest(client: Client, value: Record<string, unknown>): Record<string, unknown>;
7
- export declare function normalizeFillTransactionRequest(value: Record<string, unknown>): Record<string, unknown>;
7
+ export declare function normalizeFillTransactionRequest(tx: Record<string, unknown>): {
8
+ calls: any[];
9
+ };
8
10
  export declare function normalizeTempoTransaction(value: Record<string, unknown> | undefined): core_Transaction.Transaction<false, bigint, number>;
9
11
  /** Returns a raw JSON-RPC error response object (not wrapped in a `Response`). */
10
12
  export declare function rpcErrorJson(request: RpcRequest.RpcRequest, error: unknown): {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/server/internal/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AACjD,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,MAAM,CAAA;AAC7C,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,sBAK5C;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAI1F;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAW7E;AAOD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,uDAGnF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;EA2B1E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,YAEtE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,YAExE;AAED,eAAO,MAAM,WAAW,gHAA2D,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/server/internal/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAA;AACjD,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,MAAM,CAAA;AAC7C,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,sBAK5C;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAI1F;AAED,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;EAgB1E;AAOD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,uDAGnF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;EA2B1E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,YAEtE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,YAExE;AAED,eAAO,MAAM,WAAW,gHAA2D,CAAA"}
@@ -17,19 +17,22 @@ export function formatFillTransactionRequest(client, value) {
17
17
  return value;
18
18
  return format({ ...value }, 'fillTransaction');
19
19
  }
20
- export function normalizeFillTransactionRequest(value) {
21
- if (typeof value.to !== 'undefined' || typeof value.data !== 'undefined')
22
- return value;
23
- if (!Array.isArray(value.calls) || value.calls.length !== 1)
24
- return value;
25
- const [call] = value.calls;
26
- const { calls: _, ...rest } = value;
27
- return {
28
- ...rest,
29
- ...(typeof call?.data !== 'undefined' ? { data: call.data } : {}),
30
- ...(typeof call?.to !== 'undefined' ? { to: call.to } : {}),
31
- ...(typeof call?.value !== 'undefined' ? { value: normalizeFillValue(call.value) } : {}),
20
+ export function normalizeFillTransactionRequest(tx) {
21
+ const { to, data, value, ...rest } = tx;
22
+ if (Array.isArray(tx.calls) && tx.calls.length > 0)
23
+ return {
24
+ ...tx,
25
+ calls: tx.calls.map((call) => ({
26
+ ...call,
27
+ value: normalizeFillValue(call.value),
28
+ })),
29
+ };
30
+ const call = {
31
+ ...(typeof to !== 'undefined' ? { to } : {}),
32
+ ...(typeof data !== 'undefined' ? { data } : {}),
33
+ ...(typeof value !== 'undefined' ? { value: normalizeFillValue(value) } : {}),
32
34
  };
35
+ return { ...rest, calls: [call] };
33
36
  }
34
37
  function normalizeFillValue(value) {
35
38
  if (typeof value !== 'string' || !value.startsWith('0x'))
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/server/internal/handlers/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/server/internal/handlers/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "accounts",
3
3
  "description": "Tempo Accounts SDK",
4
4
  "type": "module",
5
- "version": "0.6.7",
5
+ "version": "0.7.0",
6
6
  "dependencies": {
7
7
  "hono": "^4.12.12",
8
8
  "idb-keyval": "^6.2.2",
@@ -0,0 +1,205 @@
1
+ import { describe, expect, test } from 'vp/test'
2
+
3
+ import * as ExecutionError from './ExecutionError.js'
4
+
5
+ // ABI-encoded revert data fixtures.
6
+ const insufficientBalanceData =
7
+ '0x832f98b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000020c0000000000000000000000000000000000001' as const
8
+ const unauthorizedData = '0x82b42900' as const
9
+ const tokenAlreadyExistsData =
10
+ '0x15ef3a5700000000000000000000000020c0000000000000000000000000000000000001' as const
11
+
12
+ describe('parse', () => {
13
+ test('decodes InsufficientBalance from revert data', () => {
14
+ const error = Object.assign(new Error('reverted'), {
15
+ data: insufficientBalanceData,
16
+ })
17
+ const result = ExecutionError.parse(error)
18
+ expect(result).toMatchInlineSnapshot(`
19
+ {
20
+ "abiItem": {
21
+ "inputs": [
22
+ {
23
+ "name": "available",
24
+ "type": "uint256",
25
+ },
26
+ {
27
+ "name": "required",
28
+ "type": "uint256",
29
+ },
30
+ {
31
+ "name": "token",
32
+ "type": "address",
33
+ },
34
+ ],
35
+ "name": "InsufficientBalance",
36
+ "type": "error",
37
+ },
38
+ "args": [
39
+ 0n,
40
+ 100000000n,
41
+ "0x20C0000000000000000000000000000000000001",
42
+ ],
43
+ "data": "0x832f98b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000020c0000000000000000000000000000000000001",
44
+ "errorName": "InsufficientBalance",
45
+ "message": "Insufficient balance. Required: 100000000, available: 0.",
46
+ }
47
+ `)
48
+ })
49
+
50
+ test('decodes Unauthorized (no args)', () => {
51
+ const error = Object.assign(new Error('reverted'), {
52
+ data: unauthorizedData,
53
+ })
54
+ const result = ExecutionError.parse(error)
55
+ expect(result.errorName).toBe('Unauthorized')
56
+ expect(result.message).toBe('Unauthorized.')
57
+ })
58
+
59
+ test('decodes TokenAlreadyExists with templated message', () => {
60
+ const error = Object.assign(new Error('reverted'), {
61
+ data: tokenAlreadyExistsData,
62
+ })
63
+ const result = ExecutionError.parse(error)
64
+ expect(result.errorName).toBe('TokenAlreadyExists')
65
+ expect(result.message).toBe('Token 0x20C0000000000000000000000000000000000001 already exists.')
66
+ })
67
+
68
+ test('extracts revert data from nested cause', () => {
69
+ const inner = Object.assign(new Error('inner'), {
70
+ data: unauthorizedData,
71
+ })
72
+ const error = Object.assign(new Error('outer'), { cause: inner })
73
+ const result = ExecutionError.parse(error)
74
+ expect(result.errorName).toBe('Unauthorized')
75
+ })
76
+
77
+ test('extracts revert data from nested error property', () => {
78
+ const inner = Object.assign(new Error('inner'), {
79
+ data: insufficientBalanceData,
80
+ })
81
+ const error = Object.assign(new Error('outer'), { error: inner })
82
+ const result = ExecutionError.parse(error)
83
+ expect(result.errorName).toBe('InsufficientBalance')
84
+ })
85
+
86
+ test('extracts revert data via walk method', () => {
87
+ const inner = { data: unauthorizedData }
88
+ const error = Object.assign(new Error('walkable'), {
89
+ walk: (fn: (e: unknown) => boolean) => (fn(inner) ? inner : null),
90
+ })
91
+ const result = ExecutionError.parse(error)
92
+ expect(result.errorName).toBe('Unauthorized')
93
+ })
94
+
95
+ test('fallback: extracts error name from human-readable revert message', () => {
96
+ const error = new Error('execution reverted: Unauthorized(something)')
97
+ const result = ExecutionError.parse(error)
98
+ expect(result.errorName).toBe('unknown')
99
+ expect(result.message).toBe('Unauthorized.')
100
+ })
101
+
102
+ test('fallback: uses details property', () => {
103
+ const error = Object.assign(new Error('ignored'), {
104
+ details: 'execution reverted: Unauthorized(x)',
105
+ })
106
+ const result = ExecutionError.parse(error)
107
+ expect(result.errorName).toBe('unknown')
108
+ expect(result.message).toBe('Unauthorized.')
109
+ })
110
+
111
+ test('fallback: uses shortMessage property', () => {
112
+ const error = Object.assign(new Error('ignored'), {
113
+ shortMessage: 'execution reverted: Unauthorized(x)',
114
+ })
115
+ const result = ExecutionError.parse(error)
116
+ expect(result.errorName).toBe('unknown')
117
+ expect(result.message).toBe('Unauthorized.')
118
+ })
119
+
120
+ test('unknown error: returns raw message', () => {
121
+ const error = new Error('something went wrong')
122
+ const result = ExecutionError.parse(error)
123
+ expect(result.message).toBe('something went wrong')
124
+ expect(result.errorName).toBe('unknown')
125
+ })
126
+
127
+ test('unknown error: strips "execution reverted:" prefix', () => {
128
+ const error = new Error('execution reverted: mystery failure')
129
+ const result = ExecutionError.parse(error)
130
+ expect(result.message).toBe('mystery failure')
131
+ })
132
+
133
+ test('undecodable revert data falls back to raw message', () => {
134
+ const error = Object.assign(new Error('bad revert'), {
135
+ data: '0xdeadbeef',
136
+ })
137
+ const result = ExecutionError.parse(error)
138
+ expect(result.message).toBe('bad revert')
139
+ expect(result.errorName).toBe('unknown')
140
+ })
141
+ })
142
+
143
+ describe('serialize', () => {
144
+ test('serializes InsufficientBalance', () => {
145
+ const parsed = ExecutionError.parse(
146
+ Object.assign(new Error(''), { data: insufficientBalanceData }),
147
+ )
148
+ const serialized = ExecutionError.serialize(parsed)
149
+ expect(serialized).toMatchInlineSnapshot(`
150
+ {
151
+ "abiItem": {
152
+ "inputs": [
153
+ {
154
+ "name": "available",
155
+ "type": "uint256",
156
+ },
157
+ {
158
+ "name": "required",
159
+ "type": "uint256",
160
+ },
161
+ {
162
+ "name": "token",
163
+ "type": "address",
164
+ },
165
+ ],
166
+ "name": "InsufficientBalance",
167
+ "type": "error",
168
+ },
169
+ "data": "0x832f98b500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000020c0000000000000000000000000000000000001",
170
+ "errorName": "InsufficientBalance",
171
+ "message": "Insufficient balance. Required: 100000000, available: 0.",
172
+ }
173
+ `)
174
+ })
175
+
176
+ test('serializes unknown error', () => {
177
+ const parsed = ExecutionError.parse(new Error('boom'))
178
+ const serialized = ExecutionError.serialize(parsed)
179
+ expect(serialized).toMatchInlineSnapshot(`
180
+ {
181
+ "errorName": "unknown",
182
+ "message": "boom",
183
+ }
184
+ `)
185
+ })
186
+
187
+ test('serializes error with no args', () => {
188
+ const parsed = ExecutionError.parse(Object.assign(new Error(''), { data: unauthorizedData }))
189
+ const serialized = ExecutionError.serialize(parsed)
190
+ expect(serialized.errorName).toBe('Unauthorized')
191
+ })
192
+ })
193
+
194
+ describe('messages', () => {
195
+ test('all messages end with a period', () => {
196
+ for (const [name, msg] of Object.entries(ExecutionError.messages))
197
+ expect(msg, `${name} message should end with "."`).toMatch(/\.$/)
198
+ })
199
+
200
+ test('templated messages contain placeholders', () => {
201
+ expect(ExecutionError.messages.InsufficientBalance).toContain('{0}')
202
+ expect(ExecutionError.messages.InsufficientBalance).toContain('{1}')
203
+ expect(ExecutionError.messages.TokenAlreadyExists).toContain('{0}')
204
+ })
205
+ })