tapimo 0.0.2 → 0.1.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.
- package/README.md +11 -2
- package/dist/ApiKey.d.ts +12 -11
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +10 -12
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +139 -0
- package/dist/ApiKeys.d.ts.map +1 -0
- package/dist/ApiKeys.js +166 -0
- package/dist/ApiKeys.js.map +1 -0
- package/dist/App.d.ts +920 -910
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +36 -12
- package/dist/App.js.map +1 -1
- package/dist/Handler.d.ts +86 -0
- package/dist/Handler.d.ts.map +1 -0
- package/dist/Handler.js +83 -0
- package/dist/Handler.js.map +1 -0
- package/dist/Scope.d.ts +4 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +5 -1
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +3 -5
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +9 -2
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/Access.d.ts +1 -3
- package/dist/admin/Access.d.ts.map +1 -1
- package/dist/admin/Access.js +1 -3
- package/dist/admin/Access.js.map +1 -1
- package/dist/admin/App.d.ts +98 -209
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +2 -4
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +7 -5
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -9
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/scopes.d.ts +3 -0
- package/dist/admin/apps/scopes.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +101 -215
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +17 -38
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +1 -1
- package/dist/apps/balances.d.ts +2 -2
- package/dist/apps/receipts.d.ts +43 -43
- package/dist/apps/tokens.d.ts +454 -454
- package/dist/apps/transactions.d.ts +43 -43
- package/dist/apps/transfers.d.ts +29 -29
- package/dist/apps/webhooks.d.ts +5 -2
- package/dist/apps/webhooks.d.ts.map +1 -1
- package/dist/apps/webhooks.js +38 -34
- package/dist/apps/webhooks.js.map +1 -1
- package/dist/{Cli.d.ts → cli/Cli.d.ts} +13 -2
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +19 -0
- package/dist/cli/Cli.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +60 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cloudflare.d.ts +7 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +9 -0
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +103 -0
- package/dist/db/Db.d.ts.map +1 -0
- package/dist/db/Db.js +274 -0
- package/dist/db/Db.js.map +1 -0
- package/dist/db/Schema.d.ts +88 -0
- package/dist/db/Schema.d.ts.map +1 -0
- package/dist/db/Schema.js +130 -0
- package/dist/db/Schema.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +79 -0
- package/dist/db/tables/organizations.d.ts.map +1 -0
- package/dist/db/tables/organizations.js +81 -0
- package/dist/db/tables/organizations.js.map +1 -0
- package/dist/db/tables/verifiedTokens.d.ts +53 -0
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -0
- package/dist/db/tables/verifiedTokens.js +74 -0
- package/dist/db/tables/verifiedTokens.js.map +1 -0
- package/dist/db/tables/webhookDeliveries.d.ts +71 -0
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -0
- package/dist/db/tables/webhookDeliveries.js +119 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -0
- package/dist/db/tables/webhookSubscriptions.d.ts +158 -0
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -0
- package/dist/db/tables/webhookSubscriptions.js +272 -0
- package/dist/db/tables/webhookSubscriptions.js.map +1 -0
- package/dist/handlers/internal/executionError.d.ts +25 -0
- package/dist/handlers/internal/executionError.d.ts.map +1 -0
- package/dist/handlers/internal/executionError.js +184 -0
- package/dist/handlers/internal/executionError.js.map +1 -0
- package/dist/handlers/internal/multisig.d.ts +237 -0
- package/dist/handlers/internal/multisig.d.ts.map +1 -0
- package/dist/handlers/internal/multisig.js +567 -0
- package/dist/handlers/internal/multisig.js.map +1 -0
- package/dist/handlers/internal/requestListener.d.ts +124 -0
- package/dist/handlers/internal/requestListener.d.ts.map +1 -0
- package/dist/handlers/internal/requestListener.js +173 -0
- package/dist/handlers/internal/requestListener.js.map +1 -0
- package/dist/handlers/internal/sponsorship.d.ts +83 -0
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -0
- package/dist/handlers/internal/sponsorship.js +103 -0
- package/dist/handlers/internal/sponsorship.js.map +1 -0
- package/dist/handlers/internal/types.d.ts +284 -0
- package/dist/handlers/internal/types.d.ts.map +1 -0
- package/dist/handlers/internal/types.js +2 -0
- package/dist/handlers/internal/types.js.map +1 -0
- package/dist/handlers/internal/utils.d.ts +34 -0
- package/dist/handlers/internal/utils.d.ts.map +1 -0
- package/dist/handlers/internal/utils.js +131 -0
- package/dist/handlers/internal/utils.js.map +1 -0
- package/dist/handlers/relay.d.ts +119 -0
- package/dist/handlers/relay.d.ts.map +1 -0
- package/dist/handlers/relay.js +1264 -0
- package/dist/handlers/relay.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/Auth.d.ts +16 -10
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +72 -12
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/RpcSchema.d.ts +10 -0
- package/dist/internal/RpcSchema.d.ts.map +1 -0
- package/dist/internal/RpcSchema.js +2 -0
- package/dist/internal/RpcSchema.js.map +1 -0
- package/dist/internal/Store.d.ts +42 -3
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +65 -3
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/VerifiedTokens.d.ts +15 -34
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +115 -159
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +49 -35
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +92 -205
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +7 -2
- package/src/ApiKey.test.ts +3 -3
- package/src/ApiKey.ts +10 -12
- package/src/ApiKeys.test.ts +175 -0
- package/src/ApiKeys.ts +205 -0
- package/src/App.test-d.ts +1 -1
- package/src/App.test.ts +10768 -351
- package/src/App.ts +79 -36
- package/src/Client.test-d.ts +1 -1
- package/src/Handler.ts +154 -0
- package/src/Scope.ts +5 -1
- package/src/Webhooks.test.ts +8 -7
- package/src/Webhooks.ts +11 -5
- package/src/admin/Access.ts +1 -3
- package/src/admin/App.ts +19 -24
- package/src/admin/apps/api-keys.test.ts +19 -18
- package/src/admin/apps/api-keys.ts +8 -9
- package/src/admin/apps/scopes.test.ts +4 -0
- package/src/admin/apps/verified-tokens.test.ts +3 -30
- package/src/admin/apps/verified-tokens.ts +17 -36
- package/src/admin/ui.generated.ts +1 -1
- package/src/apps/balances.test.ts +4 -3
- package/src/apps/blocks.test.ts +1 -1
- package/src/apps/exchanges.test.ts +1 -1
- package/src/apps/indexer.test.ts +1 -1
- package/src/apps/receipts.test.ts +1 -1
- package/src/apps/rpc.test.ts +100 -10
- package/src/apps/tokenlist.test.ts +5 -7
- package/src/apps/tokens.test.ts +4 -3
- package/src/apps/transactions.test.ts +1 -1
- package/src/apps/transfers.test.ts +1 -1
- package/src/apps/verified-tokens.test.ts +24 -12
- package/src/apps/webhooks.test.ts +130 -143
- package/src/apps/webhooks.ts +45 -47
- package/src/{Cli.test.ts → cli/Cli.test.ts} +10 -9
- package/src/{Cli.ts → cli/Cli.ts} +16 -9
- package/src/cli/bin.ts +4 -0
- package/src/cli/commands/admin.test.ts +71 -0
- package/src/cli/commands/admin.ts +60 -0
- package/src/cloudflare.ts +10 -0
- package/src/db/Db.test.ts +84 -0
- package/src/db/Db.ts +383 -0
- package/src/db/Schema.ts +164 -0
- package/src/db/tables/organizations.test.ts +124 -0
- package/src/db/tables/organizations.ts +127 -0
- package/src/db/tables/verifiedTokens.ts +111 -0
- package/src/db/tables/webhookDeliveries.ts +159 -0
- package/src/db/tables/webhookSubscriptions.ts +358 -0
- package/src/handlers/internal/executionError.ts +205 -0
- package/src/handlers/internal/multisig.localnet.test.ts +146 -0
- package/src/handlers/internal/multisig.test.ts +744 -0
- package/src/handlers/internal/multisig.ts +858 -0
- package/src/handlers/internal/relay.localnet.test.ts +2035 -0
- package/src/handlers/internal/requestListener.ts +273 -0
- package/src/handlers/internal/sponsorship.ts +186 -0
- package/src/handlers/internal/types.ts +378 -0
- package/src/handlers/internal/utils.ts +153 -0
- package/src/handlers/relay.ts +1605 -0
- package/src/index.ts +4 -2
- package/src/internal/Auth.test.ts +21 -21
- package/src/internal/Auth.ts +92 -19
- package/src/internal/RateLimit.test.ts +1 -1
- package/src/internal/RpcSchema.ts +10 -0
- package/src/internal/Store.test.ts +98 -10
- package/src/internal/Store.ts +112 -6
- package/src/internal/VerifiedTokens.test.ts +99 -115
- package/src/internal/VerifiedTokens.ts +123 -175
- package/src/internal/Webhooks.test.ts +107 -107
- package/src/internal/Webhooks.ts +102 -220
- package/dist/ApiKeySource.d.ts +0 -166
- package/dist/ApiKeySource.d.ts.map +0 -1
- package/dist/ApiKeySource.js +0 -234
- package/dist/ApiKeySource.js.map +0 -1
- package/dist/Cli.d.ts.map +0 -1
- package/dist/Cli.js +0 -13
- package/dist/Cli.js.map +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
- package/seeds/31318/verified-tokens.json +0 -30
- package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
- package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +0 -4
- package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +0 -30
- package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +0 -11
- package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +0 -1
- package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +0 -5
- package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
- package/seeds/4217/verified-tokens.json +0 -177
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +0 -1
- package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +0 -1
- package/seeds/42431/verified-tokens.json +0 -44
- package/seeds/openrpc/README.md +0 -27
- package/seeds/openrpc/execution-apis.json +0 -8989
- package/src/ApiKeySource.test-d.ts +0 -11
- package/src/ApiKeySource.test.ts +0 -295
- package/src/ApiKeySource.ts +0 -303
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
import { Hex, Json, RpcResponse, Signature } from 'ox';
|
|
2
|
+
import { MultisigConfig, SignatureEnvelope, TxEnvelopeTempo } from 'ox/tempo';
|
|
3
|
+
import { Transaction } from 'viem/tempo';
|
|
4
|
+
import * as core_Store from '../../internal/Store.js';
|
|
5
|
+
import * as Sponsorship from './sponsorship.js';
|
|
6
|
+
import * as Utils from './utils.js';
|
|
7
|
+
/** Default submission-claim TTL in milliseconds. */
|
|
8
|
+
export const defaultClaimTtl = 30_000;
|
|
9
|
+
/** Returns whether a raw transaction carries a native multisig signature. */
|
|
10
|
+
export function isMultisigTransaction(serialized) {
|
|
11
|
+
if (!Utils.isSerializedTempoTransaction(serialized))
|
|
12
|
+
return false;
|
|
13
|
+
try {
|
|
14
|
+
const transaction = Transaction.deserialize(serialized);
|
|
15
|
+
return isMultisigSignature(transaction.signature);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Handles a native multisig raw transaction submission. */
|
|
22
|
+
export async function handleRawTransaction(options) {
|
|
23
|
+
const result = await collect(options);
|
|
24
|
+
if (result.status.status === 'pending' || result.status.status === 'submitting')
|
|
25
|
+
return result.status.operation.id;
|
|
26
|
+
if (result.status.status === 'submitted')
|
|
27
|
+
return result.status.operation.submittedHash ?? result.status.operation.id;
|
|
28
|
+
if (options.method === 'eth_sendRawTransactionSync')
|
|
29
|
+
return result.broadcastResult;
|
|
30
|
+
return result.status.operation.submittedHash;
|
|
31
|
+
}
|
|
32
|
+
async function collect(options) {
|
|
33
|
+
const { claimTtl = defaultClaimTtl, finalize = 'sync', getClient, method, request, resolveConfig, sponsor, store, } = options;
|
|
34
|
+
const serialized = request.params?.[0];
|
|
35
|
+
if (!Utils.isSerializedTempoTransaction(serialized))
|
|
36
|
+
throw new RpcResponse.InvalidParamsError({
|
|
37
|
+
message: 'Only Tempo (0x76/0x78) transactions are supported.',
|
|
38
|
+
});
|
|
39
|
+
const input = parse(serialized);
|
|
40
|
+
const pending = await store.get(input.id);
|
|
41
|
+
const config = await resolveValidatedConfig({
|
|
42
|
+
account: input.account,
|
|
43
|
+
chainId: input.chainId,
|
|
44
|
+
genesisConfigId: input.genesisConfigId,
|
|
45
|
+
init: input.init,
|
|
46
|
+
pending,
|
|
47
|
+
resolveConfig,
|
|
48
|
+
});
|
|
49
|
+
if (!config)
|
|
50
|
+
throw new RpcResponse.InvalidParamsError({
|
|
51
|
+
message: 'Multisig config is required to collect approvals. Provide it in the bootstrap transaction or configure `multisig.resolveConfig`.',
|
|
52
|
+
});
|
|
53
|
+
const initConfig = resolveInitConfig({
|
|
54
|
+
config,
|
|
55
|
+
genesisConfigId: input.genesisConfigId,
|
|
56
|
+
init: input.init,
|
|
57
|
+
nonce: input.nonce,
|
|
58
|
+
pending,
|
|
59
|
+
});
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
let operation = {
|
|
62
|
+
account: input.account,
|
|
63
|
+
chainId: input.chainId,
|
|
64
|
+
claimExpiresAt: pending?.claimExpiresAt,
|
|
65
|
+
config,
|
|
66
|
+
createdAt: pending?.createdAt ?? now,
|
|
67
|
+
genesisConfigId: input.genesisConfigId,
|
|
68
|
+
id: input.id,
|
|
69
|
+
init: pending?.init || !!initConfig,
|
|
70
|
+
initConfig,
|
|
71
|
+
payload: input.payload,
|
|
72
|
+
signatures: mergeSignatures([...(pending?.signatures ?? []), ...input.signatures]),
|
|
73
|
+
status: pending?.status === 'submitted' ? 'submitted' : 'pending',
|
|
74
|
+
submittedHash: pending?.submittedHash,
|
|
75
|
+
transaction: serialized,
|
|
76
|
+
updatedAt: now,
|
|
77
|
+
};
|
|
78
|
+
let approvals = getApprovals({
|
|
79
|
+
account: input.account,
|
|
80
|
+
config,
|
|
81
|
+
genesisConfigId: input.genesisConfigId,
|
|
82
|
+
payload: input.payload,
|
|
83
|
+
signatures: operation.signatures,
|
|
84
|
+
});
|
|
85
|
+
if (operation.status === 'submitted')
|
|
86
|
+
return {
|
|
87
|
+
broadcastResult: operation.submittedHash,
|
|
88
|
+
status: { operation, status: 'submitted' },
|
|
89
|
+
};
|
|
90
|
+
if (approvals.weight < approvals.threshold) {
|
|
91
|
+
operation = await store.savePending(operation);
|
|
92
|
+
approvals = getApprovals({
|
|
93
|
+
account: operation.account,
|
|
94
|
+
config,
|
|
95
|
+
genesisConfigId: operation.genesisConfigId,
|
|
96
|
+
payload: operation.payload,
|
|
97
|
+
signatures: operation.signatures,
|
|
98
|
+
});
|
|
99
|
+
if (approvals.weight < approvals.threshold)
|
|
100
|
+
return { status: { operation, status: operation.status } };
|
|
101
|
+
}
|
|
102
|
+
const claim = await store.claimSubmission(operation, { ttl: claimTtl });
|
|
103
|
+
if (claim.status !== 'claimed')
|
|
104
|
+
return { status: claim };
|
|
105
|
+
operation = claim.operation;
|
|
106
|
+
approvals = getApprovals({
|
|
107
|
+
account: operation.account,
|
|
108
|
+
config,
|
|
109
|
+
genesisConfigId: operation.genesisConfigId,
|
|
110
|
+
payload: operation.payload,
|
|
111
|
+
signatures: operation.signatures,
|
|
112
|
+
});
|
|
113
|
+
const client = getClient(operation.chainId);
|
|
114
|
+
const final = await serializeFinal({
|
|
115
|
+
account: operation.account,
|
|
116
|
+
genesisConfigId: operation.genesisConfigId,
|
|
117
|
+
init: operation.initConfig ?? initConfig,
|
|
118
|
+
signatures: approvals.signatures,
|
|
119
|
+
transaction: input.transaction,
|
|
120
|
+
});
|
|
121
|
+
const broadcastMethod = method === 'eth_sendRawTransaction' && finalize === 'sync'
|
|
122
|
+
? 'eth_sendRawTransactionSync'
|
|
123
|
+
: method;
|
|
124
|
+
const feePayerState = (() => {
|
|
125
|
+
try {
|
|
126
|
+
const transaction = Transaction.deserialize(final);
|
|
127
|
+
// No fee-payer field means finalized transaction does not request sponsorship.
|
|
128
|
+
if (!('feePayerSignature' in transaction))
|
|
129
|
+
return {};
|
|
130
|
+
// Preserve fee-token/signature marker for sponsorship decision below.
|
|
131
|
+
return {
|
|
132
|
+
feeToken: typeof transaction['feeToken'] === 'string'
|
|
133
|
+
? transaction['feeToken']
|
|
134
|
+
: undefined,
|
|
135
|
+
signature: transaction['feePayerSignature'],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Decode failure falls back to direct broadcast.
|
|
140
|
+
return {};
|
|
141
|
+
}
|
|
142
|
+
})();
|
|
143
|
+
const sponsorFeeToken = await (async () => {
|
|
144
|
+
// No sponsor configured, so finalized multisig transaction broadcasts as-is.
|
|
145
|
+
if (!sponsor)
|
|
146
|
+
return undefined;
|
|
147
|
+
// Already fee-payer signed transactions must not be rewritten by this relay.
|
|
148
|
+
if (feePayerState.signature !== null)
|
|
149
|
+
return undefined;
|
|
150
|
+
// Explicit relay fee token wins when the transaction requests sponsorship.
|
|
151
|
+
if (sponsor.feeToken)
|
|
152
|
+
return sponsor.feeToken;
|
|
153
|
+
// `null` requests relay-added fee-payer signature.
|
|
154
|
+
return await sponsor.resolveFeeToken?.(operation.chainId);
|
|
155
|
+
})();
|
|
156
|
+
const shouldSponsor = (() => {
|
|
157
|
+
// No sponsor configured, so no sponsorship path to take.
|
|
158
|
+
if (!sponsor)
|
|
159
|
+
return false;
|
|
160
|
+
// `null` requests relay-added fee-payer signature.
|
|
161
|
+
if (feePayerState.signature === null)
|
|
162
|
+
return true;
|
|
163
|
+
// Missing or already-present fee-payer signatures broadcast unchanged.
|
|
164
|
+
return false;
|
|
165
|
+
})();
|
|
166
|
+
const result = await (async () => {
|
|
167
|
+
// Sponsorship enabled, so sponsor adds/signs fee-payer fields.
|
|
168
|
+
if (shouldSponsor && sponsor)
|
|
169
|
+
return await Sponsorship.handleRawTransaction({
|
|
170
|
+
account: sponsor.account,
|
|
171
|
+
feeToken: sponsorFeeToken,
|
|
172
|
+
getFeeToken: sponsor.resolveFeeToken
|
|
173
|
+
? async (chainId) => await sponsor.resolveFeeToken?.(chainId)
|
|
174
|
+
: undefined,
|
|
175
|
+
getClient,
|
|
176
|
+
method: broadcastMethod,
|
|
177
|
+
request: { params: [final] },
|
|
178
|
+
sender: operation.account,
|
|
179
|
+
validate: sponsor.validate,
|
|
180
|
+
});
|
|
181
|
+
// Otherwise, multisig transaction is final and can broadcast directly.
|
|
182
|
+
return await client.request({
|
|
183
|
+
method: broadcastMethod,
|
|
184
|
+
params: [final],
|
|
185
|
+
});
|
|
186
|
+
})();
|
|
187
|
+
const submittedHash = (() => {
|
|
188
|
+
if (typeof result === 'string')
|
|
189
|
+
return result;
|
|
190
|
+
if (result && typeof result === 'object' && 'transactionHash' in result) {
|
|
191
|
+
const response = result;
|
|
192
|
+
if (typeof response.transactionHash === 'string')
|
|
193
|
+
return response.transactionHash;
|
|
194
|
+
}
|
|
195
|
+
throw new Error('Expected transaction hash in multisig broadcast result.');
|
|
196
|
+
})();
|
|
197
|
+
const submitted = await store.setSubmitted(operation.id, submittedHash);
|
|
198
|
+
return {
|
|
199
|
+
broadcastResult: result,
|
|
200
|
+
status: { operation: submitted, status: 'claimed' },
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** Resolves a multisig operation id for standard transaction lookup methods. */
|
|
204
|
+
export async function handleGetTransaction(options) {
|
|
205
|
+
const id = options.request.params?.[0];
|
|
206
|
+
if (typeof id !== 'string')
|
|
207
|
+
return undefined;
|
|
208
|
+
const operation = await options.store.get(id);
|
|
209
|
+
if (!operation)
|
|
210
|
+
return undefined;
|
|
211
|
+
if (operation.status !== 'submitted' || !operation.submittedHash)
|
|
212
|
+
return { result: null };
|
|
213
|
+
const result = await options.getClient(operation.chainId).request({
|
|
214
|
+
method: options.method,
|
|
215
|
+
params: [operation.submittedHash],
|
|
216
|
+
});
|
|
217
|
+
return { result };
|
|
218
|
+
}
|
|
219
|
+
/** Returns a stored native multisig operation status. */
|
|
220
|
+
export async function getStatus(options) {
|
|
221
|
+
const operation = await options.store.get(options.id);
|
|
222
|
+
if (!operation)
|
|
223
|
+
return null;
|
|
224
|
+
const config = await resolveValidatedConfig({
|
|
225
|
+
account: operation.account,
|
|
226
|
+
chainId: operation.chainId,
|
|
227
|
+
genesisConfigId: operation.genesisConfigId,
|
|
228
|
+
pending: operation,
|
|
229
|
+
resolveConfig: options.resolveConfig,
|
|
230
|
+
});
|
|
231
|
+
if (!config)
|
|
232
|
+
return {
|
|
233
|
+
account: operation.account,
|
|
234
|
+
chainId: operation.chainId,
|
|
235
|
+
genesisConfigId: operation.genesisConfigId,
|
|
236
|
+
id: operation.id,
|
|
237
|
+
signatures: operation.signatures.length,
|
|
238
|
+
status: operation.status,
|
|
239
|
+
submittedHash: operation.submittedHash,
|
|
240
|
+
};
|
|
241
|
+
const approvals = getApprovals({
|
|
242
|
+
account: operation.account,
|
|
243
|
+
config,
|
|
244
|
+
genesisConfigId: operation.genesisConfigId,
|
|
245
|
+
payload: operation.payload,
|
|
246
|
+
signatures: operation.signatures,
|
|
247
|
+
});
|
|
248
|
+
return toStatus({ approvals, operation });
|
|
249
|
+
}
|
|
250
|
+
/** Returns pending native multisig operation statuses for an account. */
|
|
251
|
+
export async function listStatuses(options) {
|
|
252
|
+
const operations = await options.store.listPendingByAddress(options.account);
|
|
253
|
+
return await Promise.all(operations.map(async (operation) => {
|
|
254
|
+
const config = await resolveValidatedConfig({
|
|
255
|
+
account: operation.account,
|
|
256
|
+
chainId: operation.chainId,
|
|
257
|
+
genesisConfigId: operation.genesisConfigId,
|
|
258
|
+
pending: operation,
|
|
259
|
+
resolveConfig: options.resolveConfig,
|
|
260
|
+
});
|
|
261
|
+
if (!config)
|
|
262
|
+
return {
|
|
263
|
+
account: operation.account,
|
|
264
|
+
chainId: operation.chainId,
|
|
265
|
+
genesisConfigId: operation.genesisConfigId,
|
|
266
|
+
id: operation.id,
|
|
267
|
+
signatures: operation.signatures.length,
|
|
268
|
+
status: operation.status,
|
|
269
|
+
submittedHash: operation.submittedHash,
|
|
270
|
+
};
|
|
271
|
+
const approvals = getApprovals({
|
|
272
|
+
account: operation.account,
|
|
273
|
+
config,
|
|
274
|
+
genesisConfigId: operation.genesisConfigId,
|
|
275
|
+
payload: operation.payload,
|
|
276
|
+
signatures: operation.signatures,
|
|
277
|
+
});
|
|
278
|
+
return toStatus({ approvals, operation });
|
|
279
|
+
}));
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Creates a multisig operation store backed by a Tempo API state store
|
|
283
|
+
* (`Store.memory()`, a static-name Durable Object store, …).
|
|
284
|
+
*
|
|
285
|
+
* Approval merges and submission claims go through `Store.update`, so the
|
|
286
|
+
* backing store needs the atomic `swap` compare-and-swap to serialize
|
|
287
|
+
* concurrent writers (the get + put fallback is dev-only). It must also be
|
|
288
|
+
* enumerable — `listPendingByAddress` scans a key prefix — so sharded Durable
|
|
289
|
+
* Object stores and caches do not qualify.
|
|
290
|
+
*/
|
|
291
|
+
export function fromStore(state) {
|
|
292
|
+
const key = (id) => `multisig:op:${id.toLowerCase()}`;
|
|
293
|
+
const read = (raw) => (raw ? Json.parse(raw) : undefined);
|
|
294
|
+
return {
|
|
295
|
+
async claimSubmission(operation, options) {
|
|
296
|
+
let result;
|
|
297
|
+
await core_Store.update(state, key(operation.id), (raw) => {
|
|
298
|
+
const now = Date.now();
|
|
299
|
+
const existing = read(raw);
|
|
300
|
+
if (existing?.status === 'submitted') {
|
|
301
|
+
result = { operation: existing, status: 'submitted' };
|
|
302
|
+
return raw;
|
|
303
|
+
}
|
|
304
|
+
if (existing?.status === 'submitting' && (existing.claimExpiresAt ?? 0) > now) {
|
|
305
|
+
result = { operation: existing, status: 'submitting' };
|
|
306
|
+
return raw;
|
|
307
|
+
}
|
|
308
|
+
const claimed = mergeOperation(existing, operation, {
|
|
309
|
+
claimExpiresAt: now + options.ttl,
|
|
310
|
+
status: 'submitting',
|
|
311
|
+
updatedAt: now,
|
|
312
|
+
});
|
|
313
|
+
result = { operation: claimed, status: 'claimed' };
|
|
314
|
+
return Json.stringify(claimed);
|
|
315
|
+
});
|
|
316
|
+
return result;
|
|
317
|
+
},
|
|
318
|
+
async get(id) {
|
|
319
|
+
return read(await state.get(key(id)));
|
|
320
|
+
},
|
|
321
|
+
async listPendingByAddress(address) {
|
|
322
|
+
const { keys } = await state.list({ prefix: 'multisig:op:' });
|
|
323
|
+
const operations = await Promise.all(keys.map(({ name }) => state.get(name)));
|
|
324
|
+
return operations
|
|
325
|
+
.map(read)
|
|
326
|
+
.filter((operation) => operation !== undefined)
|
|
327
|
+
.filter((operation) => operation.account.toLowerCase() === address.toLowerCase() &&
|
|
328
|
+
operation.status !== 'submitted');
|
|
329
|
+
},
|
|
330
|
+
async savePending(operation) {
|
|
331
|
+
let saved;
|
|
332
|
+
await core_Store.update(state, key(operation.id), (raw) => {
|
|
333
|
+
const now = Date.now();
|
|
334
|
+
const existing = read(raw);
|
|
335
|
+
if (existing?.status === 'submitted') {
|
|
336
|
+
saved = existing;
|
|
337
|
+
return raw;
|
|
338
|
+
}
|
|
339
|
+
saved = mergeOperation(existing, operation, {
|
|
340
|
+
status: existing?.status === 'submitting' && (existing.claimExpiresAt ?? 0) > now
|
|
341
|
+
? 'submitting'
|
|
342
|
+
: 'pending',
|
|
343
|
+
updatedAt: now,
|
|
344
|
+
});
|
|
345
|
+
return Json.stringify(saved);
|
|
346
|
+
});
|
|
347
|
+
return saved;
|
|
348
|
+
},
|
|
349
|
+
async setSubmitted(id, submittedHash) {
|
|
350
|
+
let submitted;
|
|
351
|
+
await core_Store.update(state, key(id), (raw) => {
|
|
352
|
+
const existing = read(raw);
|
|
353
|
+
if (!existing)
|
|
354
|
+
throw new Error('Cannot mark an unknown multisig operation submitted.');
|
|
355
|
+
submitted = {
|
|
356
|
+
...existing,
|
|
357
|
+
claimExpiresAt: undefined,
|
|
358
|
+
status: 'submitted',
|
|
359
|
+
submittedHash,
|
|
360
|
+
updatedAt: Date.now(),
|
|
361
|
+
};
|
|
362
|
+
return Json.stringify(submitted);
|
|
363
|
+
});
|
|
364
|
+
return submitted;
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/** Creates an in-memory multisig operation store for development and tests only. */
|
|
369
|
+
export function memoryStore() {
|
|
370
|
+
return fromStore(core_Store.memory());
|
|
371
|
+
}
|
|
372
|
+
function parse(serialized) {
|
|
373
|
+
const transaction = Transaction.deserialize(serialized);
|
|
374
|
+
const signature = transaction['signature'];
|
|
375
|
+
if (!isMultisigSignature(signature))
|
|
376
|
+
throw new RpcResponse.InvalidParamsError({
|
|
377
|
+
message: 'Transaction does not contain a native multisig signature.',
|
|
378
|
+
});
|
|
379
|
+
const { signature: _, ...unsigned } = transaction;
|
|
380
|
+
const payload = TxEnvelopeTempo.getSignPayload(TxEnvelopeTempo.from(unsigned));
|
|
381
|
+
const chainId = Number(transaction['chainId']);
|
|
382
|
+
const id = MultisigConfig.getSignPayload({
|
|
383
|
+
account: signature.account,
|
|
384
|
+
genesisConfigId: signature.genesisConfigId,
|
|
385
|
+
payload,
|
|
386
|
+
});
|
|
387
|
+
const init = signature.init ? MultisigConfig.from(signature.init) : undefined;
|
|
388
|
+
const nonce = typeof transaction['nonce'] === 'number' ? transaction['nonce'] : undefined;
|
|
389
|
+
return {
|
|
390
|
+
account: signature.account,
|
|
391
|
+
chainId,
|
|
392
|
+
genesisConfigId: signature.genesisConfigId,
|
|
393
|
+
id,
|
|
394
|
+
init,
|
|
395
|
+
nonce,
|
|
396
|
+
payload,
|
|
397
|
+
signatures: signature.signatures.map((value) => SignatureEnvelope.serialize(value)),
|
|
398
|
+
transaction,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
function isMultisigSignature(value) {
|
|
402
|
+
return (typeof value === 'object' &&
|
|
403
|
+
value !== null &&
|
|
404
|
+
value.type === 'multisig' &&
|
|
405
|
+
typeof value.account === 'string' &&
|
|
406
|
+
typeof value.genesisConfigId === 'string' &&
|
|
407
|
+
Array.isArray(value.signatures));
|
|
408
|
+
}
|
|
409
|
+
async function resolveValidatedConfig(options) {
|
|
410
|
+
const { account, chainId, genesisConfigId, init, pending, resolveConfig } = options;
|
|
411
|
+
const config = (await resolveConfig?.({ account, chainId, genesisConfigId, init })) ?? pending?.config ?? init;
|
|
412
|
+
if (!config)
|
|
413
|
+
return undefined;
|
|
414
|
+
if (init && !isGenesisConfig(init, genesisConfigId))
|
|
415
|
+
throw new RpcResponse.InvalidParamsError({
|
|
416
|
+
message: 'Bootstrap multisig init config does not match genesis config id.',
|
|
417
|
+
});
|
|
418
|
+
const normalized = MultisigConfig.from(config);
|
|
419
|
+
const account_expected = MultisigConfig.getAddress({ genesisConfigId });
|
|
420
|
+
if (account_expected.toLowerCase() !== account.toLowerCase())
|
|
421
|
+
throw new RpcResponse.InvalidParamsError({
|
|
422
|
+
message: 'Resolved multisig config does not match account or genesis config id.',
|
|
423
|
+
});
|
|
424
|
+
return normalized;
|
|
425
|
+
}
|
|
426
|
+
function resolveInitConfig(options) {
|
|
427
|
+
const { config, genesisConfigId, init, nonce, pending } = options;
|
|
428
|
+
if (pending?.initConfig)
|
|
429
|
+
return pending.initConfig;
|
|
430
|
+
if (pending?.init && pending.config && isGenesisConfig(pending.config, genesisConfigId))
|
|
431
|
+
return pending.config;
|
|
432
|
+
if (init)
|
|
433
|
+
return init;
|
|
434
|
+
if (nonce === 0 && isGenesisConfig(config, genesisConfigId))
|
|
435
|
+
return config;
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
function isGenesisConfig(config, genesisConfigId) {
|
|
439
|
+
return MultisigConfig.toId(config).toLowerCase() === genesisConfigId.toLowerCase();
|
|
440
|
+
}
|
|
441
|
+
function mergeSignatures(signatures) {
|
|
442
|
+
const seen = new Set();
|
|
443
|
+
const out = [];
|
|
444
|
+
for (const signature of signatures) {
|
|
445
|
+
const key = signature.toLowerCase();
|
|
446
|
+
if (seen.has(key))
|
|
447
|
+
continue;
|
|
448
|
+
seen.add(key);
|
|
449
|
+
out.push(signature);
|
|
450
|
+
}
|
|
451
|
+
return out;
|
|
452
|
+
}
|
|
453
|
+
function getApprovals(options) {
|
|
454
|
+
const { account, config, genesisConfigId, payload } = options;
|
|
455
|
+
const digest = MultisigConfig.getSignPayload({ account, genesisConfigId, payload });
|
|
456
|
+
const owners = new Map(config.owners.map((owner) => [
|
|
457
|
+
owner.owner.toLowerCase(),
|
|
458
|
+
{ address: owner.owner, weight: Number(owner.weight) },
|
|
459
|
+
]));
|
|
460
|
+
const seen = new Set();
|
|
461
|
+
const signatures = [];
|
|
462
|
+
let weight = 0;
|
|
463
|
+
for (const value of options.signatures) {
|
|
464
|
+
const signature = SignatureEnvelope.from(value);
|
|
465
|
+
const owner = SignatureEnvelope.extractAddress({ payload: digest, signature });
|
|
466
|
+
const key = owner.toLowerCase();
|
|
467
|
+
const configured = owners.get(key);
|
|
468
|
+
if (!configured)
|
|
469
|
+
throw new RpcResponse.InvalidParamsError({ message: `Signature from non-owner ${owner}.` });
|
|
470
|
+
if (seen.has(key))
|
|
471
|
+
continue;
|
|
472
|
+
const valid = (() => {
|
|
473
|
+
try {
|
|
474
|
+
return SignatureEnvelope.verify(signature, { payload: digest, address: configured.address });
|
|
475
|
+
}
|
|
476
|
+
catch {
|
|
477
|
+
return false;
|
|
478
|
+
}
|
|
479
|
+
})();
|
|
480
|
+
if (!valid)
|
|
481
|
+
throw new RpcResponse.InvalidParamsError({
|
|
482
|
+
message: `Invalid signature from owner ${configured.address}.`,
|
|
483
|
+
});
|
|
484
|
+
seen.add(key);
|
|
485
|
+
signatures.push(SignatureEnvelope.serialize(signature));
|
|
486
|
+
weight += configured.weight;
|
|
487
|
+
}
|
|
488
|
+
return { signatures, threshold: Number(config.threshold), weight };
|
|
489
|
+
}
|
|
490
|
+
async function serializeFinal(options) {
|
|
491
|
+
const { signature: _, ...transaction } = options.transaction;
|
|
492
|
+
const envelope = TxEnvelopeTempo.from({
|
|
493
|
+
...transaction,
|
|
494
|
+
feePayerSignature: (() => {
|
|
495
|
+
const value = transaction['feePayerSignature'];
|
|
496
|
+
// Preserve missing/null fee-payer markers so sponsorship can add signature later.
|
|
497
|
+
if (!value)
|
|
498
|
+
return value;
|
|
499
|
+
// Normalize RPC-shaped signatures before rebuilding final transaction envelope.
|
|
500
|
+
if (typeof value === 'object' && 'r' in value && 's' in value) {
|
|
501
|
+
const signature = value;
|
|
502
|
+
const yParity = (() => {
|
|
503
|
+
const value = signature.yParity ?? signature.v;
|
|
504
|
+
// Some signature shapes omit parity until later normalization.
|
|
505
|
+
if (typeof value === 'undefined')
|
|
506
|
+
return undefined;
|
|
507
|
+
const number = Number(value);
|
|
508
|
+
// RPC signatures may carry Ethereum 27/28 `v`; `ox` expects 0/1 parity.
|
|
509
|
+
if (number === 27 || number === 28)
|
|
510
|
+
return number - 27;
|
|
511
|
+
return number;
|
|
512
|
+
})();
|
|
513
|
+
if (typeof yParity === 'number')
|
|
514
|
+
return Signature.from({ r: BigInt(signature.r), s: BigInt(signature.s), yParity });
|
|
515
|
+
}
|
|
516
|
+
// Fall back to `ox` for already-normalized signature inputs.
|
|
517
|
+
return Signature.from(value);
|
|
518
|
+
})(),
|
|
519
|
+
});
|
|
520
|
+
const payload = TxEnvelopeTempo.getSignPayload(envelope);
|
|
521
|
+
const signatures = options.signatures.map((approval) => SignatureEnvelope.from(approval));
|
|
522
|
+
const sorted = SignatureEnvelope.sortMultisigApprovals({
|
|
523
|
+
account: options.account,
|
|
524
|
+
genesisConfigId: options.genesisConfigId,
|
|
525
|
+
payload,
|
|
526
|
+
signatures,
|
|
527
|
+
});
|
|
528
|
+
const signature = SignatureEnvelope.from({
|
|
529
|
+
account: options.account,
|
|
530
|
+
genesisConfigId: options.genesisConfigId,
|
|
531
|
+
signatures: sorted,
|
|
532
|
+
...(options.init ? { init: options.init } : {}),
|
|
533
|
+
});
|
|
534
|
+
return TxEnvelopeTempo.serialize(envelope, {
|
|
535
|
+
...('feePayerSignature' in transaction
|
|
536
|
+
? { feePayerSignature: transaction['feePayerSignature'] }
|
|
537
|
+
: {}),
|
|
538
|
+
signature,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
function mergeOperation(existing, operation, patch) {
|
|
542
|
+
return {
|
|
543
|
+
...operation,
|
|
544
|
+
...existing,
|
|
545
|
+
...patch,
|
|
546
|
+
config: operation.config ?? existing?.config,
|
|
547
|
+
init: existing?.init || operation.init,
|
|
548
|
+
initConfig: existing?.initConfig ?? operation.initConfig,
|
|
549
|
+
signatures: mergeSignatures([...(existing?.signatures ?? []), ...operation.signatures]),
|
|
550
|
+
transaction: operation.transaction,
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function toStatus(options) {
|
|
554
|
+
const { approvals, operation } = options;
|
|
555
|
+
return {
|
|
556
|
+
account: operation.account,
|
|
557
|
+
chainId: operation.chainId,
|
|
558
|
+
genesisConfigId: operation.genesisConfigId,
|
|
559
|
+
id: operation.id,
|
|
560
|
+
signatures: approvals.signatures.length,
|
|
561
|
+
status: operation.status,
|
|
562
|
+
submittedHash: operation.submittedHash,
|
|
563
|
+
threshold: approvals.threshold,
|
|
564
|
+
weight: approvals.weight,
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
//# sourceMappingURL=multisig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multisig.js","sourceRoot":"","sources":["../../../src/handlers/internal/multisig.ts"],"names":[],"mappings":"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"}
|