@humanode-hyperlane/starknet-sdk 0.0.0-stage → 27.2.3-humanode.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +193 -0
- package/dist/clients/protocol.d.ts +24 -0
- package/dist/clients/protocol.d.ts.map +1 -0
- package/dist/clients/protocol.js +55 -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 +93 -0
- package/dist/clients/provider.d.ts.map +1 -0
- package/dist/clients/provider.js +746 -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 +493 -0
- package/dist/clients/provider.test.js.map +1 -0
- package/dist/clients/signer.d.ts +56 -0
- package/dist/clients/signer.d.ts.map +1 -0
- package/dist/clients/signer.js +486 -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 +245 -0
- package/dist/clients/signer.test.js.map +1 -0
- package/dist/contracts.d.ts +43 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +310 -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 +56 -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 +70 -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 +166 -0
- package/dist/hook/hook-artifact-manager.test.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 +43 -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/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 +136 -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 +51 -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 +86 -0
- package/dist/ism/ism-artifact-manager.test.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 +52 -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 +52 -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 +44 -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 +194 -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/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 +77 -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 +20 -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 +78 -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 +116 -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 +112 -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 +70 -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 +109 -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 +95 -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 +127 -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/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 +43 -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 +28 -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 +49 -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 +241 -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 +128 -0
- package/dist/warp/warp-artifact-manager.test.js.map +1 -0
- package/package.json +53 -3
- package/README.md +0 -3
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
import { CairoOption, CairoOptionVariant, RpcProvider, hash, shortString, } from 'starknet';
|
|
2
|
+
import { AltVM } from '@humanode-hyperlane/provider-sdk';
|
|
3
|
+
import { ContractType, getCompiledContract, } from '@humanode-hyperlane/starknet-core';
|
|
4
|
+
import { ZERO_ADDRESS_HEX_32, addressToBytes32, assert, ensure0x, isZeroishAddress, } from '@humanode-hyperlane/utils';
|
|
5
|
+
import { StarknetContractName, addressToEvmAddress, callContract, extractEnumVariant, getFeeTokenAddress, getOnChainStarknetContract, getStarknetContract, normalizeRoutersAddress, normalizeStarknetAddressSafe, populateInvokeTx, toBigInt, toNumber, } from '../contracts.js';
|
|
6
|
+
let tokenTypeByClassHash;
|
|
7
|
+
function getTokenTypeByClassHash() {
|
|
8
|
+
if (tokenTypeByClassHash) {
|
|
9
|
+
return tokenTypeByClassHash;
|
|
10
|
+
}
|
|
11
|
+
const entries = [
|
|
12
|
+
[
|
|
13
|
+
hash.computeContractClassHash(getCompiledContract(StarknetContractName.HYP_ERC20, ContractType.TOKEN)),
|
|
14
|
+
AltVM.TokenType.synthetic,
|
|
15
|
+
],
|
|
16
|
+
[
|
|
17
|
+
hash.computeContractClassHash(getCompiledContract(StarknetContractName.HYP_ERC20_COLLATERAL, ContractType.TOKEN)),
|
|
18
|
+
AltVM.TokenType.collateral,
|
|
19
|
+
],
|
|
20
|
+
[
|
|
21
|
+
hash.computeContractClassHash(getCompiledContract(StarknetContractName.HYP_NATIVE, ContractType.TOKEN)),
|
|
22
|
+
AltVM.TokenType.native,
|
|
23
|
+
],
|
|
24
|
+
];
|
|
25
|
+
tokenTypeByClassHash = new Map(entries.map(([classHash, tokenType]) => [
|
|
26
|
+
BigInt(classHash).toString(),
|
|
27
|
+
tokenType,
|
|
28
|
+
]));
|
|
29
|
+
return tokenTypeByClassHash;
|
|
30
|
+
}
|
|
31
|
+
function isProbeMiss(error) {
|
|
32
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
33
|
+
return [
|
|
34
|
+
'entry point',
|
|
35
|
+
'entrypoint',
|
|
36
|
+
'viewable method not found in abi',
|
|
37
|
+
'not found in abi',
|
|
38
|
+
'not found in contract',
|
|
39
|
+
'invalid message selector',
|
|
40
|
+
].some((needle) => message.toLowerCase().includes(needle));
|
|
41
|
+
}
|
|
42
|
+
export class StarknetProvider {
|
|
43
|
+
provider;
|
|
44
|
+
metadata;
|
|
45
|
+
rpcUrls;
|
|
46
|
+
static connect(rpcUrls, _chainId, extraParams) {
|
|
47
|
+
assert(extraParams?.metadata, 'metadata missing for Starknet provider');
|
|
48
|
+
const metadata = extraParams.metadata;
|
|
49
|
+
assert(rpcUrls.length > 0, 'at least one rpc url is required');
|
|
50
|
+
const provider = new RpcProvider({ nodeUrl: rpcUrls[0] });
|
|
51
|
+
return new StarknetProvider(provider, metadata, rpcUrls);
|
|
52
|
+
}
|
|
53
|
+
constructor(provider, metadata, rpcUrls) {
|
|
54
|
+
this.provider = provider;
|
|
55
|
+
this.metadata = metadata;
|
|
56
|
+
this.rpcUrls = rpcUrls;
|
|
57
|
+
}
|
|
58
|
+
getRawProvider() {
|
|
59
|
+
return this.provider;
|
|
60
|
+
}
|
|
61
|
+
withContract(name, address, providerOrAccount, contractType) {
|
|
62
|
+
return getStarknetContract(name, address, providerOrAccount ?? this.provider, contractType);
|
|
63
|
+
}
|
|
64
|
+
get accountAddress() {
|
|
65
|
+
throw new Error('StarknetProvider has no signer account');
|
|
66
|
+
}
|
|
67
|
+
get feeTokenAddress() {
|
|
68
|
+
return getFeeTokenAddress({
|
|
69
|
+
chainName: this.metadata.name,
|
|
70
|
+
nativeDenom: this.metadata.nativeToken?.denom,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
parseString(value) {
|
|
74
|
+
if (typeof value === 'string')
|
|
75
|
+
return value;
|
|
76
|
+
if (typeof value === 'number' || typeof value === 'bigint') {
|
|
77
|
+
try {
|
|
78
|
+
return shortString.decodeShortString(ensure0x(BigInt(value).toString(16)));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return value.toString();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (value && typeof value === 'object') {
|
|
85
|
+
if ('value' in value)
|
|
86
|
+
return this.parseString(value.value);
|
|
87
|
+
const toStringFn = Reflect.get(value, 'toString');
|
|
88
|
+
if (typeof toStringFn === 'function' &&
|
|
89
|
+
toStringFn !== Object.prototype.toString) {
|
|
90
|
+
const parsed = Reflect.apply(toStringFn, value, []);
|
|
91
|
+
if (typeof parsed === 'string' && parsed !== '[object Object]') {
|
|
92
|
+
return parsed;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return '';
|
|
97
|
+
}
|
|
98
|
+
async populateInvokeCall(contract, method, args = []) {
|
|
99
|
+
const tx = await populateInvokeTx(contract, method, args);
|
|
100
|
+
assert(tx.kind === 'invoke', 'Expected invoke Starknet transaction');
|
|
101
|
+
return {
|
|
102
|
+
contractAddress: normalizeStarknetAddressSafe(tx.contractAddress),
|
|
103
|
+
entrypoint: tx.entrypoint,
|
|
104
|
+
calldata: tx.calldata,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
unwrapBalance(value) {
|
|
108
|
+
if (value && typeof value === 'object' && 'balance' in value) {
|
|
109
|
+
return value.balance;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
async determineTokenType(tokenAddress) {
|
|
114
|
+
const address = normalizeStarknetAddressSafe(tokenAddress);
|
|
115
|
+
const classHash = await this.provider.getClassHashAt(address);
|
|
116
|
+
const tokenType = getTokenTypeByClassHash().get(BigInt(classHash).toString());
|
|
117
|
+
if (tokenType)
|
|
118
|
+
return tokenType;
|
|
119
|
+
try {
|
|
120
|
+
const collateral = this.withContract(StarknetContractName.HYP_ERC20_COLLATERAL, address, this.provider, ContractType.TOKEN);
|
|
121
|
+
await callContract(collateral, 'get_wrapped_token');
|
|
122
|
+
return AltVM.TokenType.collateral;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (!isProbeMiss(error))
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const native = this.withContract(StarknetContractName.HYP_NATIVE, address, this.provider, ContractType.TOKEN);
|
|
130
|
+
await callContract(native, 'native_token');
|
|
131
|
+
return AltVM.TokenType.native;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (!isProbeMiss(error))
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
return AltVM.TokenType.synthetic;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Reads ERC20 metadata by fetching the contract's own ABI from chain,
|
|
141
|
+
* so starknet.js parses responses correctly regardless of whether
|
|
142
|
+
* the contract uses felt252 (Cairo 0) or ByteArray (Cairo 1).
|
|
143
|
+
*/
|
|
144
|
+
async getTokenMetadata(tokenAddress) {
|
|
145
|
+
const nativeToken = this.metadata.nativeToken;
|
|
146
|
+
if (nativeToken?.denom &&
|
|
147
|
+
normalizeStarknetAddressSafe(tokenAddress) ===
|
|
148
|
+
normalizeStarknetAddressSafe(nativeToken.denom)) {
|
|
149
|
+
return {
|
|
150
|
+
name: nativeToken.name,
|
|
151
|
+
symbol: nativeToken.symbol,
|
|
152
|
+
decimals: nativeToken.decimals ?? 18,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const address = normalizeStarknetAddressSafe(tokenAddress);
|
|
156
|
+
const token = await getOnChainStarknetContract(this.provider, address);
|
|
157
|
+
const [name, symbol, decimals] = await Promise.all([
|
|
158
|
+
callContract(token, 'name'),
|
|
159
|
+
callContract(token, 'symbol'),
|
|
160
|
+
callContract(token, 'decimals'),
|
|
161
|
+
]);
|
|
162
|
+
return {
|
|
163
|
+
name: this.parseString(name),
|
|
164
|
+
symbol: this.parseString(symbol),
|
|
165
|
+
decimals: toNumber(decimals),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
parseHookVariant(variant) {
|
|
169
|
+
const upper = variant.toUpperCase();
|
|
170
|
+
if (upper.includes('MERKLE_TREE'))
|
|
171
|
+
return AltVM.HookType.MERKLE_TREE;
|
|
172
|
+
if (upper.includes('PROTOCOL_FEE'))
|
|
173
|
+
return AltVM.HookType.PROTOCOL_FEE;
|
|
174
|
+
if (upper.includes('INTERCHAIN_GAS_PAYMASTER')) {
|
|
175
|
+
return AltVM.HookType.INTERCHAIN_GAS_PAYMASTER;
|
|
176
|
+
}
|
|
177
|
+
return AltVM.HookType.CUSTOM;
|
|
178
|
+
}
|
|
179
|
+
parseIsmVariant(variant) {
|
|
180
|
+
const upper = variant.toUpperCase();
|
|
181
|
+
if (upper.includes('TEST') ||
|
|
182
|
+
upper.includes('NOOP') ||
|
|
183
|
+
upper.includes('NULL') ||
|
|
184
|
+
upper.includes('UNUSED')) {
|
|
185
|
+
return AltVM.IsmType.TEST_ISM;
|
|
186
|
+
}
|
|
187
|
+
if (upper.includes('MERKLE_ROOT_MULTISIG')) {
|
|
188
|
+
return AltVM.IsmType.MERKLE_ROOT_MULTISIG;
|
|
189
|
+
}
|
|
190
|
+
if (upper.includes('MESSAGE_ID_MULTISIG')) {
|
|
191
|
+
return AltVM.IsmType.MESSAGE_ID_MULTISIG;
|
|
192
|
+
}
|
|
193
|
+
if (upper.includes('ROUTING')) {
|
|
194
|
+
return AltVM.IsmType.ROUTING;
|
|
195
|
+
}
|
|
196
|
+
return AltVM.IsmType.CUSTOM;
|
|
197
|
+
}
|
|
198
|
+
// ### QUERY BASE ###
|
|
199
|
+
async isHealthy() {
|
|
200
|
+
try {
|
|
201
|
+
await this.provider.getBlockNumber();
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
getRpcUrls() {
|
|
209
|
+
return this.rpcUrls;
|
|
210
|
+
}
|
|
211
|
+
async getHeight() {
|
|
212
|
+
return this.provider.getBlockNumber();
|
|
213
|
+
}
|
|
214
|
+
async getBalance(req) {
|
|
215
|
+
const tokenAddress = req.denom
|
|
216
|
+
? normalizeStarknetAddressSafe(req.denom)
|
|
217
|
+
: this.feeTokenAddress;
|
|
218
|
+
const token = this.withContract(StarknetContractName.ETHER, tokenAddress, this.provider, ContractType.TOKEN);
|
|
219
|
+
let balance;
|
|
220
|
+
try {
|
|
221
|
+
balance = await callContract(token, 'balanceOf', [
|
|
222
|
+
normalizeStarknetAddressSafe(req.address),
|
|
223
|
+
]);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (!isProbeMiss(error))
|
|
227
|
+
throw error;
|
|
228
|
+
balance = await callContract(token, 'balance_of', [
|
|
229
|
+
normalizeStarknetAddressSafe(req.address),
|
|
230
|
+
]);
|
|
231
|
+
}
|
|
232
|
+
return toBigInt(this.unwrapBalance(balance));
|
|
233
|
+
}
|
|
234
|
+
async getTotalSupply(req) {
|
|
235
|
+
const tokenAddress = req.denom
|
|
236
|
+
? normalizeStarknetAddressSafe(req.denom)
|
|
237
|
+
: this.feeTokenAddress;
|
|
238
|
+
const token = this.withContract(StarknetContractName.ETHER, tokenAddress, this.provider, ContractType.TOKEN);
|
|
239
|
+
return toBigInt(await callContract(token, 'total_supply'));
|
|
240
|
+
}
|
|
241
|
+
async estimateTransactionFee(_req) {
|
|
242
|
+
throw new Error('Starknet transaction fee estimation is unsupported without an account-backed signer');
|
|
243
|
+
}
|
|
244
|
+
// ### QUERY CORE ###
|
|
245
|
+
async getMailbox(req) {
|
|
246
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
247
|
+
const [owner, localDomain, defaultIsm, defaultHook, requiredHook, nonce] = await Promise.all([
|
|
248
|
+
callContract(mailbox, 'owner'),
|
|
249
|
+
callContract(mailbox, 'get_local_domain'),
|
|
250
|
+
callContract(mailbox, 'get_default_ism'),
|
|
251
|
+
callContract(mailbox, 'get_default_hook'),
|
|
252
|
+
callContract(mailbox, 'get_required_hook'),
|
|
253
|
+
callContract(mailbox, 'nonce'),
|
|
254
|
+
]);
|
|
255
|
+
return {
|
|
256
|
+
address: normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
257
|
+
owner: normalizeStarknetAddressSafe(owner),
|
|
258
|
+
localDomain: toNumber(localDomain),
|
|
259
|
+
defaultIsm: normalizeStarknetAddressSafe(defaultIsm),
|
|
260
|
+
defaultHook: normalizeStarknetAddressSafe(defaultHook),
|
|
261
|
+
requiredHook: normalizeStarknetAddressSafe(requiredHook),
|
|
262
|
+
nonce: toNumber(nonce),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
async isMessageDelivered(req) {
|
|
266
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
267
|
+
const delivered = await callContract(mailbox, 'delivered', [req.messageId]);
|
|
268
|
+
if (typeof delivered === 'boolean')
|
|
269
|
+
return delivered;
|
|
270
|
+
return toBigInt(delivered) !== 0n;
|
|
271
|
+
}
|
|
272
|
+
async getIsmType(req) {
|
|
273
|
+
try {
|
|
274
|
+
const ism = this.withContract(StarknetContractName.MERKLE_ROOT_MULTISIG_ISM, req.ismAddress);
|
|
275
|
+
const moduleType = await callContract(ism, 'module_type');
|
|
276
|
+
return this.parseIsmVariant(extractEnumVariant(moduleType));
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
if (!isProbeMiss(error))
|
|
280
|
+
throw error;
|
|
281
|
+
return AltVM.IsmType.CUSTOM;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async getMessageIdMultisigIsm(req) {
|
|
285
|
+
const ism = this.withContract(StarknetContractName.MESSAGE_ID_MULTISIG_ISM, req.ismAddress);
|
|
286
|
+
const [validators, threshold] = await Promise.all([
|
|
287
|
+
callContract(ism, 'get_validators'),
|
|
288
|
+
callContract(ism, 'get_threshold'),
|
|
289
|
+
]);
|
|
290
|
+
assert(Array.isArray(validators), 'Expected Starknet validators array');
|
|
291
|
+
return {
|
|
292
|
+
address: normalizeStarknetAddressSafe(req.ismAddress),
|
|
293
|
+
threshold: toNumber(threshold),
|
|
294
|
+
validators: validators.map((v) => addressToEvmAddress(v)),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
async getMerkleRootMultisigIsm(req) {
|
|
298
|
+
const ism = this.withContract(StarknetContractName.MERKLE_ROOT_MULTISIG_ISM, req.ismAddress);
|
|
299
|
+
const [validators, threshold] = await Promise.all([
|
|
300
|
+
callContract(ism, 'get_validators'),
|
|
301
|
+
callContract(ism, 'get_threshold'),
|
|
302
|
+
]);
|
|
303
|
+
assert(Array.isArray(validators), 'Expected Starknet validators array');
|
|
304
|
+
return {
|
|
305
|
+
address: normalizeStarknetAddressSafe(req.ismAddress),
|
|
306
|
+
threshold: toNumber(threshold),
|
|
307
|
+
validators: validators.map((v) => addressToEvmAddress(v)),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
async getRoutingIsm(req) {
|
|
311
|
+
const ism = this.withContract(StarknetContractName.ROUTING_ISM, req.ismAddress);
|
|
312
|
+
const [owner, domains] = await Promise.all([
|
|
313
|
+
callContract(ism, 'owner'),
|
|
314
|
+
callContract(ism, 'domains'),
|
|
315
|
+
]);
|
|
316
|
+
assert(Array.isArray(domains), 'Expected Starknet routing domains array');
|
|
317
|
+
const routes = await Promise.all(domains.map(async (domainId) => {
|
|
318
|
+
const routeAddress = await callContract(ism, 'module', [domainId]);
|
|
319
|
+
return {
|
|
320
|
+
domainId: toNumber(domainId),
|
|
321
|
+
ismAddress: normalizeStarknetAddressSafe(routeAddress),
|
|
322
|
+
};
|
|
323
|
+
}));
|
|
324
|
+
return {
|
|
325
|
+
address: normalizeStarknetAddressSafe(req.ismAddress),
|
|
326
|
+
owner: normalizeStarknetAddressSafe(owner),
|
|
327
|
+
routes,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
async getNoopIsm(req) {
|
|
331
|
+
return { address: normalizeStarknetAddressSafe(req.ismAddress) };
|
|
332
|
+
}
|
|
333
|
+
async getHookType(req) {
|
|
334
|
+
try {
|
|
335
|
+
const hook = this.withContract(StarknetContractName.HOOK, req.hookAddress);
|
|
336
|
+
const hookType = await callContract(hook, 'hook_type');
|
|
337
|
+
return this.parseHookVariant(extractEnumVariant(hookType));
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
if (!isProbeMiss(error))
|
|
341
|
+
throw error;
|
|
342
|
+
return AltVM.HookType.CUSTOM;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async getInterchainGasPaymasterHook(_req) {
|
|
346
|
+
throw new Error('interchainGasPaymaster hook type is unsupported on Starknet; use protocolFee hook type');
|
|
347
|
+
}
|
|
348
|
+
async getMerkleTreeHook(req) {
|
|
349
|
+
return { address: normalizeStarknetAddressSafe(req.hookAddress) };
|
|
350
|
+
}
|
|
351
|
+
async getNoopHook(req) {
|
|
352
|
+
return { address: normalizeStarknetAddressSafe(req.hookAddress) };
|
|
353
|
+
}
|
|
354
|
+
// ### QUERY WARP ###
|
|
355
|
+
async getToken(req) {
|
|
356
|
+
const tokenAddress = normalizeStarknetAddressSafe(req.tokenAddress);
|
|
357
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, tokenAddress, this.provider, ContractType.TOKEN);
|
|
358
|
+
const tokenType = await this.determineTokenType(tokenAddress);
|
|
359
|
+
const [owner, mailboxAddress, ismAddress, hookAddress] = await Promise.all([
|
|
360
|
+
callContract(token, 'owner'),
|
|
361
|
+
callContract(token, 'mailbox'),
|
|
362
|
+
callContract(token, 'interchain_security_module'),
|
|
363
|
+
callContract(token, 'get_hook'),
|
|
364
|
+
]);
|
|
365
|
+
let denom = tokenAddress;
|
|
366
|
+
let name = '';
|
|
367
|
+
let symbol = '';
|
|
368
|
+
let decimals = this.metadata.nativeToken?.decimals ?? 18;
|
|
369
|
+
try {
|
|
370
|
+
const metadata = await this.getTokenMetadata(tokenAddress);
|
|
371
|
+
name = metadata.name;
|
|
372
|
+
symbol = metadata.symbol;
|
|
373
|
+
decimals = metadata.decimals;
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
if (!isProbeMiss(error))
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
if (tokenType === AltVM.TokenType.collateral) {
|
|
380
|
+
const collateral = this.withContract(StarknetContractName.HYP_ERC20_COLLATERAL, tokenAddress, this.provider, ContractType.TOKEN);
|
|
381
|
+
const wrapped = await callContract(collateral, 'get_wrapped_token');
|
|
382
|
+
denom = normalizeStarknetAddressSafe(wrapped);
|
|
383
|
+
try {
|
|
384
|
+
const wrappedMeta = await this.getTokenMetadata(denom);
|
|
385
|
+
name = wrappedMeta.name;
|
|
386
|
+
symbol = wrappedMeta.symbol;
|
|
387
|
+
decimals = wrappedMeta.decimals;
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
if (!isProbeMiss(error))
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
else if (tokenType === AltVM.TokenType.native) {
|
|
395
|
+
const native = this.withContract(StarknetContractName.HYP_NATIVE, tokenAddress, this.provider, ContractType.TOKEN);
|
|
396
|
+
try {
|
|
397
|
+
const nativeTokenAddress = await callContract(native, 'native_token');
|
|
398
|
+
denom = normalizeStarknetAddressSafe(nativeTokenAddress);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
if (!isProbeMiss(error))
|
|
402
|
+
throw error;
|
|
403
|
+
denom = this.metadata.nativeToken?.denom ?? this.feeTokenAddress;
|
|
404
|
+
}
|
|
405
|
+
name = this.metadata.nativeToken?.name ?? name;
|
|
406
|
+
symbol = this.metadata.nativeToken?.symbol ?? symbol;
|
|
407
|
+
decimals = this.metadata.nativeToken?.decimals ?? decimals;
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
address: tokenAddress,
|
|
411
|
+
owner: normalizeStarknetAddressSafe(owner),
|
|
412
|
+
tokenType,
|
|
413
|
+
mailboxAddress: normalizeStarknetAddressSafe(mailboxAddress),
|
|
414
|
+
ismAddress: normalizeStarknetAddressSafe(ismAddress),
|
|
415
|
+
hookAddress: normalizeStarknetAddressSafe(hookAddress),
|
|
416
|
+
denom,
|
|
417
|
+
name,
|
|
418
|
+
symbol,
|
|
419
|
+
decimals,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
async getRemoteRouters(req) {
|
|
423
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
424
|
+
const domains = await callContract(token, 'domains');
|
|
425
|
+
assert(Array.isArray(domains), 'Expected Starknet token domains array');
|
|
426
|
+
const remoteRouters = await Promise.all(domains.map(async (domainId) => {
|
|
427
|
+
const domain = toNumber(domainId);
|
|
428
|
+
const [routerAddress, gas] = await Promise.all([
|
|
429
|
+
callContract(token, 'routers', [domainId]),
|
|
430
|
+
callContract(token, 'destination_gas', [domainId]).catch(() => 0),
|
|
431
|
+
]);
|
|
432
|
+
return {
|
|
433
|
+
receiverDomainId: domain,
|
|
434
|
+
receiverAddress: normalizeRoutersAddress(routerAddress),
|
|
435
|
+
gas: toBigInt(gas).toString(),
|
|
436
|
+
};
|
|
437
|
+
}));
|
|
438
|
+
return {
|
|
439
|
+
address: normalizeStarknetAddressSafe(req.tokenAddress),
|
|
440
|
+
remoteRouters,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
async getBridgedSupply(req) {
|
|
444
|
+
const tokenInfo = await this.getToken({ tokenAddress: req.tokenAddress });
|
|
445
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
446
|
+
if (tokenInfo.tokenType === AltVM.TokenType.synthetic) {
|
|
447
|
+
return toBigInt(await callContract(token, 'total_supply'));
|
|
448
|
+
}
|
|
449
|
+
return this.getBalance({
|
|
450
|
+
address: req.tokenAddress,
|
|
451
|
+
denom: tokenInfo.denom,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
async quoteRemoteTransfer(req) {
|
|
455
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
456
|
+
const quote = await callContract(token, 'quote_gas_payment', [
|
|
457
|
+
req.destinationDomainId,
|
|
458
|
+
]);
|
|
459
|
+
return {
|
|
460
|
+
denom: this.feeTokenAddress,
|
|
461
|
+
amount: toBigInt(quote),
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
// ### GET CORE TXS ###
|
|
465
|
+
async getCreateMailboxTransaction(req) {
|
|
466
|
+
return {
|
|
467
|
+
kind: 'deploy',
|
|
468
|
+
contractName: StarknetContractName.MAILBOX,
|
|
469
|
+
constructorArgs: [
|
|
470
|
+
req.domainId,
|
|
471
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
472
|
+
normalizeStarknetAddressSafe(req.defaultIsmAddress ?? ZERO_ADDRESS_HEX_32),
|
|
473
|
+
normalizeStarknetAddressSafe(req.defaultHookAddress ?? ZERO_ADDRESS_HEX_32),
|
|
474
|
+
normalizeStarknetAddressSafe(req.requiredHookAddress ?? ZERO_ADDRESS_HEX_32),
|
|
475
|
+
],
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
async getSetDefaultIsmTransaction(req) {
|
|
479
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
480
|
+
return populateInvokeTx(mailbox, 'set_default_ism', [
|
|
481
|
+
normalizeStarknetAddressSafe(req.ismAddress),
|
|
482
|
+
]);
|
|
483
|
+
}
|
|
484
|
+
async getSetDefaultHookTransaction(req) {
|
|
485
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
486
|
+
return populateInvokeTx(mailbox, 'set_default_hook', [
|
|
487
|
+
normalizeStarknetAddressSafe(req.hookAddress),
|
|
488
|
+
]);
|
|
489
|
+
}
|
|
490
|
+
async getSetRequiredHookTransaction(req) {
|
|
491
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
492
|
+
return populateInvokeTx(mailbox, 'set_required_hook', [
|
|
493
|
+
normalizeStarknetAddressSafe(req.hookAddress),
|
|
494
|
+
]);
|
|
495
|
+
}
|
|
496
|
+
async getSetMailboxOwnerTransaction(req) {
|
|
497
|
+
const mailbox = this.withContract(StarknetContractName.MAILBOX, req.mailboxAddress);
|
|
498
|
+
return populateInvokeTx(mailbox, 'transfer_ownership', [
|
|
499
|
+
normalizeStarknetAddressSafe(req.newOwner),
|
|
500
|
+
]);
|
|
501
|
+
}
|
|
502
|
+
async getCreateMerkleRootMultisigIsmTransaction(req) {
|
|
503
|
+
return {
|
|
504
|
+
kind: 'deploy',
|
|
505
|
+
contractName: StarknetContractName.MERKLE_ROOT_MULTISIG_ISM,
|
|
506
|
+
constructorArgs: [
|
|
507
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
508
|
+
req.validators.map((validator) => addressToBytes32(validator)),
|
|
509
|
+
req.threshold,
|
|
510
|
+
],
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
async getCreateMessageIdMultisigIsmTransaction(req) {
|
|
514
|
+
return {
|
|
515
|
+
kind: 'deploy',
|
|
516
|
+
contractName: StarknetContractName.MESSAGE_ID_MULTISIG_ISM,
|
|
517
|
+
constructorArgs: [
|
|
518
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
519
|
+
req.validators.map((validator) => addressToBytes32(validator)),
|
|
520
|
+
req.threshold,
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
async getCreateRoutingIsmTransaction(req) {
|
|
525
|
+
return {
|
|
526
|
+
kind: 'deploy',
|
|
527
|
+
contractName: StarknetContractName.ROUTING_ISM,
|
|
528
|
+
constructorArgs: [normalizeStarknetAddressSafe(req.signer)],
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
async getSetRoutingIsmRouteTransaction(req) {
|
|
532
|
+
const routing = this.withContract(StarknetContractName.ROUTING_ISM, req.ismAddress);
|
|
533
|
+
return populateInvokeTx(routing, 'set', [
|
|
534
|
+
req.route.domainId,
|
|
535
|
+
normalizeStarknetAddressSafe(req.route.ismAddress),
|
|
536
|
+
]);
|
|
537
|
+
}
|
|
538
|
+
async getRemoveRoutingIsmRouteTransaction(req) {
|
|
539
|
+
const routing = this.withContract(StarknetContractName.ROUTING_ISM, req.ismAddress);
|
|
540
|
+
return populateInvokeTx(routing, 'remove', [req.domainId]);
|
|
541
|
+
}
|
|
542
|
+
async getSetRoutingIsmOwnerTransaction(req) {
|
|
543
|
+
const routing = this.withContract(StarknetContractName.ROUTING_ISM, req.ismAddress);
|
|
544
|
+
return populateInvokeTx(routing, 'transfer_ownership', [
|
|
545
|
+
normalizeStarknetAddressSafe(req.newOwner),
|
|
546
|
+
]);
|
|
547
|
+
}
|
|
548
|
+
async getCreateNoopIsmTransaction(_req) {
|
|
549
|
+
return {
|
|
550
|
+
kind: 'deploy',
|
|
551
|
+
contractName: StarknetContractName.NOOP_ISM,
|
|
552
|
+
constructorArgs: [],
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
async getCreateMerkleTreeHookTransaction(req) {
|
|
556
|
+
return {
|
|
557
|
+
kind: 'deploy',
|
|
558
|
+
contractName: StarknetContractName.MERKLE_TREE_HOOK,
|
|
559
|
+
constructorArgs: [
|
|
560
|
+
normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
561
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
562
|
+
],
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
async getCreateInterchainGasPaymasterHookTransaction(_req) {
|
|
566
|
+
throw new Error('interchainGasPaymaster hook type is unsupported on Starknet; use protocolFee hook type');
|
|
567
|
+
}
|
|
568
|
+
async getSetInterchainGasPaymasterHookOwnerTransaction(_req) {
|
|
569
|
+
throw new Error('interchainGasPaymaster hook type is unsupported on Starknet; use protocolFee hook type');
|
|
570
|
+
}
|
|
571
|
+
async getSetDestinationGasConfigTransaction(_req) {
|
|
572
|
+
throw new Error('interchainGasPaymaster hook type is unsupported on Starknet');
|
|
573
|
+
}
|
|
574
|
+
async getRemoveDestinationGasConfigTransaction(_req) {
|
|
575
|
+
throw new Error('interchainGasPaymaster hook type is unsupported on Starknet');
|
|
576
|
+
}
|
|
577
|
+
async getCreateNoopHookTransaction(_req) {
|
|
578
|
+
return {
|
|
579
|
+
kind: 'deploy',
|
|
580
|
+
contractName: StarknetContractName.HOOK,
|
|
581
|
+
constructorArgs: [],
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
async getCreateValidatorAnnounceTransaction(req) {
|
|
585
|
+
return {
|
|
586
|
+
kind: 'deploy',
|
|
587
|
+
contractName: StarknetContractName.VALIDATOR_ANNOUNCE,
|
|
588
|
+
constructorArgs: [
|
|
589
|
+
normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
590
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
591
|
+
],
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
async getCreateProxyAdminTransaction(_req) {
|
|
595
|
+
throw new Error('Proxy admin unsupported on Starknet');
|
|
596
|
+
}
|
|
597
|
+
async getSetProxyAdminOwnerTransaction(_req) {
|
|
598
|
+
throw new Error('Proxy admin unsupported on Starknet');
|
|
599
|
+
}
|
|
600
|
+
// ### GET WARP TXS ###
|
|
601
|
+
async getCreateNativeTokenTransaction(req) {
|
|
602
|
+
const mailbox = await this.getMailbox({
|
|
603
|
+
mailboxAddress: req.mailboxAddress,
|
|
604
|
+
});
|
|
605
|
+
return {
|
|
606
|
+
kind: 'deploy',
|
|
607
|
+
contractName: StarknetContractName.HYP_NATIVE,
|
|
608
|
+
contractType: ContractType.TOKEN,
|
|
609
|
+
constructorArgs: [
|
|
610
|
+
normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
611
|
+
this.feeTokenAddress,
|
|
612
|
+
normalizeStarknetAddressSafe(mailbox.defaultHook),
|
|
613
|
+
normalizeStarknetAddressSafe(mailbox.defaultIsm),
|
|
614
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
615
|
+
],
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
async getCreateCollateralTokenTransaction(req) {
|
|
619
|
+
const mailbox = await this.getMailbox({
|
|
620
|
+
mailboxAddress: req.mailboxAddress,
|
|
621
|
+
});
|
|
622
|
+
return {
|
|
623
|
+
kind: 'deploy',
|
|
624
|
+
contractName: StarknetContractName.HYP_ERC20_COLLATERAL,
|
|
625
|
+
contractType: ContractType.TOKEN,
|
|
626
|
+
constructorArgs: [
|
|
627
|
+
normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
628
|
+
normalizeStarknetAddressSafe(req.collateralDenom),
|
|
629
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
630
|
+
normalizeStarknetAddressSafe(mailbox.defaultHook),
|
|
631
|
+
normalizeStarknetAddressSafe(mailbox.defaultIsm),
|
|
632
|
+
],
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
async getCreateSyntheticTokenTransaction(req) {
|
|
636
|
+
const mailbox = await this.getMailbox({
|
|
637
|
+
mailboxAddress: req.mailboxAddress,
|
|
638
|
+
});
|
|
639
|
+
return {
|
|
640
|
+
kind: 'deploy',
|
|
641
|
+
contractName: StarknetContractName.HYP_ERC20,
|
|
642
|
+
contractType: ContractType.TOKEN,
|
|
643
|
+
constructorArgs: [
|
|
644
|
+
req.decimals,
|
|
645
|
+
normalizeStarknetAddressSafe(req.mailboxAddress),
|
|
646
|
+
0,
|
|
647
|
+
req.name,
|
|
648
|
+
req.denom,
|
|
649
|
+
normalizeStarknetAddressSafe(mailbox.defaultHook),
|
|
650
|
+
normalizeStarknetAddressSafe(mailbox.defaultIsm),
|
|
651
|
+
normalizeStarknetAddressSafe(req.signer),
|
|
652
|
+
],
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
async getSetTokenOwnerTransaction(req) {
|
|
656
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
657
|
+
return populateInvokeTx(token, 'transfer_ownership', [
|
|
658
|
+
normalizeStarknetAddressSafe(req.newOwner),
|
|
659
|
+
]);
|
|
660
|
+
}
|
|
661
|
+
async getSetTokenIsmTransaction(req) {
|
|
662
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
663
|
+
return populateInvokeTx(token, 'set_interchain_security_module', [
|
|
664
|
+
normalizeStarknetAddressSafe(req.ismAddress ?? ZERO_ADDRESS_HEX_32),
|
|
665
|
+
]);
|
|
666
|
+
}
|
|
667
|
+
async getSetTokenHookTransaction(req) {
|
|
668
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
669
|
+
return populateInvokeTx(token, 'set_hook', [
|
|
670
|
+
normalizeStarknetAddressSafe(req.hookAddress ?? ZERO_ADDRESS_HEX_32),
|
|
671
|
+
]);
|
|
672
|
+
}
|
|
673
|
+
async getEnrollRemoteRouterTransaction(req) {
|
|
674
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
675
|
+
const receiverAddress = isZeroishAddress(req.remoteRouter.receiverAddress)
|
|
676
|
+
? ZERO_ADDRESS_HEX_32
|
|
677
|
+
: ensure0x(req.remoteRouter.receiverAddress);
|
|
678
|
+
const noneOption = new CairoOption(CairoOptionVariant.None);
|
|
679
|
+
const domainOption = new CairoOption(CairoOptionVariant.Some, req.remoteRouter.receiverDomainId);
|
|
680
|
+
const gasOption = new CairoOption(CairoOptionVariant.Some, req.remoteRouter.gas);
|
|
681
|
+
const [enrollCall, gasCall] = await Promise.all([
|
|
682
|
+
this.populateInvokeCall(token, 'enroll_remote_router', [
|
|
683
|
+
req.remoteRouter.receiverDomainId,
|
|
684
|
+
receiverAddress,
|
|
685
|
+
]),
|
|
686
|
+
this.populateInvokeCall(token, 'set_destination_gas', [
|
|
687
|
+
noneOption,
|
|
688
|
+
domainOption,
|
|
689
|
+
gasOption,
|
|
690
|
+
]),
|
|
691
|
+
]);
|
|
692
|
+
return {
|
|
693
|
+
kind: 'invoke',
|
|
694
|
+
contractAddress: enrollCall.contractAddress,
|
|
695
|
+
entrypoint: enrollCall.entrypoint,
|
|
696
|
+
calldata: enrollCall.calldata,
|
|
697
|
+
calls: [enrollCall, gasCall],
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
async getUnenrollRemoteRouterTransaction(req) {
|
|
701
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
702
|
+
return populateInvokeTx(token, 'unenroll_remote_router', [
|
|
703
|
+
req.receiverDomainId,
|
|
704
|
+
]);
|
|
705
|
+
}
|
|
706
|
+
async getTransferTransaction(req) {
|
|
707
|
+
const denom = req.denom
|
|
708
|
+
? normalizeStarknetAddressSafe(req.denom)
|
|
709
|
+
: this.feeTokenAddress;
|
|
710
|
+
const token = this.withContract(StarknetContractName.ETHER, denom, this.provider, ContractType.TOKEN);
|
|
711
|
+
return populateInvokeTx(token, 'transfer', [
|
|
712
|
+
normalizeStarknetAddressSafe(req.recipient),
|
|
713
|
+
req.amount,
|
|
714
|
+
]);
|
|
715
|
+
}
|
|
716
|
+
async getRemoteTransferTransaction(req) {
|
|
717
|
+
return this.buildRemoteTransferTransaction(req);
|
|
718
|
+
}
|
|
719
|
+
async buildRemoteTransferTransaction(req, tokenInfo) {
|
|
720
|
+
if (req.customHookAddress || req.customHookMetadata) {
|
|
721
|
+
throw new Error('Custom hook metadata/addresses are unsupported for Starknet transfer_remote in provider-sdk');
|
|
722
|
+
}
|
|
723
|
+
const tokenType = tokenInfo?.tokenType ?? (await this.determineTokenType(req.tokenAddress));
|
|
724
|
+
const token = this.withContract(StarknetContractName.HYP_ERC20, req.tokenAddress, this.provider, ContractType.TOKEN);
|
|
725
|
+
const noneOption = new CairoOption(CairoOptionVariant.None);
|
|
726
|
+
let value;
|
|
727
|
+
if (tokenType === AltVM.TokenType.native) {
|
|
728
|
+
value = toBigInt(req.amount) + toBigInt(req.maxFee.amount);
|
|
729
|
+
}
|
|
730
|
+
else if (tokenType === AltVM.TokenType.collateral) {
|
|
731
|
+
value = toBigInt(req.maxFee.amount);
|
|
732
|
+
}
|
|
733
|
+
else {
|
|
734
|
+
value = toBigInt(req.maxFee.amount);
|
|
735
|
+
}
|
|
736
|
+
return populateInvokeTx(token, 'transfer_remote', [
|
|
737
|
+
req.destinationDomainId,
|
|
738
|
+
addressToBytes32(req.recipient),
|
|
739
|
+
req.amount,
|
|
740
|
+
value,
|
|
741
|
+
noneOption,
|
|
742
|
+
noneOption,
|
|
743
|
+
]);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
//# sourceMappingURL=provider.js.map
|