@recoillink/starknet-sdk 0.0.0-stage → 30.0.4
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/LICENSE.md +193 -0
- package/dist/clients/protocol.d.ts +26 -0
- package/dist/clients/protocol.d.ts.map +1 -0
- package/dist/clients/protocol.js +56 -0
- package/dist/clients/protocol.js.map +1 -0
- package/dist/clients/protocol.test.d.ts +2 -0
- package/dist/clients/protocol.test.d.ts.map +1 -0
- package/dist/clients/protocol.test.js +36 -0
- package/dist/clients/protocol.test.js.map +1 -0
- package/dist/clients/provider.d.ts +55 -0
- package/dist/clients/provider.d.ts.map +1 -0
- package/dist/clients/provider.js +432 -0
- package/dist/clients/provider.js.map +1 -0
- package/dist/clients/provider.test.d.ts +2 -0
- package/dist/clients/provider.test.d.ts.map +1 -0
- package/dist/clients/provider.test.js +271 -0
- package/dist/clients/provider.test.js.map +1 -0
- package/dist/clients/signer.d.ts +24 -0
- package/dist/clients/signer.d.ts.map +1 -0
- package/dist/clients/signer.js +200 -0
- package/dist/clients/signer.js.map +1 -0
- package/dist/clients/signer.test.d.ts +2 -0
- package/dist/clients/signer.test.d.ts.map +1 -0
- package/dist/clients/signer.test.js +232 -0
- package/dist/clients/signer.test.js.map +1 -0
- package/dist/contracts.d.ts +46 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +334 -0
- package/dist/contracts.js.map +1 -0
- package/dist/contracts.test.d.ts +2 -0
- package/dist/contracts.test.d.ts.map +1 -0
- package/dist/contracts.test.js +80 -0
- package/dist/contracts.test.js.map +1 -0
- package/dist/hook/hook-artifact-manager.d.ts +18 -0
- package/dist/hook/hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/hook-artifact-manager.js +69 -0
- package/dist/hook/hook-artifact-manager.js.map +1 -0
- package/dist/hook/hook-artifact-manager.test.d.ts +2 -0
- package/dist/hook/hook-artifact-manager.test.d.ts.map +1 -0
- package/dist/hook/hook-artifact-manager.test.js +157 -0
- package/dist/hook/hook-artifact-manager.test.js.map +1 -0
- package/dist/hook/hook-query.d.ts +7 -0
- package/dist/hook/hook-query.d.ts.map +1 -0
- package/dist/hook/hook-query.js +29 -0
- package/dist/hook/hook-query.js.map +1 -0
- package/dist/hook/hook-tx.d.ts +4 -0
- package/dist/hook/hook-tx.d.ts.map +1 -0
- package/dist/hook/hook-tx.js +19 -0
- package/dist/hook/hook-tx.js.map +1 -0
- package/dist/hook/interchain-gas-paymaster-hook-artifact-manager.d.ts +5 -0
- package/dist/hook/interchain-gas-paymaster-hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/interchain-gas-paymaster-hook-artifact-manager.js +23 -0
- package/dist/hook/interchain-gas-paymaster-hook-artifact-manager.js.map +1 -0
- package/dist/hook/merkle-tree-hook-artifact-manager.d.ts +18 -0
- package/dist/hook/merkle-tree-hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/merkle-tree-hook-artifact-manager.js +41 -0
- package/dist/hook/merkle-tree-hook-artifact-manager.js.map +1 -0
- package/dist/hook/protocol-fee-hook-artifact-manager.d.ts +22 -0
- package/dist/hook/protocol-fee-hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/protocol-fee-hook-artifact-manager.js +169 -0
- package/dist/hook/protocol-fee-hook-artifact-manager.js.map +1 -0
- package/dist/hook/unknown-hook-artifact-manager.d.ts +14 -0
- package/dist/hook/unknown-hook-artifact-manager.d.ts.map +1 -0
- package/dist/hook/unknown-hook-artifact-manager.js +20 -0
- package/dist/hook/unknown-hook-artifact-manager.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/ism/aggregation-ism-artifact-reader.d.ts +14 -0
- package/dist/ism/aggregation-ism-artifact-reader.d.ts.map +1 -0
- package/dist/ism/aggregation-ism-artifact-reader.js +42 -0
- package/dist/ism/aggregation-ism-artifact-reader.js.map +1 -0
- package/dist/ism/domain-routing-ism-artifact-manager.d.ts +20 -0
- package/dist/ism/domain-routing-ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/domain-routing-ism-artifact-manager.js +130 -0
- package/dist/ism/domain-routing-ism-artifact-manager.js.map +1 -0
- package/dist/ism/ism-artifact-manager.d.ts +14 -0
- package/dist/ism/ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/ism-artifact-manager.js +53 -0
- package/dist/ism/ism-artifact-manager.js.map +1 -0
- package/dist/ism/ism-artifact-manager.test.d.ts +2 -0
- package/dist/ism/ism-artifact-manager.test.d.ts.map +1 -0
- package/dist/ism/ism-artifact-manager.test.js +77 -0
- package/dist/ism/ism-artifact-manager.test.js.map +1 -0
- package/dist/ism/ism-query.d.ts +33 -0
- package/dist/ism/ism-query.d.ts.map +1 -0
- package/dist/ism/ism-query.js +118 -0
- package/dist/ism/ism-query.js.map +1 -0
- package/dist/ism/ism-reader.test.d.ts +2 -0
- package/dist/ism/ism-reader.test.d.ts.map +1 -0
- package/dist/ism/ism-reader.test.js +121 -0
- package/dist/ism/ism-reader.test.js.map +1 -0
- package/dist/ism/ism-tx.d.ts +28 -0
- package/dist/ism/ism-tx.d.ts.map +1 -0
- package/dist/ism/ism-tx.js +56 -0
- package/dist/ism/ism-tx.js.map +1 -0
- package/dist/ism/merkle-root-multisig-ism-artifact-manager.d.ts +20 -0
- package/dist/ism/merkle-root-multisig-ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/merkle-root-multisig-ism-artifact-manager.js +51 -0
- package/dist/ism/merkle-root-multisig-ism-artifact-manager.js.map +1 -0
- package/dist/ism/message-id-multisig-ism-artifact-manager.d.ts +20 -0
- package/dist/ism/message-id-multisig-ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/message-id-multisig-ism-artifact-manager.js +51 -0
- package/dist/ism/message-id-multisig-ism-artifact-manager.js.map +1 -0
- package/dist/ism/test-ism-artifact-manager.d.ts +20 -0
- package/dist/ism/test-ism-artifact-manager.d.ts.map +1 -0
- package/dist/ism/test-ism-artifact-manager.js +46 -0
- package/dist/ism/test-ism-artifact-manager.js.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts +15 -0
- package/dist/mailbox/mailbox-artifact-manager.d.ts.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.js +179 -0
- package/dist/mailbox/mailbox-artifact-manager.js.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.test.d.ts +2 -0
- package/dist/mailbox/mailbox-artifact-manager.test.d.ts.map +1 -0
- package/dist/mailbox/mailbox-artifact-manager.test.js +100 -0
- package/dist/mailbox/mailbox-artifact-manager.test.js.map +1 -0
- package/dist/mailbox/mailbox-query.d.ts +13 -0
- package/dist/mailbox/mailbox-query.d.ts.map +1 -0
- package/dist/mailbox/mailbox-query.js +29 -0
- package/dist/mailbox/mailbox-query.js.map +1 -0
- package/dist/mailbox/mailbox-tx.d.ts +25 -0
- package/dist/mailbox/mailbox-tx.d.ts.map +1 -0
- package/dist/mailbox/mailbox-tx.js +40 -0
- package/dist/mailbox/mailbox-tx.js.map +1 -0
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +4 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testing/constants.d.ts +8 -0
- package/dist/testing/constants.d.ts.map +1 -0
- package/dist/testing/constants.js +27 -0
- package/dist/testing/constants.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/node.d.ts +4 -0
- package/dist/testing/node.d.ts.map +1 -0
- package/dist/testing/node.js +78 -0
- package/dist/testing/node.js.map +1 -0
- package/dist/testing/utils.d.ts +6 -0
- package/dist/testing/utils.d.ts.map +1 -0
- package/dist/testing/utils.js +15 -0
- package/dist/testing/utils.js.map +1 -0
- package/dist/tests/e2e-test.setup.d.ts +2 -0
- package/dist/tests/e2e-test.setup.d.ts.map +1 -0
- package/dist/tests/e2e-test.setup.js +24 -0
- package/dist/tests/e2e-test.setup.js.map +1 -0
- package/dist/tests/hook.e2e-test.d.ts +2 -0
- package/dist/tests/hook.e2e-test.d.ts.map +1 -0
- package/dist/tests/hook.e2e-test.js +100 -0
- package/dist/tests/hook.e2e-test.js.map +1 -0
- package/dist/tests/ism.e2e-test.d.ts +2 -0
- package/dist/tests/ism.e2e-test.d.ts.map +1 -0
- package/dist/tests/ism.e2e-test.js +123 -0
- package/dist/tests/ism.e2e-test.js.map +1 -0
- package/dist/tests/mailbox.e2e-test.d.ts +2 -0
- package/dist/tests/mailbox.e2e-test.d.ts.map +1 -0
- package/dist/tests/mailbox.e2e-test.js +115 -0
- package/dist/tests/mailbox.e2e-test.js.map +1 -0
- package/dist/tests/read-warp-token.e2e-test.d.ts +2 -0
- package/dist/tests/read-warp-token.e2e-test.d.ts.map +1 -0
- package/dist/tests/read-warp-token.e2e-test.js +67 -0
- package/dist/tests/read-warp-token.e2e-test.js.map +1 -0
- package/dist/tests/validator_announce.e2e-test.d.ts +2 -0
- package/dist/tests/validator_announce.e2e-test.d.ts.map +1 -0
- package/dist/tests/validator_announce.e2e-test.js +74 -0
- package/dist/tests/validator_announce.e2e-test.js.map +1 -0
- package/dist/tests/warp_core.e2e-test.d.ts +2 -0
- package/dist/tests/warp_core.e2e-test.d.ts.map +1 -0
- package/dist/tests/warp_core.e2e-test.js +217 -0
- package/dist/tests/warp_core.e2e-test.js.map +1 -0
- package/dist/tests/warp_transfer.e2e-test.d.ts +2 -0
- package/dist/tests/warp_transfer.e2e-test.d.ts.map +1 -0
- package/dist/tests/warp_transfer.e2e-test.js +149 -0
- package/dist/tests/warp_transfer.e2e-test.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts +14 -0
- package/dist/validator-announce/validator-announce-artifact-manager.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js +125 -0
- package/dist/validator-announce/validator-announce-artifact-manager.js.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.test.d.ts +2 -0
- package/dist/validator-announce/validator-announce-artifact-manager.test.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-artifact-manager.test.js +66 -0
- package/dist/validator-announce/validator-announce-artifact-manager.test.js.map +1 -0
- package/dist/validator-announce/validator-announce-tx.d.ts +3 -0
- package/dist/validator-announce/validator-announce-tx.d.ts.map +1 -0
- package/dist/validator-announce/validator-announce-tx.js +12 -0
- package/dist/validator-announce/validator-announce-tx.js.map +1 -0
- package/dist/warp/collateral-token-artifact-manager.d.ts +14 -0
- package/dist/warp/collateral-token-artifact-manager.d.ts.map +1 -0
- package/dist/warp/collateral-token-artifact-manager.js +47 -0
- package/dist/warp/collateral-token-artifact-manager.js.map +1 -0
- package/dist/warp/native-token-artifact-manager.d.ts +13 -0
- package/dist/warp/native-token-artifact-manager.d.ts.map +1 -0
- package/dist/warp/native-token-artifact-manager.js +33 -0
- package/dist/warp/native-token-artifact-manager.js.map +1 -0
- package/dist/warp/synthetic-token-artifact-manager.d.ts +15 -0
- package/dist/warp/synthetic-token-artifact-manager.d.ts.map +1 -0
- package/dist/warp/synthetic-token-artifact-manager.js +53 -0
- package/dist/warp/synthetic-token-artifact-manager.js.map +1 -0
- package/dist/warp/token-artifact-manager.d.ts +43 -0
- package/dist/warp/token-artifact-manager.d.ts.map +1 -0
- package/dist/warp/token-artifact-manager.js +233 -0
- package/dist/warp/token-artifact-manager.js.map +1 -0
- package/dist/warp/warp-artifact-manager.d.ts +14 -0
- package/dist/warp/warp-artifact-manager.d.ts.map +1 -0
- package/dist/warp/warp-artifact-manager.js +54 -0
- package/dist/warp/warp-artifact-manager.js.map +1 -0
- package/dist/warp/warp-artifact-manager.test.d.ts +2 -0
- package/dist/warp/warp-artifact-manager.test.d.ts.map +1 -0
- package/dist/warp/warp-artifact-manager.test.js +93 -0
- package/dist/warp/warp-artifact-manager.test.js.map +1 -0
- package/dist/warp/warp-tx.d.ts +47 -0
- package/dist/warp/warp-tx.d.ts.map +1 -0
- package/dist/warp/warp-tx.js +110 -0
- package/dist/warp/warp-tx.js.map +1 -0
- package/package.json +63 -3
- package/README.md +0 -3
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { RpcProvider } from 'starknet';
|
|
3
|
+
import { AltVM, ProtocolType } from '@recoillink/provider-sdk';
|
|
4
|
+
import { normalizeStarknetAddressSafe } from '../contracts.js';
|
|
5
|
+
import { StarknetSigner } from './signer.js';
|
|
6
|
+
const TEST_METADATA = {
|
|
7
|
+
name: 'starknetsepolia',
|
|
8
|
+
protocol: ProtocolType.Starknet,
|
|
9
|
+
chainId: 'SN_SEPOLIA',
|
|
10
|
+
domainId: 421614,
|
|
11
|
+
rpcUrls: [{ http: 'http://localhost:9545' }],
|
|
12
|
+
nativeToken: {
|
|
13
|
+
name: 'Ether',
|
|
14
|
+
symbol: 'ETH',
|
|
15
|
+
decimals: 18,
|
|
16
|
+
denom: '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
class StarknetSignerTestHarness extends StarknetSigner {
|
|
20
|
+
capturedBatch;
|
|
21
|
+
capturedTx;
|
|
22
|
+
capturedRemoteTransferToken;
|
|
23
|
+
getTokenCalls = 0;
|
|
24
|
+
testTokenType = AltVM.TokenType.native;
|
|
25
|
+
tokenDenom = TEST_METADATA.nativeToken.denom;
|
|
26
|
+
constructor() {
|
|
27
|
+
super(new RpcProvider({ nodeUrl: 'http://localhost:9545' }), TEST_METADATA, ['http://localhost:9545'], '0x123', '0x1111111111111111111111111111111111111111111111111111111111111111');
|
|
28
|
+
}
|
|
29
|
+
async getToken() {
|
|
30
|
+
this.getTokenCalls += 1;
|
|
31
|
+
return {
|
|
32
|
+
address: '0xabc',
|
|
33
|
+
owner: this.getSignerAddress(),
|
|
34
|
+
tokenType: this.testTokenType,
|
|
35
|
+
mailboxAddress: '0x1',
|
|
36
|
+
ismAddress: '0x0',
|
|
37
|
+
hookAddress: '0x0',
|
|
38
|
+
denom: this.tokenDenom,
|
|
39
|
+
name: 'Ether',
|
|
40
|
+
symbol: 'ETH',
|
|
41
|
+
decimals: 18,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async buildRemoteTransferTransaction(_req, tokenInfo) {
|
|
45
|
+
this.capturedRemoteTransferToken = tokenInfo;
|
|
46
|
+
return {
|
|
47
|
+
kind: 'invoke',
|
|
48
|
+
contractAddress: '0xabc',
|
|
49
|
+
entrypoint: 'transfer_remote',
|
|
50
|
+
calldata: ['0x1'],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async sendAndConfirmBatchTransactions(transactions) {
|
|
54
|
+
this.capturedBatch = transactions;
|
|
55
|
+
return { transactionHash: '0x1' };
|
|
56
|
+
}
|
|
57
|
+
async sendAndConfirmTransaction(transaction) {
|
|
58
|
+
this.capturedTx = transaction;
|
|
59
|
+
return { transactionHash: '0x1', contractAddress: '0xabc' };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
describe('StarknetSigner remoteTransfer', () => {
|
|
63
|
+
it('batches native token approval before transfer', async () => {
|
|
64
|
+
const signer = new StarknetSignerTestHarness();
|
|
65
|
+
await signer.remoteTransfer({
|
|
66
|
+
tokenAddress: '0xabc',
|
|
67
|
+
destinationDomainId: 1234,
|
|
68
|
+
recipient: '0x456',
|
|
69
|
+
amount: '1',
|
|
70
|
+
gasLimit: '200000',
|
|
71
|
+
maxFee: {
|
|
72
|
+
denom: TEST_METADATA.nativeToken.denom,
|
|
73
|
+
amount: '2',
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
expect(signer.capturedTx).to.equal(undefined);
|
|
77
|
+
expect(signer.capturedBatch).to.have.length(2);
|
|
78
|
+
expect(signer.capturedBatch?.[0]?.kind).to.equal('invoke');
|
|
79
|
+
expect(signer.capturedBatch?.[0]?.contractAddress).to.equal(TEST_METADATA.nativeToken.denom);
|
|
80
|
+
expect(signer.capturedBatch?.[0]?.entrypoint).to.equal('approve');
|
|
81
|
+
expect(signer.capturedBatch?.[1]).to.deep.equal({
|
|
82
|
+
kind: 'invoke',
|
|
83
|
+
contractAddress: '0xabc',
|
|
84
|
+
entrypoint: 'transfer_remote',
|
|
85
|
+
calldata: ['0x1'],
|
|
86
|
+
});
|
|
87
|
+
expect(signer.getTokenCalls).to.equal(1);
|
|
88
|
+
expect(signer.capturedRemoteTransferToken?.tokenType).to.equal(AltVM.TokenType.native);
|
|
89
|
+
});
|
|
90
|
+
it('batches collateral token approval before transfer', async () => {
|
|
91
|
+
const signer = new StarknetSignerTestHarness();
|
|
92
|
+
signer.testTokenType = AltVM.TokenType.collateral;
|
|
93
|
+
signer.tokenDenom =
|
|
94
|
+
'0x999999999999999999999999999999999999999999999999999999999999999';
|
|
95
|
+
await signer.remoteTransfer({
|
|
96
|
+
tokenAddress: '0xabc',
|
|
97
|
+
destinationDomainId: 1234,
|
|
98
|
+
recipient: '0x456',
|
|
99
|
+
amount: '1',
|
|
100
|
+
gasLimit: '200000',
|
|
101
|
+
maxFee: {
|
|
102
|
+
denom: TEST_METADATA.nativeToken.denom,
|
|
103
|
+
amount: '2',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
expect(signer.capturedTx).to.equal(undefined);
|
|
107
|
+
expect(signer.capturedBatch).to.have.length(3);
|
|
108
|
+
expect(signer.capturedBatch?.[0]?.kind).to.equal('invoke');
|
|
109
|
+
expect(signer.capturedBatch?.[0]?.contractAddress).to.equal(normalizeStarknetAddressSafe(signer.tokenDenom));
|
|
110
|
+
expect(signer.capturedBatch?.[0]?.entrypoint).to.equal('approve');
|
|
111
|
+
expect(signer.capturedBatch?.[1]?.kind).to.equal('invoke');
|
|
112
|
+
expect(signer.capturedBatch?.[1]?.contractAddress).to.equal(TEST_METADATA.nativeToken.denom);
|
|
113
|
+
expect(signer.capturedBatch?.[1]?.entrypoint).to.equal('approve');
|
|
114
|
+
expect(signer.getTokenCalls).to.equal(1);
|
|
115
|
+
expect(signer.capturedRemoteTransferToken?.denom).to.equal(signer.tokenDenom);
|
|
116
|
+
});
|
|
117
|
+
it('batches fee token approval before synthetic transfer', async () => {
|
|
118
|
+
const signer = new StarknetSignerTestHarness();
|
|
119
|
+
signer.testTokenType = AltVM.TokenType.synthetic;
|
|
120
|
+
await signer.remoteTransfer({
|
|
121
|
+
tokenAddress: '0xabc',
|
|
122
|
+
destinationDomainId: 1234,
|
|
123
|
+
recipient: '0x456',
|
|
124
|
+
amount: '1',
|
|
125
|
+
gasLimit: '200000',
|
|
126
|
+
maxFee: {
|
|
127
|
+
denom: TEST_METADATA.nativeToken.denom,
|
|
128
|
+
amount: '2',
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
expect(signer.capturedTx).to.equal(undefined);
|
|
132
|
+
expect(signer.capturedBatch).to.have.length(2);
|
|
133
|
+
expect(signer.capturedBatch?.[0]?.kind).to.equal('invoke');
|
|
134
|
+
expect(signer.capturedBatch?.[0]?.contractAddress).to.equal(TEST_METADATA.nativeToken.denom);
|
|
135
|
+
expect(signer.capturedBatch?.[0]?.entrypoint).to.equal('approve');
|
|
136
|
+
expect(signer.getTokenCalls).to.equal(1);
|
|
137
|
+
expect(signer.capturedRemoteTransferToken?.tokenType).to.equal(AltVM.TokenType.synthetic);
|
|
138
|
+
});
|
|
139
|
+
it('merges collateral and fee approvals when both use the same token', async () => {
|
|
140
|
+
const signer = new StarknetSignerTestHarness();
|
|
141
|
+
signer.testTokenType = AltVM.TokenType.collateral;
|
|
142
|
+
signer.tokenDenom = TEST_METADATA.nativeToken.denom;
|
|
143
|
+
await signer.remoteTransfer({
|
|
144
|
+
tokenAddress: '0xabc',
|
|
145
|
+
destinationDomainId: 1234,
|
|
146
|
+
recipient: '0x456',
|
|
147
|
+
amount: '1',
|
|
148
|
+
gasLimit: '200000',
|
|
149
|
+
maxFee: {
|
|
150
|
+
denom: TEST_METADATA.nativeToken.denom,
|
|
151
|
+
amount: '2',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
expect(signer.capturedTx).to.equal(undefined);
|
|
155
|
+
expect(signer.capturedBatch).to.have.length(2);
|
|
156
|
+
expect(signer.capturedBatch?.[0]?.kind).to.equal('invoke');
|
|
157
|
+
expect(signer.capturedBatch?.[0]?.contractAddress).to.equal(TEST_METADATA.nativeToken.denom);
|
|
158
|
+
expect(signer.capturedBatch?.[0]?.entrypoint).to.equal('approve');
|
|
159
|
+
expect(signer.capturedBatch?.[1]).to.deep.equal({
|
|
160
|
+
kind: 'invoke',
|
|
161
|
+
contractAddress: '0xabc',
|
|
162
|
+
entrypoint: 'transfer_remote',
|
|
163
|
+
calldata: ['0x1'],
|
|
164
|
+
});
|
|
165
|
+
expect(signer.getTokenCalls).to.equal(1);
|
|
166
|
+
expect(signer.capturedRemoteTransferToken?.denom).to.equal(TEST_METADATA.nativeToken.denom);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('StarknetSigner sendAndConfirmTransaction', () => {
|
|
170
|
+
class ReceiptCheckingSigner extends StarknetSigner {
|
|
171
|
+
constructor() {
|
|
172
|
+
super(new RpcProvider({ nodeUrl: 'http://localhost:9545' }), TEST_METADATA, ['http://localhost:9545'], '0x123', '0x1111111111111111111111111111111111111111111111111111111111111111');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
it('throws when Starknet returns a reverted receipt', async () => {
|
|
176
|
+
const signer = new ReceiptCheckingSigner();
|
|
177
|
+
Reflect.set(signer, 'account', {
|
|
178
|
+
execute: async () => ({ transaction_hash: '0xdead' }),
|
|
179
|
+
waitForTransaction: async () => ({
|
|
180
|
+
statusReceipt: 'reverted',
|
|
181
|
+
value: { revert_reason: 'boom' },
|
|
182
|
+
isSuccess: () => false,
|
|
183
|
+
isReverted: () => true,
|
|
184
|
+
isError: () => false,
|
|
185
|
+
}),
|
|
186
|
+
});
|
|
187
|
+
let error;
|
|
188
|
+
try {
|
|
189
|
+
await signer.sendAndConfirmTransaction({
|
|
190
|
+
kind: 'invoke',
|
|
191
|
+
contractAddress: '0xabc',
|
|
192
|
+
entrypoint: 'transfer',
|
|
193
|
+
calldata: [],
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (caughtError) {
|
|
197
|
+
error = caughtError;
|
|
198
|
+
}
|
|
199
|
+
expect(String(error)).to.include('reverted');
|
|
200
|
+
expect(String(error)).to.include('boom');
|
|
201
|
+
});
|
|
202
|
+
it('rejects a v0.8 transaction with REJECTED finality immediately', async () => {
|
|
203
|
+
const signer = await StarknetSigner.connectWithSigner({
|
|
204
|
+
...TEST_METADATA,
|
|
205
|
+
rpcUrls: [{ http: 'https://rpc.example/rpc/v0_8' }],
|
|
206
|
+
}, '0x1', { accountAddress: '0x123' });
|
|
207
|
+
const account = Reflect.get(signer, 'account');
|
|
208
|
+
Reflect.set(account, 'execute', async () => ({
|
|
209
|
+
transaction_hash: '0xdead',
|
|
210
|
+
}));
|
|
211
|
+
Reflect.set(account.channel, 'transactionRetryIntervalFallback', 0);
|
|
212
|
+
Reflect.set(account.channel, 'getTransactionStatus', async () => ({
|
|
213
|
+
finality_status: 'REJECTED',
|
|
214
|
+
}));
|
|
215
|
+
let error;
|
|
216
|
+
try {
|
|
217
|
+
await signer.sendAndConfirmTransaction({
|
|
218
|
+
kind: 'invoke',
|
|
219
|
+
contractAddress: '0xabc',
|
|
220
|
+
entrypoint: 'transfer',
|
|
221
|
+
calldata: [],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (caughtError) {
|
|
225
|
+
error = caughtError;
|
|
226
|
+
}
|
|
227
|
+
expect(signer.getRawProvider().readSpecVersion()).to.equal('0.8.1');
|
|
228
|
+
expect(String(error)).to.include('REJECTED');
|
|
229
|
+
expect(String(error)).not.to.include('timed-out');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
//# sourceMappingURL=signer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.test.js","sourceRoot":"","sources":["../../src/clients/signer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AccountInterface, Contract, ProviderInterface, RawArgsArray } from 'starknet';
|
|
2
|
+
import { ContractType } from '@recoillink/starknet-core/runtime';
|
|
3
|
+
import { StarknetAnnotatedTx } from './types.js';
|
|
4
|
+
export declare enum StarknetContractName {
|
|
5
|
+
MAILBOX = "mailbox",
|
|
6
|
+
MESSAGE_ID_MULTISIG_ISM = "messageid_multisig_ism",
|
|
7
|
+
MERKLE_ROOT_MULTISIG_ISM = "merkleroot_multisig_ism",
|
|
8
|
+
ROUTING_ISM = "domain_routing_ism",
|
|
9
|
+
AGGREGATION_ISM = "aggregation",
|
|
10
|
+
PAUSABLE_ISM = "pausable_ism",
|
|
11
|
+
NOOP_ISM = "noop_ism",
|
|
12
|
+
HOOK = "hook",
|
|
13
|
+
MERKLE_TREE_HOOK = "merkle_tree_hook",
|
|
14
|
+
PROTOCOL_FEE = "protocol_fee",
|
|
15
|
+
VALIDATOR_ANNOUNCE = "validator_announce",
|
|
16
|
+
HYP_ERC20 = "HypErc20",
|
|
17
|
+
HYP_ERC20_COLLATERAL = "HypErc20Collateral",
|
|
18
|
+
HYP_NATIVE = "HypNative",
|
|
19
|
+
ETHER = "Ether"
|
|
20
|
+
}
|
|
21
|
+
export declare const STARKNET_DEFAULT_FEE_TOKEN_ADDRESSES: Record<string, string>;
|
|
22
|
+
export declare function getStarknetContract(contractName: string, address: string, providerOrAccount?: ProviderInterface | AccountInterface, contractType?: ContractType): Contract;
|
|
23
|
+
export declare function normalizeStarknetAddressSafe(value: unknown): string;
|
|
24
|
+
export declare function addressToEvmAddress(value: unknown): string;
|
|
25
|
+
export declare function callContract(contract: Contract, method: string, args?: RawArgsArray): Promise<unknown>;
|
|
26
|
+
export declare function populateInvokeTx(contract: Contract, method: string, args?: RawArgsArray): Promise<StarknetAnnotatedTx>;
|
|
27
|
+
export declare function extractEnumVariant(value: unknown): string;
|
|
28
|
+
export declare function toNumber(value: unknown): number;
|
|
29
|
+
export declare function toBigInt(value: unknown): bigint;
|
|
30
|
+
export declare function getFeeTokenAddress(params: {
|
|
31
|
+
chainName: string;
|
|
32
|
+
nativeDenom?: string;
|
|
33
|
+
}): string;
|
|
34
|
+
export declare function normalizeRoutersAddress(value: unknown): string;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a Contract instance using the on-chain ABI fetched from the provider.
|
|
37
|
+
* If the contract is a proxy, resolves the implementation class ABI so
|
|
38
|
+
* starknet.js parses responses with the correct types.
|
|
39
|
+
*
|
|
40
|
+
* Handles both Cairo 1 proxies (`get_implementation` returning a struct)
|
|
41
|
+
* and Cairo 0 proxies (`implementation` returning a felt).
|
|
42
|
+
*/
|
|
43
|
+
export declare function getOnChainStarknetContract(provider: ProviderInterface, address: string): Promise<Contract>;
|
|
44
|
+
export declare function shouldFallbackStorageRead(error: unknown): boolean;
|
|
45
|
+
export declare function isProbeMiss(error: unknown): boolean;
|
|
46
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAIhB,QAAQ,EACR,iBAAiB,EACjB,YAAY,EAKb,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,YAAY,EAEb,MAAM,mCAAmC,CAAC;AAY3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA0EjD,oBAAY,oBAAoB;IAC9B,OAAO,YAAY;IACnB,uBAAuB,2BAA2B;IAClD,wBAAwB,4BAA4B;IACpD,WAAW,uBAAuB;IAClC,eAAe,gBAAgB;IAC/B,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,kBAAkB,uBAAuB;IACzC,SAAS,aAAa;IACtB,oBAAoB,uBAAuB;IAC3C,UAAU,cAAc;IACxB,KAAK,UAAU;CAChB;AAED,eAAO,MAAM,oCAAoC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQvE,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,EACxD,YAAY,GAAE,YAAoC,GACjD,QAAQ,CAMV;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAyBnE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkCzD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA+B/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAc/C;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAQT;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AA8DD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAoBjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUnD"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { CallData, CairoCustomEnum, Contract, addAddressPadding, num, uint256, } from 'starknet';
|
|
2
|
+
import { ContractType, getContractAbi as getPublishedContractAbi, } from '@recoillink/starknet-core/runtime';
|
|
3
|
+
import { ZERO_ADDRESS_HEX_32, assert, bytes32ToAddress, ensure0x, isNullish, isZeroishAddress, normalizeAddressStarknet, rootLogger, } from '@recoillink/utils';
|
|
4
|
+
function isObjectRecord(value) {
|
|
5
|
+
return !!value && typeof value === 'object';
|
|
6
|
+
}
|
|
7
|
+
function getContractAbi(contract) {
|
|
8
|
+
const abi = Reflect.get(contract, 'abi');
|
|
9
|
+
return Array.isArray(abi) ? abi : undefined;
|
|
10
|
+
}
|
|
11
|
+
function abiEntryHasMethod(entry, method) {
|
|
12
|
+
if (!isObjectRecord(entry))
|
|
13
|
+
return false;
|
|
14
|
+
if (entry['name'] === method)
|
|
15
|
+
return true;
|
|
16
|
+
const items = entry['items'];
|
|
17
|
+
return Array.isArray(items)
|
|
18
|
+
? items.some((nestedEntry) => abiEntryHasMethod(nestedEntry, method))
|
|
19
|
+
: false;
|
|
20
|
+
}
|
|
21
|
+
function hasAbiMethod(contract, method) {
|
|
22
|
+
const abi = getContractAbi(contract);
|
|
23
|
+
if (!abi)
|
|
24
|
+
return true;
|
|
25
|
+
return abi.some((entry) => abiEntryHasMethod(entry, method));
|
|
26
|
+
}
|
|
27
|
+
function isUint256Like(value) {
|
|
28
|
+
if (!isObjectRecord(value))
|
|
29
|
+
return false;
|
|
30
|
+
const low = value['low'];
|
|
31
|
+
const high = value['high'];
|
|
32
|
+
const isNumberish = (v) => typeof v === 'string' || typeof v === 'number' || typeof v === 'bigint';
|
|
33
|
+
return isNumberish(low) && isNumberish(high);
|
|
34
|
+
}
|
|
35
|
+
function describeUnknown(value) {
|
|
36
|
+
if (typeof value === 'string' ||
|
|
37
|
+
typeof value === 'number' ||
|
|
38
|
+
typeof value === 'bigint' ||
|
|
39
|
+
typeof value === 'boolean') {
|
|
40
|
+
return String(value);
|
|
41
|
+
}
|
|
42
|
+
if (isObjectRecord(value)) {
|
|
43
|
+
if ('value' in value)
|
|
44
|
+
return describeUnknown(value['value']);
|
|
45
|
+
try {
|
|
46
|
+
return JSON.stringify(value);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
function isPopulatedInvokeTx(value) {
|
|
55
|
+
if (!isObjectRecord(value))
|
|
56
|
+
return false;
|
|
57
|
+
return ('contractAddress' in value &&
|
|
58
|
+
typeof value['entrypoint'] === 'string' &&
|
|
59
|
+
(!('calldata' in value) || Array.isArray(value['calldata'])));
|
|
60
|
+
}
|
|
61
|
+
export var StarknetContractName;
|
|
62
|
+
(function (StarknetContractName) {
|
|
63
|
+
StarknetContractName["MAILBOX"] = "mailbox";
|
|
64
|
+
StarknetContractName["MESSAGE_ID_MULTISIG_ISM"] = "messageid_multisig_ism";
|
|
65
|
+
StarknetContractName["MERKLE_ROOT_MULTISIG_ISM"] = "merkleroot_multisig_ism";
|
|
66
|
+
StarknetContractName["ROUTING_ISM"] = "domain_routing_ism";
|
|
67
|
+
StarknetContractName["AGGREGATION_ISM"] = "aggregation";
|
|
68
|
+
StarknetContractName["PAUSABLE_ISM"] = "pausable_ism";
|
|
69
|
+
StarknetContractName["NOOP_ISM"] = "noop_ism";
|
|
70
|
+
StarknetContractName["HOOK"] = "hook";
|
|
71
|
+
StarknetContractName["MERKLE_TREE_HOOK"] = "merkle_tree_hook";
|
|
72
|
+
StarknetContractName["PROTOCOL_FEE"] = "protocol_fee";
|
|
73
|
+
StarknetContractName["VALIDATOR_ANNOUNCE"] = "validator_announce";
|
|
74
|
+
StarknetContractName["HYP_ERC20"] = "HypErc20";
|
|
75
|
+
StarknetContractName["HYP_ERC20_COLLATERAL"] = "HypErc20Collateral";
|
|
76
|
+
StarknetContractName["HYP_NATIVE"] = "HypNative";
|
|
77
|
+
StarknetContractName["ETHER"] = "Ether";
|
|
78
|
+
})(StarknetContractName || (StarknetContractName = {}));
|
|
79
|
+
export const STARKNET_DEFAULT_FEE_TOKEN_ADDRESSES = {
|
|
80
|
+
starknet: '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
|
|
81
|
+
starknetsepolia: '0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d',
|
|
82
|
+
paradex: '0x7348407ebad690fec0cc8597e87dc16ef7b269a655ff72587dafff83d462be2',
|
|
83
|
+
paradexsepolia: '0x06f373b346561036d98ea10fb3e60d2f459c872b1933b50b21fe6ef4fda3b75e',
|
|
84
|
+
};
|
|
85
|
+
export function getStarknetContract(contractName, address, providerOrAccount, contractType = ContractType.CONTRACT) {
|
|
86
|
+
return new Contract({
|
|
87
|
+
abi: getPublishedContractAbi(contractName, contractType),
|
|
88
|
+
address: normalizeStarknetAddressSafe(address),
|
|
89
|
+
providerOrAccount,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function normalizeStarknetAddressSafe(value) {
|
|
93
|
+
if (typeof value === 'string') {
|
|
94
|
+
if (isZeroishAddress(value))
|
|
95
|
+
return ZERO_ADDRESS_HEX_32;
|
|
96
|
+
return addAddressPadding(ensure0x(normalizeAddressStarknet(value)));
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === 'number' || typeof value === 'bigint') {
|
|
99
|
+
return addAddressPadding(ensure0x(BigInt(value).toString(16)));
|
|
100
|
+
}
|
|
101
|
+
if (isObjectRecord(value)) {
|
|
102
|
+
if (isUint256Like(value)) {
|
|
103
|
+
return addAddressPadding(ensure0x(uint256.uint256ToBN(value).toString(16)));
|
|
104
|
+
}
|
|
105
|
+
if ('value' in value) {
|
|
106
|
+
return normalizeStarknetAddressSafe(value['value']);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`Unable to normalize Starknet address: ${describeUnknown(value) || '[unsupported value]'}`);
|
|
110
|
+
}
|
|
111
|
+
export function addressToEvmAddress(value) {
|
|
112
|
+
return bytes32ToAddress(normalizeStarknetAddressSafe(value));
|
|
113
|
+
}
|
|
114
|
+
export async function callContract(contract, method, args = []) {
|
|
115
|
+
assert(hasAbiMethod(contract, method), `Unable to call ${method} on contract ${contract.address}: method not found in ABI`);
|
|
116
|
+
const fn = Reflect.get(contract, method);
|
|
117
|
+
if (typeof fn === 'function')
|
|
118
|
+
return Reflect.apply(fn, contract, args);
|
|
119
|
+
const call = Reflect.get(contract, 'call');
|
|
120
|
+
if (typeof call === 'function') {
|
|
121
|
+
const callArgs = args;
|
|
122
|
+
return Reflect.apply(call, contract, [method, callArgs]);
|
|
123
|
+
}
|
|
124
|
+
throw new Error(`Unable to call ${method} on contract ${contract.address}`);
|
|
125
|
+
}
|
|
126
|
+
export async function populateInvokeTx(contract, method, args = []) {
|
|
127
|
+
assert(hasAbiMethod(contract, method), `Unable to populate ${method} on contract ${contract.address}: method not found in ABI`);
|
|
128
|
+
const populateTransaction = Reflect.get(contract, 'populateTransaction');
|
|
129
|
+
const populated = isObjectRecord(populateTransaction) &&
|
|
130
|
+
typeof populateTransaction[method] === 'function'
|
|
131
|
+
? populateTransaction[method]
|
|
132
|
+
: undefined;
|
|
133
|
+
if (typeof populated === 'function') {
|
|
134
|
+
const tx = await populated(...args);
|
|
135
|
+
if (isPopulatedInvokeTx(tx)) {
|
|
136
|
+
return {
|
|
137
|
+
kind: 'invoke',
|
|
138
|
+
contractAddress: normalizeStarknetAddressSafe(tx.contractAddress),
|
|
139
|
+
entrypoint: tx.entrypoint,
|
|
140
|
+
calldata: tx.calldata ?? [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const abi = getContractAbi(contract);
|
|
145
|
+
return {
|
|
146
|
+
kind: 'invoke',
|
|
147
|
+
contractAddress: normalizeStarknetAddressSafe(contract.address),
|
|
148
|
+
entrypoint: method,
|
|
149
|
+
calldata: abi ? new CallData(abi).compile(method, args) : args,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export function extractEnumVariant(value) {
|
|
153
|
+
if (value === null || value === undefined)
|
|
154
|
+
return '';
|
|
155
|
+
if (value instanceof CairoCustomEnum) {
|
|
156
|
+
return value.activeVariant();
|
|
157
|
+
}
|
|
158
|
+
if (isObjectRecord(value) &&
|
|
159
|
+
'activeVariant' in value &&
|
|
160
|
+
typeof value['activeVariant'] === 'function') {
|
|
161
|
+
return value['activeVariant']();
|
|
162
|
+
}
|
|
163
|
+
if (typeof value === 'string')
|
|
164
|
+
return value;
|
|
165
|
+
if (typeof value === 'number' || typeof value === 'bigint') {
|
|
166
|
+
return value.toString();
|
|
167
|
+
}
|
|
168
|
+
if (isObjectRecord(value)) {
|
|
169
|
+
const entries = Object.entries(value);
|
|
170
|
+
if (entries.length === 1) {
|
|
171
|
+
const [entry] = entries;
|
|
172
|
+
if (entry)
|
|
173
|
+
return entry[0];
|
|
174
|
+
}
|
|
175
|
+
for (const [key, nested] of entries) {
|
|
176
|
+
if (nested !== undefined && nested !== null) {
|
|
177
|
+
return key;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return describeUnknown(value);
|
|
182
|
+
}
|
|
183
|
+
export function toNumber(value) {
|
|
184
|
+
if (typeof value === 'number') {
|
|
185
|
+
assert(Number.isSafeInteger(value), `Unable to coerce value to safe integer: ${value}`);
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
if (typeof value === 'bigint') {
|
|
189
|
+
assert(value <= BigInt(Number.MAX_SAFE_INTEGER) &&
|
|
190
|
+
value >= BigInt(Number.MIN_SAFE_INTEGER), `Unable to coerce value to safe integer: ${value}`);
|
|
191
|
+
return Number(value);
|
|
192
|
+
}
|
|
193
|
+
if (typeof value === 'string') {
|
|
194
|
+
const parsed = Number(value);
|
|
195
|
+
assert(Number.isSafeInteger(parsed), `Unable to coerce value to safe integer: ${value}`);
|
|
196
|
+
return parsed;
|
|
197
|
+
}
|
|
198
|
+
if (isObjectRecord(value) && 'value' in value) {
|
|
199
|
+
return toNumber(value['value']);
|
|
200
|
+
}
|
|
201
|
+
throw new Error(`Unable to coerce value to number: ${describeUnknown(value) || '[unsupported value]'}`);
|
|
202
|
+
}
|
|
203
|
+
export function toBigInt(value) {
|
|
204
|
+
if (typeof value === 'bigint')
|
|
205
|
+
return value;
|
|
206
|
+
if (typeof value === 'number')
|
|
207
|
+
return BigInt(value);
|
|
208
|
+
if (typeof value === 'string')
|
|
209
|
+
return BigInt(value);
|
|
210
|
+
if (isObjectRecord(value)) {
|
|
211
|
+
if (isUint256Like(value)) {
|
|
212
|
+
return uint256.uint256ToBN(value);
|
|
213
|
+
}
|
|
214
|
+
if ('value' in value)
|
|
215
|
+
return toBigInt(value['value']);
|
|
216
|
+
}
|
|
217
|
+
throw new Error(`Unable to coerce value to bigint: ${describeUnknown(value) || '[unsupported value]'}`);
|
|
218
|
+
}
|
|
219
|
+
export function getFeeTokenAddress(params) {
|
|
220
|
+
if (params.nativeDenom && !isZeroishAddress(params.nativeDenom)) {
|
|
221
|
+
return normalizeStarknetAddressSafe(params.nativeDenom);
|
|
222
|
+
}
|
|
223
|
+
const token = STARKNET_DEFAULT_FEE_TOKEN_ADDRESSES[params.chainName];
|
|
224
|
+
assert(token, `Missing Starknet fee token for chain ${params.chainName}`);
|
|
225
|
+
return normalizeStarknetAddressSafe(token);
|
|
226
|
+
}
|
|
227
|
+
export function normalizeRoutersAddress(value) {
|
|
228
|
+
if (isUint256Like(value)) {
|
|
229
|
+
return normalizeStarknetAddressSafe(num.toHex(uint256.uint256ToBN(value)));
|
|
230
|
+
}
|
|
231
|
+
return normalizeStarknetAddressSafe(value);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Creates a Contract instance using the on-chain ABI fetched from the provider.
|
|
235
|
+
* If the contract is a proxy, resolves the implementation class ABI so
|
|
236
|
+
* starknet.js parses responses with the correct types.
|
|
237
|
+
*
|
|
238
|
+
* Handles both Cairo 1 proxies (`get_implementation` returning a struct)
|
|
239
|
+
* and Cairo 0 proxies (`implementation` returning a felt).
|
|
240
|
+
*/
|
|
241
|
+
export async function getOnChainStarknetContract(provider, address) {
|
|
242
|
+
const normalized = normalizeStarknetAddressSafe(address);
|
|
243
|
+
const { abi } = await provider.getClassAt(normalized);
|
|
244
|
+
const contract = new Contract({
|
|
245
|
+
abi,
|
|
246
|
+
address: normalized,
|
|
247
|
+
providerOrAccount: provider,
|
|
248
|
+
});
|
|
249
|
+
const implHash = await resolveImplementationHash(contract);
|
|
250
|
+
if (isNullish(implHash) || implHash === 0n)
|
|
251
|
+
return contract;
|
|
252
|
+
const implClass = await provider.getClassByHash(`0x${implHash.toString(16)}`);
|
|
253
|
+
return new Contract({
|
|
254
|
+
abi: implClass.abi,
|
|
255
|
+
address: normalized,
|
|
256
|
+
providerOrAccount: provider,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
async function resolveImplementationHash(contract) {
|
|
260
|
+
try {
|
|
261
|
+
// Cairo 1 proxy pattern
|
|
262
|
+
if (hasAbiMethod(contract, 'get_implementation')) {
|
|
263
|
+
return coerceClassHash(await callContract(contract, 'get_implementation'));
|
|
264
|
+
}
|
|
265
|
+
// Cairo 0 proxy pattern
|
|
266
|
+
if (hasAbiMethod(contract, 'implementation')) {
|
|
267
|
+
return coerceClassHash(await callContract(contract, 'implementation'));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
rootLogger.warn({ address: contract.address, error }, 'Proxy resolution failed; falling back to contract own ABI');
|
|
272
|
+
}
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Coerces a proxy implementation call result to a bigint class hash.
|
|
277
|
+
* Handles both direct values (bigint/string) and single-field structs
|
|
278
|
+
* returned by Cairo 0 (e.g. `{ implementation_hash_: bigint }`).
|
|
279
|
+
*/
|
|
280
|
+
function coerceClassHash(value) {
|
|
281
|
+
if (typeof value === 'bigint')
|
|
282
|
+
return value;
|
|
283
|
+
if (typeof value === 'string')
|
|
284
|
+
return BigInt(value);
|
|
285
|
+
if (typeof value === 'number')
|
|
286
|
+
return BigInt(value);
|
|
287
|
+
if (isObjectRecord(value)) {
|
|
288
|
+
const values = Object.values(value);
|
|
289
|
+
if (values.length === 1)
|
|
290
|
+
return coerceClassHash(values[0]);
|
|
291
|
+
}
|
|
292
|
+
return toBigInt(value);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Determines whether a storage read error should trigger a fallback
|
|
296
|
+
* to contract call-based reading. Some Starknet chains (e.g. Paradex)
|
|
297
|
+
* have privacy enabled that disallows direct storage reads.
|
|
298
|
+
*/
|
|
299
|
+
/** JSON-RPC error codes that indicate storage reads are unavailable. */
|
|
300
|
+
const STORAGE_READ_FALLBACK_CODES = new Set([-32601, -32000]);
|
|
301
|
+
/** Error message fragments (lowercase) that indicate storage reads are unavailable. */
|
|
302
|
+
const STORAGE_READ_FALLBACK_MESSAGES = [
|
|
303
|
+
'method not found',
|
|
304
|
+
'method not allowed',
|
|
305
|
+
'not supported',
|
|
306
|
+
'unsupported',
|
|
307
|
+
'not implemented',
|
|
308
|
+
];
|
|
309
|
+
export function shouldFallbackStorageRead(error) {
|
|
310
|
+
const code = error && typeof error === 'object' ? Reflect.get(error, 'code') : undefined;
|
|
311
|
+
if (STORAGE_READ_FALLBACK_CODES.has(code))
|
|
312
|
+
return true;
|
|
313
|
+
const message = error instanceof Error
|
|
314
|
+
? error.message
|
|
315
|
+
: typeof error === 'string'
|
|
316
|
+
? error
|
|
317
|
+
: String(error && typeof error === 'object'
|
|
318
|
+
? Reflect.get(error, 'message')
|
|
319
|
+
: error);
|
|
320
|
+
const normalizedMessage = message.toLowerCase();
|
|
321
|
+
return STORAGE_READ_FALLBACK_MESSAGES.some((fragment) => normalizedMessage.includes(fragment));
|
|
322
|
+
}
|
|
323
|
+
export function isProbeMiss(error) {
|
|
324
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
325
|
+
return [
|
|
326
|
+
'entry point',
|
|
327
|
+
'entrypoint',
|
|
328
|
+
'viewable method not found in abi',
|
|
329
|
+
'not found in abi',
|
|
330
|
+
'not found in contract',
|
|
331
|
+
'invalid message selector',
|
|
332
|
+
].some((needle) => message.toLowerCase().includes(needle));
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
|