@sodax/sdk 0.0.1-rc.27 → 0.0.1-rc.29
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/dist/index.cjs +833 -786
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -6
- package/dist/index.d.ts +24 -6
- package/dist/index.mjs +840 -795
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { getAbiItem, encodeAbiParameters, parseAbiParameters, toHex, erc20Abi as erc20Abi$1, encodeFunctionData,
|
|
2
|
-
import invariant11 from 'tiny-invariant';
|
|
3
|
-
import { bcs } from '@mysten/sui/bcs';
|
|
4
|
-
import { PublicKey, Connection, VersionedTransaction, SystemProgram, ComputeBudgetProgram } from '@solana/web3.js';
|
|
5
|
-
import { SorobanRpc, Address, Horizon, Contract, TransactionBuilder, BASE_FEE, nativeToScVal, TimeoutInfinite, rpc, scValToBigInt, Operation, Account, FeeBumpTransaction } from '@stellar/stellar-sdk';
|
|
1
|
+
import { getAbiItem, encodeAbiParameters, parseAbiParameters, fromHex, createPublicClient, http, toHex, erc20Abi as erc20Abi$1, encodeFunctionData, decodeAbiParameters, encodePacked, parseEventLogs, keccak256, isAddress } from 'viem';
|
|
6
2
|
import { nibiru, polygon, bsc, optimism, base, arbitrum, avalanche, sonic } from 'viem/chains';
|
|
7
3
|
import { SPOKE_CHAIN_IDS, ICON_MAINNET_CHAIN_ID, SUI_MAINNET_CHAIN_ID, STELLAR_MAINNET_CHAIN_ID, INJECTIVE_MAINNET_CHAIN_ID, POLYGON_MAINNET_CHAIN_ID, BSC_MAINNET_CHAIN_ID, OPTIMISM_MAINNET_CHAIN_ID, BASE_MAINNET_CHAIN_ID, ARBITRUM_MAINNET_CHAIN_ID, NIBIRU_MAINNET_CHAIN_ID, AVALANCHE_MAINNET_CHAIN_ID, SOLANA_MAINNET_CHAIN_ID, SONIC_MAINNET_CHAIN_ID } from '@sodax/types';
|
|
8
4
|
export * from '@sodax/types';
|
|
9
5
|
import { ChainGrpcWasmApi, TxGrpcApi, toBase64 } from '@injectivelabs/sdk-ts';
|
|
10
6
|
import { getNetworkEndpoints, Network } from '@injectivelabs/networks';
|
|
11
7
|
import * as IconSdkRaw from 'icon-sdk-js';
|
|
8
|
+
import { SorobanRpc, Horizon, Contract, TransactionBuilder, BASE_FEE, nativeToScVal, TimeoutInfinite, rpc, scValToBigInt, Operation, Address, Account, FeeBumpTransaction } from '@stellar/stellar-sdk';
|
|
9
|
+
import { bcs } from '@mysten/sui/bcs';
|
|
12
10
|
import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';
|
|
13
11
|
import { Transaction } from '@mysten/sui/transactions';
|
|
12
|
+
import { PublicKey, Connection, VersionedTransaction, SystemProgram, ComputeBudgetProgram } from '@solana/web3.js';
|
|
14
13
|
import { CosmosTxV1Beta1Tx } from '@injectivelabs/core-proto-ts';
|
|
15
14
|
import * as rlp from 'rlp';
|
|
16
15
|
import { TOKEN_PROGRAM_ID } from '@solana/spl-token';
|
|
17
16
|
import * as anchor from '@coral-xyz/anchor';
|
|
18
17
|
import BN from 'bn.js';
|
|
18
|
+
import invariant11 from 'tiny-invariant';
|
|
19
19
|
import BigNumber4, { BigNumber } from 'bignumber.js';
|
|
20
20
|
|
|
21
21
|
// src/abis/asset-manager.abi.ts
|
|
@@ -6104,107 +6104,6 @@ function encodeContractCalls(calls) {
|
|
|
6104
6104
|
async function waitForTransactionReceipt(hash, provider) {
|
|
6105
6105
|
return provider.waitForTransactionReceipt(hash);
|
|
6106
6106
|
}
|
|
6107
|
-
async function retry(action, retryCount = DEFAULT_MAX_RETRY, delayMs = DEFAULT_RETRY_DELAY_MS) {
|
|
6108
|
-
do {
|
|
6109
|
-
try {
|
|
6110
|
-
return await action(retryCount);
|
|
6111
|
-
} catch (e) {
|
|
6112
|
-
retryCount--;
|
|
6113
|
-
if (retryCount <= 0) {
|
|
6114
|
-
console.error(`Failed to perform operation even after ${DEFAULT_MAX_RETRY} attempts.. Throwing origin error..`);
|
|
6115
|
-
throw e;
|
|
6116
|
-
}
|
|
6117
|
-
}
|
|
6118
|
-
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
6119
|
-
} while (retryCount > 0);
|
|
6120
|
-
throw new Error(`Retry exceeded MAX_RETRY_DEFAULT=${DEFAULT_MAX_RETRY}`);
|
|
6121
|
-
}
|
|
6122
|
-
function getRandomBytes(length) {
|
|
6123
|
-
const array = new Uint8Array(length);
|
|
6124
|
-
for (let i = 0; i < length; i++) {
|
|
6125
|
-
array[i] = Math.floor(Math.random() * 256);
|
|
6126
|
-
}
|
|
6127
|
-
return array;
|
|
6128
|
-
}
|
|
6129
|
-
function randomUint256() {
|
|
6130
|
-
const bytes = getRandomBytes(32);
|
|
6131
|
-
let hex = "";
|
|
6132
|
-
for (const byte of bytes) {
|
|
6133
|
-
hex += byte.toString(16).padStart(2, "0") ?? "";
|
|
6134
|
-
}
|
|
6135
|
-
return BigInt(`0x${hex}`);
|
|
6136
|
-
}
|
|
6137
|
-
function calculatePercentageFeeAmount(amount, percentage) {
|
|
6138
|
-
return amount * BigInt(percentage) / FEE_PERCENTAGE_SCALE;
|
|
6139
|
-
}
|
|
6140
|
-
function calculateFeeAmount(inputAmount, fee) {
|
|
6141
|
-
if (!fee) {
|
|
6142
|
-
return 0n;
|
|
6143
|
-
}
|
|
6144
|
-
invariant11(inputAmount > 0n, "Input amount must be greater than 0");
|
|
6145
|
-
let feeAmount = 0n;
|
|
6146
|
-
if (isPartnerFeeAmount(fee)) {
|
|
6147
|
-
invariant11(
|
|
6148
|
-
fee.amount >= 0 && fee.amount <= inputAmount,
|
|
6149
|
-
`Fee amount must be greater than 0 and less than or equal to the input amount: ${fee.amount}`
|
|
6150
|
-
);
|
|
6151
|
-
feeAmount = fee.amount;
|
|
6152
|
-
} else if (isPartnerFeePercentage(fee)) {
|
|
6153
|
-
invariant11(
|
|
6154
|
-
fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,
|
|
6155
|
-
`Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`
|
|
6156
|
-
);
|
|
6157
|
-
feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);
|
|
6158
|
-
}
|
|
6159
|
-
return feeAmount;
|
|
6160
|
-
}
|
|
6161
|
-
function adjustAmountByFee(amount, fee, quoteType) {
|
|
6162
|
-
invariant11(amount > 0n, "Amount must be greater than 0");
|
|
6163
|
-
invariant11(quoteType === "exact_input" || quoteType === "exact_output", "Invalid quote type");
|
|
6164
|
-
if (quoteType === "exact_input") {
|
|
6165
|
-
return amount - calculateFeeAmount(amount, fee);
|
|
6166
|
-
}
|
|
6167
|
-
if (quoteType === "exact_output") {
|
|
6168
|
-
return amount + calculateFeeAmount(amount, fee);
|
|
6169
|
-
}
|
|
6170
|
-
throw new Error("Invalid quote type");
|
|
6171
|
-
}
|
|
6172
|
-
function BigIntToHex(value) {
|
|
6173
|
-
return `0x${value.toString(16)}`;
|
|
6174
|
-
}
|
|
6175
|
-
function encodeAddress(spokeChainId, address) {
|
|
6176
|
-
switch (spokeChainId) {
|
|
6177
|
-
case "0xa86a.avax":
|
|
6178
|
-
case "0x2105.base":
|
|
6179
|
-
case "0xa.optimism":
|
|
6180
|
-
case "0x38.bsc":
|
|
6181
|
-
case "0x89.polygon":
|
|
6182
|
-
case "0xa4b1.arbitrum":
|
|
6183
|
-
case "sonic":
|
|
6184
|
-
return address;
|
|
6185
|
-
case "injective-1":
|
|
6186
|
-
return toHex(Buffer.from(address, "utf-8"));
|
|
6187
|
-
case "0x1.icon":
|
|
6188
|
-
return toHex(Buffer.from(address.replace("cx", "01").replace("hx", "00") ?? "f8", "hex"));
|
|
6189
|
-
case "sui":
|
|
6190
|
-
return toHex(bcs.Address.serialize(address).toBytes());
|
|
6191
|
-
case "solana":
|
|
6192
|
-
return toHex(Buffer.from(new PublicKey(address).toBytes()));
|
|
6193
|
-
case "stellar":
|
|
6194
|
-
return `0x${Address.fromString(address).toScVal().toXDR("hex")}`;
|
|
6195
|
-
default:
|
|
6196
|
-
return address;
|
|
6197
|
-
}
|
|
6198
|
-
}
|
|
6199
|
-
function hexToBigInt(hex) {
|
|
6200
|
-
const trimmed = hex.trim().toLowerCase();
|
|
6201
|
-
const isValid = /^(0x)?[0-9a-f]+$/.test(trimmed);
|
|
6202
|
-
if (!isValid) {
|
|
6203
|
-
throw new Error(`Invalid hex string: "${hex}"`);
|
|
6204
|
-
}
|
|
6205
|
-
const normalized = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
|
|
6206
|
-
return BigInt(normalized);
|
|
6207
|
-
}
|
|
6208
6107
|
var DEFAULT_MAX_RETRY = 3;
|
|
6209
6108
|
var DEFAULT_RELAY_TX_TIMEOUT = 6e4;
|
|
6210
6109
|
var DEFAULT_RETRY_DELAY_MS = 2e3;
|
|
@@ -6213,6 +6112,7 @@ var MAX_UINT256 = (1n << 256n) - 1n;
|
|
|
6213
6112
|
var FEE_PERCENTAGE_SCALE = 10000n;
|
|
6214
6113
|
var STELLAR_PRIORITY_FEE = "10000";
|
|
6215
6114
|
var STELLAR_DEFAULT_TX_TIMEOUT_SECONDS = 100;
|
|
6115
|
+
var DEFAULT_DEADLINE_OFFSET = 300n;
|
|
6216
6116
|
var VAULT_TOKEN_DECIMALS = 18;
|
|
6217
6117
|
var INTENT_RELAY_CHAIN_IDS = {
|
|
6218
6118
|
AVAX: 6n,
|
|
@@ -7909,660 +7809,257 @@ var isNativeToken = (chainId, token) => {
|
|
|
7909
7809
|
}
|
|
7910
7810
|
return token.address.toLowerCase() === spokeChainConfig[chainId].nativeToken.toLowerCase();
|
|
7911
7811
|
};
|
|
7912
|
-
var
|
|
7913
|
-
|
|
7812
|
+
var InjectiveSpokeProvider = class {
|
|
7813
|
+
walletProvider;
|
|
7814
|
+
chainConfig;
|
|
7815
|
+
chainGrpcWasmApi;
|
|
7816
|
+
txClient;
|
|
7817
|
+
constructor(conf, walletProvider) {
|
|
7818
|
+
this.chainConfig = conf;
|
|
7819
|
+
this.walletProvider = walletProvider;
|
|
7820
|
+
const endpoints = getNetworkEndpoints(Network.Mainnet);
|
|
7821
|
+
this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);
|
|
7822
|
+
this.txClient = new TxGrpcApi(endpoints.grpc);
|
|
7914
7823
|
}
|
|
7915
|
-
|
|
7916
|
-
|
|
7917
|
-
|
|
7918
|
-
|
|
7919
|
-
|
|
7920
|
-
|
|
7921
|
-
|
|
7922
|
-
|
|
7923
|
-
*/
|
|
7924
|
-
static async isAllowanceValid(token, amount, owner, spender, spokeProvider) {
|
|
7925
|
-
try {
|
|
7926
|
-
if (token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase()) {
|
|
7927
|
-
return {
|
|
7928
|
-
ok: true,
|
|
7929
|
-
value: true
|
|
7930
|
-
};
|
|
7931
|
-
}
|
|
7932
|
-
const allowedAmount = await spokeProvider.publicClient.readContract({
|
|
7933
|
-
address: token,
|
|
7934
|
-
abi: erc20Abi$1,
|
|
7935
|
-
functionName: "allowance",
|
|
7936
|
-
args: [owner, spender]
|
|
7937
|
-
});
|
|
7938
|
-
return {
|
|
7939
|
-
ok: true,
|
|
7940
|
-
value: allowedAmount >= amount
|
|
7941
|
-
};
|
|
7942
|
-
} catch (e) {
|
|
7943
|
-
return {
|
|
7944
|
-
ok: false,
|
|
7945
|
-
error: e
|
|
7946
|
-
};
|
|
7947
|
-
}
|
|
7824
|
+
// Query Methods
|
|
7825
|
+
async getState() {
|
|
7826
|
+
return this.chainGrpcWasmApi.fetchSmartContractState(
|
|
7827
|
+
this.chainConfig.addresses.assetManager,
|
|
7828
|
+
toBase64({
|
|
7829
|
+
get_state: {}
|
|
7830
|
+
})
|
|
7831
|
+
);
|
|
7948
7832
|
}
|
|
7949
|
-
|
|
7950
|
-
|
|
7951
|
-
|
|
7952
|
-
|
|
7953
|
-
|
|
7954
|
-
* @param provider - EVM Provider
|
|
7955
|
-
*/
|
|
7956
|
-
static async approve(token, amount, spender, spokeProvider, raw) {
|
|
7957
|
-
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
7958
|
-
const rawTx = {
|
|
7959
|
-
from: walletAddress,
|
|
7960
|
-
to: token,
|
|
7961
|
-
value: 0n,
|
|
7962
|
-
data: encodeFunctionData({
|
|
7963
|
-
abi: erc20Abi$1,
|
|
7964
|
-
functionName: "approve",
|
|
7965
|
-
args: [spender, amount]
|
|
7833
|
+
async getBalance(token) {
|
|
7834
|
+
return this.chainGrpcWasmApi.fetchSmartContractState(
|
|
7835
|
+
this.chainConfig.addresses.assetManager,
|
|
7836
|
+
toBase64({
|
|
7837
|
+
get_balance: { denom: token }
|
|
7966
7838
|
})
|
|
7839
|
+
);
|
|
7840
|
+
}
|
|
7841
|
+
// Execute Methods (requires SigningCosmWasmClient)
|
|
7842
|
+
/**
|
|
7843
|
+
* Deposit tokens including native token to Injective Asset Manager.
|
|
7844
|
+
**/
|
|
7845
|
+
static async deposit(sender, token_address, to, amount, data = "0x", spokeProvider, raw) {
|
|
7846
|
+
const toBytes = fromHex(to, "bytes");
|
|
7847
|
+
const dataBytes = fromHex(data, "bytes");
|
|
7848
|
+
const msg = {
|
|
7849
|
+
transfer: {
|
|
7850
|
+
token: token_address,
|
|
7851
|
+
to: Array.from(toBytes),
|
|
7852
|
+
amount,
|
|
7853
|
+
data: Array.from(dataBytes)
|
|
7854
|
+
}
|
|
7967
7855
|
};
|
|
7856
|
+
const funds = [{ amount, denom: token_address }];
|
|
7968
7857
|
if (raw) {
|
|
7969
|
-
return
|
|
7858
|
+
return await spokeProvider.walletProvider.getRawTransaction(
|
|
7859
|
+
spokeProvider.chainConfig.networkId,
|
|
7860
|
+
spokeProvider.chainConfig.prefix,
|
|
7861
|
+
sender,
|
|
7862
|
+
spokeProvider.chainConfig.addresses.assetManager,
|
|
7863
|
+
msg
|
|
7864
|
+
);
|
|
7970
7865
|
}
|
|
7971
|
-
|
|
7866
|
+
const res = await spokeProvider.walletProvider.execute(
|
|
7867
|
+
sender,
|
|
7868
|
+
spokeProvider.chainConfig.addresses.assetManager,
|
|
7869
|
+
msg,
|
|
7870
|
+
funds
|
|
7871
|
+
);
|
|
7872
|
+
return res.transactionHash;
|
|
7972
7873
|
}
|
|
7973
|
-
|
|
7974
|
-
|
|
7975
|
-
|
|
7976
|
-
|
|
7977
|
-
|
|
7978
|
-
|
|
7979
|
-
|
|
7980
|
-
|
|
7981
|
-
|
|
7982
|
-
address: token,
|
|
7983
|
-
value: 0n,
|
|
7984
|
-
data: encodeFunctionData({
|
|
7985
|
-
abi: erc20Abi$1,
|
|
7986
|
-
functionName: "transfer",
|
|
7987
|
-
args: [to, amount]
|
|
7988
|
-
})
|
|
7874
|
+
async receiveMessage(senderAddress, srcChainId, srcAddress, connSn, payload, signatures) {
|
|
7875
|
+
const msg = {
|
|
7876
|
+
recv_message: {
|
|
7877
|
+
src_chain_id: srcChainId,
|
|
7878
|
+
src_address: srcAddress,
|
|
7879
|
+
conn_sn: connSn,
|
|
7880
|
+
payload,
|
|
7881
|
+
signatures
|
|
7882
|
+
}
|
|
7989
7883
|
};
|
|
7884
|
+
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
7990
7885
|
}
|
|
7991
|
-
|
|
7992
|
-
|
|
7993
|
-
|
|
7994
|
-
|
|
7995
|
-
|
|
7996
|
-
* @param amount - The amount of the token to transfer.
|
|
7997
|
-
* @returns The encoded contract call.
|
|
7998
|
-
*/
|
|
7999
|
-
static encodeTransferFrom(token, from, to, amount) {
|
|
8000
|
-
return {
|
|
8001
|
-
address: token,
|
|
8002
|
-
value: 0n,
|
|
8003
|
-
data: encodeFunctionData({
|
|
8004
|
-
abi: erc20Abi$1,
|
|
8005
|
-
functionName: "transferFrom",
|
|
8006
|
-
args: [from, to, amount]
|
|
8007
|
-
})
|
|
7886
|
+
async setRateLimit(senderAddress, rateLimit) {
|
|
7887
|
+
const msg = {
|
|
7888
|
+
set_rate_limit: {
|
|
7889
|
+
rate_limit: rateLimit
|
|
7890
|
+
}
|
|
8008
7891
|
};
|
|
7892
|
+
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8009
7893
|
}
|
|
8010
|
-
|
|
8011
|
-
|
|
8012
|
-
|
|
8013
|
-
|
|
8014
|
-
|
|
8015
|
-
* @returns The encoded contract call.
|
|
8016
|
-
*/
|
|
8017
|
-
static encodeApprove(token, to, amount) {
|
|
8018
|
-
return {
|
|
8019
|
-
address: token,
|
|
8020
|
-
value: 0n,
|
|
8021
|
-
data: encodeFunctionData({
|
|
8022
|
-
abi: erc20Abi$1,
|
|
8023
|
-
functionName: "approve",
|
|
8024
|
-
args: [to, amount]
|
|
8025
|
-
})
|
|
7894
|
+
async setConnection(senderAddress, connection) {
|
|
7895
|
+
const msg = {
|
|
7896
|
+
set_connection: {
|
|
7897
|
+
connection
|
|
7898
|
+
}
|
|
8026
7899
|
};
|
|
7900
|
+
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8027
7901
|
}
|
|
8028
|
-
|
|
8029
|
-
|
|
8030
|
-
|
|
8031
|
-
|
|
8032
|
-
|
|
8033
|
-
* Fetches token information for a specific token in the vault.
|
|
8034
|
-
* @param vault - The address of the vault.
|
|
8035
|
-
* @param token - The address of the token.
|
|
8036
|
-
* @param publicClient - PublicClient<HttpTransport>
|
|
8037
|
-
* @returns Token information as a TokenInfo object.
|
|
8038
|
-
*/
|
|
8039
|
-
static async getTokenInfo(vault, token, publicClient) {
|
|
8040
|
-
const [decimals, depositFee, withdrawalFee, maxDeposit, isSupported] = await publicClient.readContract({
|
|
8041
|
-
address: vault,
|
|
8042
|
-
abi: vaultTokenAbi,
|
|
8043
|
-
functionName: "tokenInfo",
|
|
8044
|
-
args: [token]
|
|
8045
|
-
});
|
|
8046
|
-
return { decimals, depositFee, withdrawalFee, maxDeposit, isSupported };
|
|
8047
|
-
}
|
|
8048
|
-
/**
|
|
8049
|
-
* Retrieves the reserves of the vault.
|
|
8050
|
-
* @param vault - The address of the vault.
|
|
8051
|
-
* @param publicClient - PublicClient<HttpTransport>
|
|
8052
|
-
* @returns An object containing tokens and their balances.
|
|
8053
|
-
*/
|
|
8054
|
-
static async getVaultReserves(vault, publicClient) {
|
|
8055
|
-
const [tokens, balances] = await publicClient.readContract({
|
|
8056
|
-
address: vault,
|
|
8057
|
-
abi: vaultTokenAbi,
|
|
8058
|
-
functionName: "getVaultReserves",
|
|
8059
|
-
args: []
|
|
8060
|
-
});
|
|
8061
|
-
return {
|
|
8062
|
-
tokens,
|
|
8063
|
-
balances
|
|
7902
|
+
async setOwner(senderAddress, owner) {
|
|
7903
|
+
const msg = {
|
|
7904
|
+
set_owner: {
|
|
7905
|
+
owner
|
|
7906
|
+
}
|
|
8064
7907
|
};
|
|
7908
|
+
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8065
7909
|
}
|
|
8066
|
-
|
|
8067
|
-
|
|
8068
|
-
|
|
8069
|
-
|
|
8070
|
-
|
|
8071
|
-
|
|
8072
|
-
|
|
8073
|
-
const [tokens, infos, reserves] = await publicClient.readContract({
|
|
8074
|
-
address: vault,
|
|
8075
|
-
abi: vaultTokenAbi,
|
|
8076
|
-
functionName: "getAllTokenInfo",
|
|
8077
|
-
args: []
|
|
8078
|
-
});
|
|
8079
|
-
return {
|
|
8080
|
-
tokens,
|
|
8081
|
-
infos,
|
|
8082
|
-
reserves
|
|
7910
|
+
async send_message(sender, dst_chain_id, dst_address, payload, raw) {
|
|
7911
|
+
const msg = {
|
|
7912
|
+
send_message: {
|
|
7913
|
+
dst_chain_id: Number.parseInt(dst_chain_id),
|
|
7914
|
+
dst_address: Array.from(fromHex(dst_address, "bytes")),
|
|
7915
|
+
payload: Array.from(fromHex(payload, "bytes"))
|
|
7916
|
+
}
|
|
8083
7917
|
};
|
|
7918
|
+
if (raw) {
|
|
7919
|
+
return await this.walletProvider.getRawTransaction(
|
|
7920
|
+
this.chainConfig.networkId,
|
|
7921
|
+
this.chainConfig.prefix,
|
|
7922
|
+
sender,
|
|
7923
|
+
this.chainConfig.addresses.connection,
|
|
7924
|
+
msg
|
|
7925
|
+
);
|
|
7926
|
+
}
|
|
7927
|
+
const res = await this.walletProvider.execute(sender, this.chainConfig.addresses.connection, msg);
|
|
7928
|
+
return res.transactionHash;
|
|
8084
7929
|
}
|
|
8085
|
-
|
|
8086
|
-
|
|
8087
|
-
|
|
8088
|
-
* @param token - The address of the token to deposit.
|
|
8089
|
-
* @param amount - The amount of the token to deposit.
|
|
8090
|
-
* @param walletProvider - IEvmWalletProvider
|
|
8091
|
-
* @returns Transaction hash
|
|
8092
|
-
*/
|
|
8093
|
-
static async deposit(vault, token, amount, walletProvider) {
|
|
8094
|
-
const from = await walletProvider.getWalletAddress();
|
|
8095
|
-
return walletProvider.sendTransaction({
|
|
8096
|
-
from,
|
|
8097
|
-
to: vault,
|
|
8098
|
-
value: 0n,
|
|
8099
|
-
data: encodeFunctionData({
|
|
8100
|
-
abi: vaultTokenAbi,
|
|
8101
|
-
functionName: "deposit",
|
|
8102
|
-
args: [token, amount]
|
|
8103
|
-
})
|
|
8104
|
-
});
|
|
8105
|
-
}
|
|
8106
|
-
/**
|
|
8107
|
-
* Withdraws a specified amount of a token from the vault.
|
|
8108
|
-
* @param vault - The address of the vault.
|
|
8109
|
-
* @param token - The address of the token to withdraw.
|
|
8110
|
-
* @param amount - The amount of the token to withdraw.
|
|
8111
|
-
* @param provider - EvmWalletProvider
|
|
8112
|
-
* @returns Transaction hash
|
|
8113
|
-
*/
|
|
8114
|
-
static async withdraw(vault, token, amount, provider) {
|
|
8115
|
-
const from = await provider.getWalletAddress();
|
|
8116
|
-
return provider.sendTransaction({
|
|
8117
|
-
from,
|
|
8118
|
-
to: vault,
|
|
8119
|
-
value: 0n,
|
|
8120
|
-
data: encodeFunctionData({
|
|
8121
|
-
abi: vaultTokenAbi,
|
|
8122
|
-
functionName: "withdraw",
|
|
8123
|
-
args: [token, amount]
|
|
8124
|
-
})
|
|
8125
|
-
});
|
|
8126
|
-
}
|
|
8127
|
-
/**
|
|
8128
|
-
* Encodes the deposit transaction data for the vault.
|
|
8129
|
-
* @param vault - The address of the vault.
|
|
8130
|
-
* @param token - The address of the token to deposit.
|
|
8131
|
-
* @param amount - The amount of the token to deposit.
|
|
8132
|
-
* @returns The encoded contract call data.
|
|
8133
|
-
*/
|
|
8134
|
-
static encodeDeposit(vault, token, amount) {
|
|
8135
|
-
return {
|
|
8136
|
-
address: vault,
|
|
8137
|
-
value: 0n,
|
|
8138
|
-
data: encodeFunctionData({
|
|
8139
|
-
abi: vaultTokenAbi,
|
|
8140
|
-
functionName: "deposit",
|
|
8141
|
-
args: [token, amount]
|
|
8142
|
-
})
|
|
8143
|
-
};
|
|
7930
|
+
// Helper Methods
|
|
7931
|
+
static stringToUint8Array(str) {
|
|
7932
|
+
return new TextEncoder().encode(str);
|
|
8144
7933
|
}
|
|
8145
|
-
|
|
8146
|
-
|
|
8147
|
-
* @param vault - The address of the vault.
|
|
8148
|
-
* @param token - The address of the token to withdraw.
|
|
8149
|
-
* @param amount - The amount of the token to withdraw.
|
|
8150
|
-
* @returns The encoded contract call data.
|
|
8151
|
-
*/
|
|
8152
|
-
static encodeWithdraw(vault, token, amount) {
|
|
8153
|
-
return {
|
|
8154
|
-
address: vault,
|
|
8155
|
-
value: 0n,
|
|
8156
|
-
data: encodeFunctionData({
|
|
8157
|
-
abi: vaultTokenAbi,
|
|
8158
|
-
functionName: "withdraw",
|
|
8159
|
-
args: [token, amount]
|
|
8160
|
-
})
|
|
8161
|
-
};
|
|
7934
|
+
static uint8ArrayToString(arr) {
|
|
7935
|
+
return new TextDecoder().decode(arr);
|
|
8162
7936
|
}
|
|
8163
|
-
|
|
8164
|
-
|
|
8165
|
-
* @param decimals - The number of decimals of the token
|
|
8166
|
-
* @param amount - The amount to translate
|
|
8167
|
-
* @returns The translated amount
|
|
8168
|
-
*/
|
|
8169
|
-
static translateIncomingDecimals(decimals, amount) {
|
|
8170
|
-
if (decimals <= 18) {
|
|
8171
|
-
return amount * BigInt(10 ** (18 - decimals));
|
|
8172
|
-
}
|
|
8173
|
-
return amount / BigInt(10 ** (decimals - 18));
|
|
7937
|
+
static toBigIntString(num) {
|
|
7938
|
+
return num.toString();
|
|
8174
7939
|
}
|
|
8175
|
-
|
|
8176
|
-
|
|
8177
|
-
|
|
8178
|
-
|
|
8179
|
-
|
|
8180
|
-
|
|
8181
|
-
|
|
8182
|
-
|
|
8183
|
-
|
|
8184
|
-
|
|
8185
|
-
|
|
7940
|
+
};
|
|
7941
|
+
var IconSdk = "default" in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw;
|
|
7942
|
+
var IconSpokeProvider = class {
|
|
7943
|
+
walletProvider;
|
|
7944
|
+
chainConfig;
|
|
7945
|
+
iconService;
|
|
7946
|
+
debugRpcUrl;
|
|
7947
|
+
constructor(walletProvider, chainConfig, rpcUrl = "https://ctz.solidwallet.io/api/v3", debugRpcUrl = "https://ctz.solidwallet.io/api/v3d") {
|
|
7948
|
+
this.walletProvider = walletProvider;
|
|
7949
|
+
this.chainConfig = chainConfig;
|
|
7950
|
+
this.iconService = new IconSdk.IconService(new IconSdk.IconService.HttpProvider(rpcUrl));
|
|
7951
|
+
this.debugRpcUrl = debugRpcUrl;
|
|
8186
7952
|
}
|
|
8187
7953
|
};
|
|
8188
7954
|
|
|
8189
|
-
// src/
|
|
8190
|
-
|
|
8191
|
-
|
|
7955
|
+
// src/entities/icon/utils.ts
|
|
7956
|
+
function getIconAddressBytes(address) {
|
|
7957
|
+
return `0x${Buffer.from(address.replace("cx", "01").replace("hx", "00") ?? "f8", "hex").toString("hex")}`;
|
|
7958
|
+
}
|
|
7959
|
+
|
|
7960
|
+
// src/entities/Providers.ts
|
|
7961
|
+
var EvmHubProvider = class {
|
|
7962
|
+
publicClient;
|
|
7963
|
+
chainConfig;
|
|
7964
|
+
constructor(config) {
|
|
7965
|
+
if (config) {
|
|
7966
|
+
this.publicClient = createPublicClient({
|
|
7967
|
+
transport: http(config.hubRpcUrl),
|
|
7968
|
+
chain: getEvmViemChain(config.chainConfig.chain.id)
|
|
7969
|
+
});
|
|
7970
|
+
this.chainConfig = config.chainConfig;
|
|
7971
|
+
} else {
|
|
7972
|
+
this.publicClient = createPublicClient({
|
|
7973
|
+
transport: http("https://rpc.soniclabs.com"),
|
|
7974
|
+
chain: getEvmViemChain(SONIC_MAINNET_CHAIN_ID)
|
|
7975
|
+
});
|
|
7976
|
+
this.chainConfig = getHubChainConfig(SONIC_MAINNET_CHAIN_ID);
|
|
7977
|
+
}
|
|
8192
7978
|
}
|
|
8193
|
-
|
|
8194
|
-
|
|
8195
|
-
|
|
8196
|
-
|
|
8197
|
-
|
|
8198
|
-
|
|
8199
|
-
|
|
8200
|
-
|
|
8201
|
-
|
|
8202
|
-
|
|
8203
|
-
|
|
8204
|
-
|
|
8205
|
-
|
|
8206
|
-
}
|
|
8207
|
-
|
|
8208
|
-
|
|
8209
|
-
|
|
8210
|
-
|
|
8211
|
-
}
|
|
8212
|
-
/**
|
|
8213
|
-
* Encodes a transfer transaction for an asset.
|
|
8214
|
-
* @param token - The address of the token.
|
|
8215
|
-
* @param to - The address to transfer the token to.
|
|
8216
|
-
* @param amount - The amount of the token to transfer.
|
|
8217
|
-
* @param assetManager
|
|
8218
|
-
* @returns The encoded contract call.
|
|
8219
|
-
*/
|
|
8220
|
-
static encodeTransfer(token, to, amount, assetManager) {
|
|
8221
|
-
return {
|
|
8222
|
-
address: assetManager,
|
|
8223
|
-
value: 0n,
|
|
8224
|
-
data: encodeFunctionData({
|
|
8225
|
-
abi: assetManagerAbi,
|
|
8226
|
-
functionName: "transfer",
|
|
8227
|
-
args: [token, to, amount, "0x"]
|
|
8228
|
-
})
|
|
8229
|
-
};
|
|
8230
|
-
}
|
|
8231
|
-
/**
|
|
8232
|
-
* Constructs the data for depositing tokens to the spoke chain.
|
|
8233
|
-
* @param {EvmDepositToDataParams} params - The address of the token to deposit.
|
|
8234
|
-
* @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.
|
|
8235
|
-
* @returns {Hex} Encoded contract calls for the deposit transaction.
|
|
8236
|
-
* @throws Will throw an error if the asset or vault address is not found.
|
|
8237
|
-
*/
|
|
8238
|
-
static depositToData(params, spokeChainId) {
|
|
8239
|
-
const calls = [];
|
|
8240
|
-
const assetConfig = getHubAssetInfo(spokeChainId, params.token);
|
|
8241
|
-
if (!assetConfig) {
|
|
8242
|
-
throw new Error("[depositToData] Hub asset not found");
|
|
7979
|
+
};
|
|
7980
|
+
var SonicSpokeProvider = class {
|
|
7981
|
+
walletProvider;
|
|
7982
|
+
chainConfig;
|
|
7983
|
+
publicClient;
|
|
7984
|
+
constructor(walletProvider, chainConfig, rpcUrl) {
|
|
7985
|
+
this.walletProvider = walletProvider;
|
|
7986
|
+
this.chainConfig = chainConfig;
|
|
7987
|
+
if (rpcUrl) {
|
|
7988
|
+
this.publicClient = createPublicClient({
|
|
7989
|
+
transport: http(rpcUrl),
|
|
7990
|
+
chain: getEvmViemChain(chainConfig.chain.id)
|
|
7991
|
+
});
|
|
7992
|
+
} else {
|
|
7993
|
+
this.publicClient = createPublicClient({
|
|
7994
|
+
transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),
|
|
7995
|
+
chain: getEvmViemChain(chainConfig.chain.id)
|
|
7996
|
+
});
|
|
8243
7997
|
}
|
|
8244
|
-
const assetAddress = assetConfig.asset;
|
|
8245
|
-
const vaultAddress = assetConfig.vault;
|
|
8246
|
-
calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, params.amount));
|
|
8247
|
-
calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, params.amount));
|
|
8248
|
-
const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, params.amount);
|
|
8249
|
-
calls.push(Erc20Service.encodeTransfer(vaultAddress, params.to, translatedAmount));
|
|
8250
|
-
return encodeContractCalls(calls);
|
|
8251
7998
|
}
|
|
8252
|
-
|
|
8253
|
-
|
|
8254
|
-
|
|
8255
|
-
|
|
8256
|
-
|
|
8257
|
-
|
|
8258
|
-
|
|
8259
|
-
|
|
8260
|
-
|
|
8261
|
-
|
|
8262
|
-
|
|
8263
|
-
|
|
8264
|
-
|
|
7999
|
+
};
|
|
8000
|
+
var EvmSpokeProvider = class {
|
|
8001
|
+
walletProvider;
|
|
8002
|
+
chainConfig;
|
|
8003
|
+
publicClient;
|
|
8004
|
+
constructor(walletProvider, chainConfig, rpcUrl) {
|
|
8005
|
+
this.walletProvider = walletProvider;
|
|
8006
|
+
this.chainConfig = chainConfig;
|
|
8007
|
+
if (rpcUrl) {
|
|
8008
|
+
this.publicClient = createPublicClient({
|
|
8009
|
+
transport: http(rpcUrl),
|
|
8010
|
+
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8011
|
+
});
|
|
8012
|
+
} else {
|
|
8013
|
+
this.publicClient = createPublicClient({
|
|
8014
|
+
transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),
|
|
8015
|
+
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8016
|
+
});
|
|
8265
8017
|
}
|
|
8266
|
-
const assetAddress = assetConfig.asset;
|
|
8267
|
-
calls.push(
|
|
8268
|
-
_EvmAssetManagerService.encodeTransfer(
|
|
8269
|
-
assetAddress,
|
|
8270
|
-
params.to,
|
|
8271
|
-
params.amount,
|
|
8272
|
-
hubProvider.chainConfig.addresses.assetManager
|
|
8273
|
-
)
|
|
8274
|
-
);
|
|
8275
|
-
return encodeContractCalls(calls);
|
|
8276
|
-
}
|
|
8277
|
-
/**
|
|
8278
|
-
* Get asset address for a given chain ID and spoke address
|
|
8279
|
-
* @param chainId Chain ID where the asset exists
|
|
8280
|
-
* @param spokeAddress Address of the asset on the spoke chain
|
|
8281
|
-
* @param assetManager Address of the asset manager contract
|
|
8282
|
-
* @param client The Viem public client
|
|
8283
|
-
* @returns The asset's address on the hub chain
|
|
8284
|
-
*/
|
|
8285
|
-
async getAssetAddress(chainId, spokeAddress, assetManager, client) {
|
|
8286
|
-
return client.readContract({
|
|
8287
|
-
address: assetManager,
|
|
8288
|
-
abi: assetManagerAbi,
|
|
8289
|
-
functionName: "assets",
|
|
8290
|
-
args: [chainId, spokeAddress]
|
|
8291
|
-
});
|
|
8292
8018
|
}
|
|
8293
8019
|
};
|
|
8294
|
-
|
|
8295
|
-
|
|
8296
|
-
|
|
8297
|
-
|
|
8020
|
+
var CustomStellarAccount = class {
|
|
8021
|
+
accountId;
|
|
8022
|
+
sequenceNumber;
|
|
8023
|
+
startingSequenceNumber;
|
|
8024
|
+
constructor({ account_id, sequence }) {
|
|
8025
|
+
this.accountId = account_id;
|
|
8026
|
+
this.sequenceNumber = BigInt(sequence);
|
|
8027
|
+
this.startingSequenceNumber = BigInt(sequence);
|
|
8298
8028
|
}
|
|
8299
|
-
|
|
8300
|
-
|
|
8301
|
-
* @param chainId - The spoke chain ID.
|
|
8302
|
-
* @param address - The address on the spoke chain.
|
|
8303
|
-
* @param hubProvider - The hub provider.
|
|
8304
|
-
* @returns The hub wallet address.
|
|
8305
|
-
*/
|
|
8306
|
-
static async getUserHubWalletAddress(chainId, address, hubProvider) {
|
|
8307
|
-
return hubProvider.publicClient.readContract({
|
|
8308
|
-
address: hubProvider.chainConfig.addresses.hubWallet,
|
|
8309
|
-
abi: walletFactoryAbi,
|
|
8310
|
-
functionName: "getDeployedAddress",
|
|
8311
|
-
args: [BigInt(getIntentRelayChainId(chainId)), address]
|
|
8312
|
-
});
|
|
8029
|
+
getSequenceNumber() {
|
|
8030
|
+
return this.sequenceNumber;
|
|
8313
8031
|
}
|
|
8314
|
-
|
|
8315
|
-
|
|
8316
|
-
walletProvider;
|
|
8317
|
-
chainConfig;
|
|
8318
|
-
chainGrpcWasmApi;
|
|
8319
|
-
txClient;
|
|
8320
|
-
constructor(conf, walletProvider) {
|
|
8321
|
-
this.chainConfig = conf;
|
|
8322
|
-
this.walletProvider = walletProvider;
|
|
8323
|
-
const endpoints = getNetworkEndpoints(Network.Mainnet);
|
|
8324
|
-
this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);
|
|
8325
|
-
this.txClient = new TxGrpcApi(endpoints.grpc);
|
|
8032
|
+
getStartingSequenceNumber() {
|
|
8033
|
+
return this.startingSequenceNumber;
|
|
8326
8034
|
}
|
|
8327
|
-
|
|
8328
|
-
|
|
8329
|
-
return this.chainGrpcWasmApi.fetchSmartContractState(
|
|
8330
|
-
this.chainConfig.addresses.assetManager,
|
|
8331
|
-
toBase64({
|
|
8332
|
-
get_state: {}
|
|
8333
|
-
})
|
|
8334
|
-
);
|
|
8035
|
+
getAccountId() {
|
|
8036
|
+
return this.accountId;
|
|
8335
8037
|
}
|
|
8336
|
-
|
|
8337
|
-
return this.
|
|
8338
|
-
this.chainConfig.addresses.assetManager,
|
|
8339
|
-
toBase64({
|
|
8340
|
-
get_balance: { denom: token }
|
|
8341
|
-
})
|
|
8342
|
-
);
|
|
8038
|
+
getAccountClone() {
|
|
8039
|
+
return new Account(this.accountId, this.sequenceNumber.toString());
|
|
8343
8040
|
}
|
|
8344
|
-
|
|
8345
|
-
|
|
8346
|
-
|
|
8347
|
-
|
|
8348
|
-
|
|
8349
|
-
|
|
8350
|
-
const dataBytes = fromHex(data, "bytes");
|
|
8351
|
-
const msg = {
|
|
8352
|
-
transfer: {
|
|
8353
|
-
token: token_address,
|
|
8354
|
-
to: Array.from(toBytes),
|
|
8355
|
-
amount,
|
|
8356
|
-
data: Array.from(dataBytes)
|
|
8357
|
-
}
|
|
8358
|
-
};
|
|
8359
|
-
const funds = [{ amount, denom: token_address }];
|
|
8360
|
-
if (raw) {
|
|
8361
|
-
return await spokeProvider.walletProvider.getRawTransaction(
|
|
8362
|
-
spokeProvider.chainConfig.networkId,
|
|
8363
|
-
spokeProvider.chainConfig.prefix,
|
|
8364
|
-
sender,
|
|
8365
|
-
spokeProvider.chainConfig.addresses.assetManager,
|
|
8366
|
-
msg
|
|
8367
|
-
);
|
|
8041
|
+
incrementSequenceNumber() {
|
|
8042
|
+
this.sequenceNumber++;
|
|
8043
|
+
}
|
|
8044
|
+
decrementSequenceNumber() {
|
|
8045
|
+
if (this.sequenceNumber > this.startingSequenceNumber) {
|
|
8046
|
+
this.sequenceNumber--;
|
|
8368
8047
|
}
|
|
8369
|
-
|
|
8370
|
-
|
|
8371
|
-
spokeProvider.chainConfig.addresses.assetManager,
|
|
8372
|
-
msg,
|
|
8373
|
-
funds
|
|
8048
|
+
throw new Error(
|
|
8049
|
+
`Sequence number cannot be decremented below the starting sequence number: ${this.startingSequenceNumber}`
|
|
8374
8050
|
);
|
|
8375
|
-
return res.transactionHash;
|
|
8376
8051
|
}
|
|
8377
|
-
|
|
8378
|
-
|
|
8379
|
-
recv_message: {
|
|
8380
|
-
src_chain_id: srcChainId,
|
|
8381
|
-
src_address: srcAddress,
|
|
8382
|
-
conn_sn: connSn,
|
|
8383
|
-
payload,
|
|
8384
|
-
signatures
|
|
8385
|
-
}
|
|
8386
|
-
};
|
|
8387
|
-
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8052
|
+
resetSequenceNumber() {
|
|
8053
|
+
this.sequenceNumber = this.startingSequenceNumber;
|
|
8388
8054
|
}
|
|
8389
|
-
|
|
8390
|
-
|
|
8391
|
-
|
|
8392
|
-
|
|
8393
|
-
|
|
8394
|
-
|
|
8395
|
-
|
|
8396
|
-
|
|
8397
|
-
async setConnection(senderAddress, connection) {
|
|
8398
|
-
const msg = {
|
|
8399
|
-
set_connection: {
|
|
8400
|
-
connection
|
|
8401
|
-
}
|
|
8402
|
-
};
|
|
8403
|
-
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8404
|
-
}
|
|
8405
|
-
async setOwner(senderAddress, owner) {
|
|
8406
|
-
const msg = {
|
|
8407
|
-
set_owner: {
|
|
8408
|
-
owner
|
|
8409
|
-
}
|
|
8410
|
-
};
|
|
8411
|
-
return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);
|
|
8412
|
-
}
|
|
8413
|
-
async send_message(sender, dst_chain_id, dst_address, payload, raw) {
|
|
8414
|
-
const msg = {
|
|
8415
|
-
send_message: {
|
|
8416
|
-
dst_chain_id: Number.parseInt(dst_chain_id),
|
|
8417
|
-
dst_address: Array.from(fromHex(dst_address, "bytes")),
|
|
8418
|
-
payload: Array.from(fromHex(payload, "bytes"))
|
|
8419
|
-
}
|
|
8420
|
-
};
|
|
8421
|
-
if (raw) {
|
|
8422
|
-
return await this.walletProvider.getRawTransaction(
|
|
8423
|
-
this.chainConfig.networkId,
|
|
8424
|
-
this.chainConfig.prefix,
|
|
8425
|
-
sender,
|
|
8426
|
-
this.chainConfig.addresses.connection,
|
|
8427
|
-
msg
|
|
8428
|
-
);
|
|
8429
|
-
}
|
|
8430
|
-
const res = await this.walletProvider.execute(sender, this.chainConfig.addresses.connection, msg);
|
|
8431
|
-
return res.transactionHash;
|
|
8432
|
-
}
|
|
8433
|
-
// Helper Methods
|
|
8434
|
-
static stringToUint8Array(str) {
|
|
8435
|
-
return new TextEncoder().encode(str);
|
|
8436
|
-
}
|
|
8437
|
-
static uint8ArrayToString(arr) {
|
|
8438
|
-
return new TextDecoder().decode(arr);
|
|
8439
|
-
}
|
|
8440
|
-
static toBigIntString(num) {
|
|
8441
|
-
return num.toString();
|
|
8442
|
-
}
|
|
8443
|
-
};
|
|
8444
|
-
var IconSdk = "default" in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw;
|
|
8445
|
-
var IconSpokeProvider = class {
|
|
8446
|
-
walletProvider;
|
|
8447
|
-
chainConfig;
|
|
8448
|
-
iconService;
|
|
8449
|
-
debugRpcUrl;
|
|
8450
|
-
constructor(walletProvider, chainConfig, rpcUrl = "https://ctz.solidwallet.io/api/v3", debugRpcUrl = "https://ctz.solidwallet.io/api/v3d") {
|
|
8451
|
-
this.walletProvider = walletProvider;
|
|
8452
|
-
this.chainConfig = chainConfig;
|
|
8453
|
-
this.iconService = new IconSdk.IconService(new IconSdk.IconService.HttpProvider(rpcUrl));
|
|
8454
|
-
this.debugRpcUrl = debugRpcUrl;
|
|
8455
|
-
}
|
|
8456
|
-
};
|
|
8457
|
-
|
|
8458
|
-
// src/entities/icon/utils.ts
|
|
8459
|
-
function getIconAddressBytes(address) {
|
|
8460
|
-
return `0x${Buffer.from(address.replace("cx", "01").replace("hx", "00") ?? "f8", "hex").toString("hex")}`;
|
|
8461
|
-
}
|
|
8462
|
-
|
|
8463
|
-
// src/entities/Providers.ts
|
|
8464
|
-
var EvmHubProvider = class {
|
|
8465
|
-
publicClient;
|
|
8466
|
-
chainConfig;
|
|
8467
|
-
constructor(config) {
|
|
8468
|
-
if (config) {
|
|
8469
|
-
this.publicClient = createPublicClient({
|
|
8470
|
-
transport: http(config.hubRpcUrl),
|
|
8471
|
-
chain: getEvmViemChain(config.chainConfig.chain.id)
|
|
8472
|
-
});
|
|
8473
|
-
this.chainConfig = config.chainConfig;
|
|
8474
|
-
} else {
|
|
8475
|
-
this.publicClient = createPublicClient({
|
|
8476
|
-
transport: http("https://rpc.soniclabs.com"),
|
|
8477
|
-
chain: getEvmViemChain(SONIC_MAINNET_CHAIN_ID)
|
|
8478
|
-
});
|
|
8479
|
-
this.chainConfig = getHubChainConfig(SONIC_MAINNET_CHAIN_ID);
|
|
8480
|
-
}
|
|
8481
|
-
}
|
|
8482
|
-
};
|
|
8483
|
-
var SonicSpokeProvider = class {
|
|
8484
|
-
walletProvider;
|
|
8485
|
-
chainConfig;
|
|
8486
|
-
publicClient;
|
|
8487
|
-
constructor(walletProvider, chainConfig, rpcUrl) {
|
|
8488
|
-
this.walletProvider = walletProvider;
|
|
8489
|
-
this.chainConfig = chainConfig;
|
|
8490
|
-
if (rpcUrl) {
|
|
8491
|
-
this.publicClient = createPublicClient({
|
|
8492
|
-
transport: http(rpcUrl),
|
|
8493
|
-
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8494
|
-
});
|
|
8495
|
-
} else {
|
|
8496
|
-
this.publicClient = createPublicClient({
|
|
8497
|
-
transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),
|
|
8498
|
-
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8499
|
-
});
|
|
8500
|
-
}
|
|
8501
|
-
}
|
|
8502
|
-
};
|
|
8503
|
-
var EvmSpokeProvider = class {
|
|
8504
|
-
walletProvider;
|
|
8505
|
-
chainConfig;
|
|
8506
|
-
publicClient;
|
|
8507
|
-
constructor(walletProvider, chainConfig, rpcUrl) {
|
|
8508
|
-
this.walletProvider = walletProvider;
|
|
8509
|
-
this.chainConfig = chainConfig;
|
|
8510
|
-
if (rpcUrl) {
|
|
8511
|
-
this.publicClient = createPublicClient({
|
|
8512
|
-
transport: http(rpcUrl),
|
|
8513
|
-
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8514
|
-
});
|
|
8515
|
-
} else {
|
|
8516
|
-
this.publicClient = createPublicClient({
|
|
8517
|
-
transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),
|
|
8518
|
-
chain: getEvmViemChain(chainConfig.chain.id)
|
|
8519
|
-
});
|
|
8520
|
-
}
|
|
8521
|
-
}
|
|
8522
|
-
};
|
|
8523
|
-
var CustomStellarAccount = class {
|
|
8524
|
-
accountId;
|
|
8525
|
-
sequenceNumber;
|
|
8526
|
-
startingSequenceNumber;
|
|
8527
|
-
constructor({ account_id, sequence }) {
|
|
8528
|
-
this.accountId = account_id;
|
|
8529
|
-
this.sequenceNumber = BigInt(sequence);
|
|
8530
|
-
this.startingSequenceNumber = BigInt(sequence);
|
|
8531
|
-
}
|
|
8532
|
-
getSequenceNumber() {
|
|
8533
|
-
return this.sequenceNumber;
|
|
8534
|
-
}
|
|
8535
|
-
getStartingSequenceNumber() {
|
|
8536
|
-
return this.startingSequenceNumber;
|
|
8537
|
-
}
|
|
8538
|
-
getAccountId() {
|
|
8539
|
-
return this.accountId;
|
|
8540
|
-
}
|
|
8541
|
-
getAccountClone() {
|
|
8542
|
-
return new Account(this.accountId, this.sequenceNumber.toString());
|
|
8543
|
-
}
|
|
8544
|
-
incrementSequenceNumber() {
|
|
8545
|
-
this.sequenceNumber++;
|
|
8546
|
-
}
|
|
8547
|
-
decrementSequenceNumber() {
|
|
8548
|
-
if (this.sequenceNumber > this.startingSequenceNumber) {
|
|
8549
|
-
this.sequenceNumber--;
|
|
8550
|
-
}
|
|
8551
|
-
throw new Error(
|
|
8552
|
-
`Sequence number cannot be decremented below the starting sequence number: ${this.startingSequenceNumber}`
|
|
8553
|
-
);
|
|
8554
|
-
}
|
|
8555
|
-
resetSequenceNumber() {
|
|
8556
|
-
this.sequenceNumber = this.startingSequenceNumber;
|
|
8557
|
-
}
|
|
8558
|
-
};
|
|
8559
|
-
var CustomSorobanServer = class extends SorobanRpc.Server {
|
|
8560
|
-
customHeaders;
|
|
8561
|
-
constructor(serverUrl, customHeaders) {
|
|
8562
|
-
super(serverUrl, {
|
|
8563
|
-
allowHttp: true
|
|
8564
|
-
});
|
|
8565
|
-
this.customHeaders = customHeaders;
|
|
8055
|
+
};
|
|
8056
|
+
var CustomSorobanServer = class extends SorobanRpc.Server {
|
|
8057
|
+
customHeaders;
|
|
8058
|
+
constructor(serverUrl, customHeaders) {
|
|
8059
|
+
super(serverUrl, {
|
|
8060
|
+
allowHttp: true
|
|
8061
|
+
});
|
|
8062
|
+
this.customHeaders = customHeaders;
|
|
8566
8063
|
}
|
|
8567
8064
|
async getNetwork() {
|
|
8568
8065
|
const requestOptions = {
|
|
@@ -9150,8 +8647,411 @@ function requestJsonRpc(rawTransaction, id = 99999) {
|
|
|
9150
8647
|
}
|
|
9151
8648
|
})
|
|
9152
8649
|
);
|
|
9153
|
-
});
|
|
9154
|
-
}
|
|
8650
|
+
});
|
|
8651
|
+
}
|
|
8652
|
+
var Erc20Service = class {
|
|
8653
|
+
constructor() {
|
|
8654
|
+
}
|
|
8655
|
+
/**
|
|
8656
|
+
* Check if spender has enough ERC20 allowance for given amount
|
|
8657
|
+
* @param token - ERC20 token address
|
|
8658
|
+
* @param amount - Amount to check allowance for
|
|
8659
|
+
* @param owner - User wallet address
|
|
8660
|
+
* @param spender - Spender address
|
|
8661
|
+
* @param spokeProvider - EVM Spoke provider
|
|
8662
|
+
* @return - True if spender is allowed to spend amount on behalf of owner
|
|
8663
|
+
*/
|
|
8664
|
+
static async isAllowanceValid(token, amount, owner, spender, spokeProvider) {
|
|
8665
|
+
try {
|
|
8666
|
+
if (token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase()) {
|
|
8667
|
+
return {
|
|
8668
|
+
ok: true,
|
|
8669
|
+
value: true
|
|
8670
|
+
};
|
|
8671
|
+
}
|
|
8672
|
+
const allowedAmount = await spokeProvider.publicClient.readContract({
|
|
8673
|
+
address: token,
|
|
8674
|
+
abi: erc20Abi$1,
|
|
8675
|
+
functionName: "allowance",
|
|
8676
|
+
args: [owner, spender]
|
|
8677
|
+
});
|
|
8678
|
+
return {
|
|
8679
|
+
ok: true,
|
|
8680
|
+
value: allowedAmount >= amount
|
|
8681
|
+
};
|
|
8682
|
+
} catch (e) {
|
|
8683
|
+
return {
|
|
8684
|
+
ok: false,
|
|
8685
|
+
error: e
|
|
8686
|
+
};
|
|
8687
|
+
}
|
|
8688
|
+
}
|
|
8689
|
+
/**
|
|
8690
|
+
* Approve ERC20 amount spending
|
|
8691
|
+
* @param token - ERC20 token address
|
|
8692
|
+
* @param amount - Amount to approve
|
|
8693
|
+
* @param spender - Spender address
|
|
8694
|
+
* @param provider - EVM Provider
|
|
8695
|
+
*/
|
|
8696
|
+
static async approve(token, amount, spender, spokeProvider, raw) {
|
|
8697
|
+
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
8698
|
+
const rawTx = {
|
|
8699
|
+
from: walletAddress,
|
|
8700
|
+
to: token,
|
|
8701
|
+
value: 0n,
|
|
8702
|
+
data: encodeFunctionData({
|
|
8703
|
+
abi: erc20Abi$1,
|
|
8704
|
+
functionName: "approve",
|
|
8705
|
+
args: [spender, amount]
|
|
8706
|
+
})
|
|
8707
|
+
};
|
|
8708
|
+
if (raw) {
|
|
8709
|
+
return rawTx;
|
|
8710
|
+
}
|
|
8711
|
+
return spokeProvider.walletProvider.sendTransaction(rawTx);
|
|
8712
|
+
}
|
|
8713
|
+
/**
|
|
8714
|
+
* Encodes a transfer transaction for a token.
|
|
8715
|
+
* @param token - The address of the token.
|
|
8716
|
+
* @param to - The address to transfer the token to.
|
|
8717
|
+
* @param amount - The amount of the token to transfer.
|
|
8718
|
+
* @returns The encoded contract call.
|
|
8719
|
+
*/
|
|
8720
|
+
static encodeTransfer(token, to, amount) {
|
|
8721
|
+
return {
|
|
8722
|
+
address: token,
|
|
8723
|
+
value: 0n,
|
|
8724
|
+
data: encodeFunctionData({
|
|
8725
|
+
abi: erc20Abi$1,
|
|
8726
|
+
functionName: "transfer",
|
|
8727
|
+
args: [to, amount]
|
|
8728
|
+
})
|
|
8729
|
+
};
|
|
8730
|
+
}
|
|
8731
|
+
/**
|
|
8732
|
+
* Encodes a transferFrom transaction for a token.
|
|
8733
|
+
* @param token - The address of the token.
|
|
8734
|
+
* @param from - The address to transfer the token from.
|
|
8735
|
+
* @param to - The address to transfer the token to.
|
|
8736
|
+
* @param amount - The amount of the token to transfer.
|
|
8737
|
+
* @returns The encoded contract call.
|
|
8738
|
+
*/
|
|
8739
|
+
static encodeTransferFrom(token, from, to, amount) {
|
|
8740
|
+
return {
|
|
8741
|
+
address: token,
|
|
8742
|
+
value: 0n,
|
|
8743
|
+
data: encodeFunctionData({
|
|
8744
|
+
abi: erc20Abi$1,
|
|
8745
|
+
functionName: "transferFrom",
|
|
8746
|
+
args: [from, to, amount]
|
|
8747
|
+
})
|
|
8748
|
+
};
|
|
8749
|
+
}
|
|
8750
|
+
/**
|
|
8751
|
+
* Encodes an approval transaction for a token.
|
|
8752
|
+
* @param token - The address of the token.
|
|
8753
|
+
* @param to - The address to approve the token to.
|
|
8754
|
+
* @param amount - The amount of the token to approve.
|
|
8755
|
+
* @returns The encoded contract call.
|
|
8756
|
+
*/
|
|
8757
|
+
static encodeApprove(token, to, amount) {
|
|
8758
|
+
return {
|
|
8759
|
+
address: token,
|
|
8760
|
+
value: 0n,
|
|
8761
|
+
data: encodeFunctionData({
|
|
8762
|
+
abi: erc20Abi$1,
|
|
8763
|
+
functionName: "approve",
|
|
8764
|
+
args: [to, amount]
|
|
8765
|
+
})
|
|
8766
|
+
};
|
|
8767
|
+
}
|
|
8768
|
+
};
|
|
8769
|
+
var EvmVaultTokenService = class {
|
|
8770
|
+
constructor() {
|
|
8771
|
+
}
|
|
8772
|
+
/**
|
|
8773
|
+
* Fetches token information for a specific token in the vault.
|
|
8774
|
+
* @param vault - The address of the vault.
|
|
8775
|
+
* @param token - The address of the token.
|
|
8776
|
+
* @param publicClient - PublicClient<HttpTransport>
|
|
8777
|
+
* @returns Token information as a TokenInfo object.
|
|
8778
|
+
*/
|
|
8779
|
+
static async getTokenInfo(vault, token, publicClient) {
|
|
8780
|
+
const [decimals, depositFee, withdrawalFee, maxDeposit, isSupported] = await publicClient.readContract({
|
|
8781
|
+
address: vault,
|
|
8782
|
+
abi: vaultTokenAbi,
|
|
8783
|
+
functionName: "tokenInfo",
|
|
8784
|
+
args: [token]
|
|
8785
|
+
});
|
|
8786
|
+
return { decimals, depositFee, withdrawalFee, maxDeposit, isSupported };
|
|
8787
|
+
}
|
|
8788
|
+
/**
|
|
8789
|
+
* Retrieves the reserves of the vault.
|
|
8790
|
+
* @param vault - The address of the vault.
|
|
8791
|
+
* @param publicClient - PublicClient<HttpTransport>
|
|
8792
|
+
* @returns An object containing tokens and their balances.
|
|
8793
|
+
*/
|
|
8794
|
+
static async getVaultReserves(vault, publicClient) {
|
|
8795
|
+
const [tokens, balances] = await publicClient.readContract({
|
|
8796
|
+
address: vault,
|
|
8797
|
+
abi: vaultTokenAbi,
|
|
8798
|
+
functionName: "getVaultReserves",
|
|
8799
|
+
args: []
|
|
8800
|
+
});
|
|
8801
|
+
return {
|
|
8802
|
+
tokens,
|
|
8803
|
+
balances
|
|
8804
|
+
};
|
|
8805
|
+
}
|
|
8806
|
+
/**
|
|
8807
|
+
* Retrieves all token information for the vault.
|
|
8808
|
+
* @param vault - The address of the vault.
|
|
8809
|
+
* @param publicClient - PublicClient<HttpTransport>
|
|
8810
|
+
* @returns A promise that resolves to an object containing tokens, their infos, and reserves.
|
|
8811
|
+
*/
|
|
8812
|
+
async getAllTokenInfo(vault, publicClient) {
|
|
8813
|
+
const [tokens, infos, reserves] = await publicClient.readContract({
|
|
8814
|
+
address: vault,
|
|
8815
|
+
abi: vaultTokenAbi,
|
|
8816
|
+
functionName: "getAllTokenInfo",
|
|
8817
|
+
args: []
|
|
8818
|
+
});
|
|
8819
|
+
return {
|
|
8820
|
+
tokens,
|
|
8821
|
+
infos,
|
|
8822
|
+
reserves
|
|
8823
|
+
};
|
|
8824
|
+
}
|
|
8825
|
+
/**
|
|
8826
|
+
* Deposits a specified amount of a token into the vault.
|
|
8827
|
+
* @param vault - The address of the vault.
|
|
8828
|
+
* @param token - The address of the token to deposit.
|
|
8829
|
+
* @param amount - The amount of the token to deposit.
|
|
8830
|
+
* @param walletProvider - IEvmWalletProvider
|
|
8831
|
+
* @returns Transaction hash
|
|
8832
|
+
*/
|
|
8833
|
+
static async deposit(vault, token, amount, walletProvider) {
|
|
8834
|
+
const from = await walletProvider.getWalletAddress();
|
|
8835
|
+
return walletProvider.sendTransaction({
|
|
8836
|
+
from,
|
|
8837
|
+
to: vault,
|
|
8838
|
+
value: 0n,
|
|
8839
|
+
data: encodeFunctionData({
|
|
8840
|
+
abi: vaultTokenAbi,
|
|
8841
|
+
functionName: "deposit",
|
|
8842
|
+
args: [token, amount]
|
|
8843
|
+
})
|
|
8844
|
+
});
|
|
8845
|
+
}
|
|
8846
|
+
/**
|
|
8847
|
+
* Withdraws a specified amount of a token from the vault.
|
|
8848
|
+
* @param vault - The address of the vault.
|
|
8849
|
+
* @param token - The address of the token to withdraw.
|
|
8850
|
+
* @param amount - The amount of the token to withdraw.
|
|
8851
|
+
* @param provider - EvmWalletProvider
|
|
8852
|
+
* @returns Transaction hash
|
|
8853
|
+
*/
|
|
8854
|
+
static async withdraw(vault, token, amount, provider) {
|
|
8855
|
+
const from = await provider.getWalletAddress();
|
|
8856
|
+
return provider.sendTransaction({
|
|
8857
|
+
from,
|
|
8858
|
+
to: vault,
|
|
8859
|
+
value: 0n,
|
|
8860
|
+
data: encodeFunctionData({
|
|
8861
|
+
abi: vaultTokenAbi,
|
|
8862
|
+
functionName: "withdraw",
|
|
8863
|
+
args: [token, amount]
|
|
8864
|
+
})
|
|
8865
|
+
});
|
|
8866
|
+
}
|
|
8867
|
+
/**
|
|
8868
|
+
* Encodes the deposit transaction data for the vault.
|
|
8869
|
+
* @param vault - The address of the vault.
|
|
8870
|
+
* @param token - The address of the token to deposit.
|
|
8871
|
+
* @param amount - The amount of the token to deposit.
|
|
8872
|
+
* @returns The encoded contract call data.
|
|
8873
|
+
*/
|
|
8874
|
+
static encodeDeposit(vault, token, amount) {
|
|
8875
|
+
return {
|
|
8876
|
+
address: vault,
|
|
8877
|
+
value: 0n,
|
|
8878
|
+
data: encodeFunctionData({
|
|
8879
|
+
abi: vaultTokenAbi,
|
|
8880
|
+
functionName: "deposit",
|
|
8881
|
+
args: [token, amount]
|
|
8882
|
+
})
|
|
8883
|
+
};
|
|
8884
|
+
}
|
|
8885
|
+
/**
|
|
8886
|
+
* Encodes the withdraw transaction data for the vault.
|
|
8887
|
+
* @param vault - The address of the vault.
|
|
8888
|
+
* @param token - The address of the token to withdraw.
|
|
8889
|
+
* @param amount - The amount of the token to withdraw.
|
|
8890
|
+
* @returns The encoded contract call data.
|
|
8891
|
+
*/
|
|
8892
|
+
static encodeWithdraw(vault, token, amount) {
|
|
8893
|
+
return {
|
|
8894
|
+
address: vault,
|
|
8895
|
+
value: 0n,
|
|
8896
|
+
data: encodeFunctionData({
|
|
8897
|
+
abi: vaultTokenAbi,
|
|
8898
|
+
functionName: "withdraw",
|
|
8899
|
+
args: [token, amount]
|
|
8900
|
+
})
|
|
8901
|
+
};
|
|
8902
|
+
}
|
|
8903
|
+
/**
|
|
8904
|
+
* Translates token amounts from their native decimals to 18 decimals
|
|
8905
|
+
* @param decimals - The number of decimals of the token
|
|
8906
|
+
* @param amount - The amount to translate
|
|
8907
|
+
* @returns The translated amount
|
|
8908
|
+
*/
|
|
8909
|
+
static translateIncomingDecimals(decimals, amount) {
|
|
8910
|
+
if (decimals <= 18) {
|
|
8911
|
+
return amount * BigInt(10 ** (18 - decimals));
|
|
8912
|
+
}
|
|
8913
|
+
return amount / BigInt(10 ** (decimals - 18));
|
|
8914
|
+
}
|
|
8915
|
+
/**
|
|
8916
|
+
* Translates token amounts from 18 decimals back to their native decimals
|
|
8917
|
+
* @param decimals - The number of decimals of the token
|
|
8918
|
+
* @param amount - The amount to translate
|
|
8919
|
+
* @returns The translated amount
|
|
8920
|
+
*/
|
|
8921
|
+
static translateOutgoingDecimals(decimals, amount) {
|
|
8922
|
+
if (decimals <= 18) {
|
|
8923
|
+
return amount / BigInt(10 ** (18 - decimals));
|
|
8924
|
+
}
|
|
8925
|
+
return amount * BigInt(10 ** (decimals - 18));
|
|
8926
|
+
}
|
|
8927
|
+
};
|
|
8928
|
+
|
|
8929
|
+
// src/services/hub/EvmAssetManagerService.ts
|
|
8930
|
+
var EvmAssetManagerService = class _EvmAssetManagerService {
|
|
8931
|
+
constructor() {
|
|
8932
|
+
}
|
|
8933
|
+
/**
|
|
8934
|
+
* Get asset information for a given asset address
|
|
8935
|
+
* @param asset - The address of the asset contract
|
|
8936
|
+
* @param assetManager - The address of the asset manager contract
|
|
8937
|
+
* @param client - The Viem public client
|
|
8938
|
+
* @returns Object containing chainID and spoke address for the asset
|
|
8939
|
+
*/
|
|
8940
|
+
static async getAssetInfo(asset, assetManager, client) {
|
|
8941
|
+
const [chainId, spokeAddress] = await client.readContract({
|
|
8942
|
+
address: assetManager,
|
|
8943
|
+
abi: assetManagerAbi,
|
|
8944
|
+
functionName: "assetInfo",
|
|
8945
|
+
args: [asset]
|
|
8946
|
+
});
|
|
8947
|
+
return {
|
|
8948
|
+
chainId,
|
|
8949
|
+
spokeAddress
|
|
8950
|
+
};
|
|
8951
|
+
}
|
|
8952
|
+
/**
|
|
8953
|
+
* Encodes a transfer transaction for an asset.
|
|
8954
|
+
* @param token - The address of the token.
|
|
8955
|
+
* @param to - The address to transfer the token to.
|
|
8956
|
+
* @param amount - The amount of the token to transfer.
|
|
8957
|
+
* @param assetManager
|
|
8958
|
+
* @returns The encoded contract call.
|
|
8959
|
+
*/
|
|
8960
|
+
static encodeTransfer(token, to, amount, assetManager) {
|
|
8961
|
+
return {
|
|
8962
|
+
address: assetManager,
|
|
8963
|
+
value: 0n,
|
|
8964
|
+
data: encodeFunctionData({
|
|
8965
|
+
abi: assetManagerAbi,
|
|
8966
|
+
functionName: "transfer",
|
|
8967
|
+
args: [token, to, amount, "0x"]
|
|
8968
|
+
})
|
|
8969
|
+
};
|
|
8970
|
+
}
|
|
8971
|
+
/**
|
|
8972
|
+
* Constructs the data for depositing tokens to the spoke chain.
|
|
8973
|
+
* @param {EvmDepositToDataParams} params - The address of the token to deposit.
|
|
8974
|
+
* @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.
|
|
8975
|
+
* @returns {Hex} Encoded contract calls for the deposit transaction.
|
|
8976
|
+
* @throws Will throw an error if the asset or vault address is not found.
|
|
8977
|
+
*/
|
|
8978
|
+
static depositToData(params, spokeChainId) {
|
|
8979
|
+
const calls = [];
|
|
8980
|
+
const assetConfig = getHubAssetInfo(spokeChainId, params.token);
|
|
8981
|
+
if (!assetConfig) {
|
|
8982
|
+
throw new Error("[depositToData] Hub asset not found");
|
|
8983
|
+
}
|
|
8984
|
+
const assetAddress = assetConfig.asset;
|
|
8985
|
+
const vaultAddress = assetConfig.vault;
|
|
8986
|
+
calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, params.amount));
|
|
8987
|
+
calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, params.amount));
|
|
8988
|
+
const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, params.amount);
|
|
8989
|
+
calls.push(Erc20Service.encodeTransfer(vaultAddress, params.to, translatedAmount));
|
|
8990
|
+
return encodeContractCalls(calls);
|
|
8991
|
+
}
|
|
8992
|
+
/**
|
|
8993
|
+
* Withdraw tokens from the spoke chain.
|
|
8994
|
+
* @param {EvmWithdrawAssetDataParams} params - Parameters for the withdrawal.
|
|
8995
|
+
* @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.
|
|
8996
|
+
* @param {EvmHubProvider} hubProvider - The provider for the hub chain.
|
|
8997
|
+
* @returns {Hex} Encoded contract calls for the withdrawal transaction.
|
|
8998
|
+
* @throws Will throw an error if the asset address is not found.
|
|
8999
|
+
*/
|
|
9000
|
+
static withdrawAssetData(params, hubProvider, spokeChainId) {
|
|
9001
|
+
const calls = [];
|
|
9002
|
+
const assetConfig = getHubAssetInfo(spokeChainId, params.token);
|
|
9003
|
+
if (!assetConfig) {
|
|
9004
|
+
throw new Error("[withdrawAssetData] Hub asset not found");
|
|
9005
|
+
}
|
|
9006
|
+
const assetAddress = assetConfig.asset;
|
|
9007
|
+
calls.push(
|
|
9008
|
+
_EvmAssetManagerService.encodeTransfer(
|
|
9009
|
+
assetAddress,
|
|
9010
|
+
params.to,
|
|
9011
|
+
params.amount,
|
|
9012
|
+
hubProvider.chainConfig.addresses.assetManager
|
|
9013
|
+
)
|
|
9014
|
+
);
|
|
9015
|
+
return encodeContractCalls(calls);
|
|
9016
|
+
}
|
|
9017
|
+
/**
|
|
9018
|
+
* Get asset address for a given chain ID and spoke address
|
|
9019
|
+
* @param chainId Chain ID where the asset exists
|
|
9020
|
+
* @param spokeAddress Address of the asset on the spoke chain
|
|
9021
|
+
* @param assetManager Address of the asset manager contract
|
|
9022
|
+
* @param client The Viem public client
|
|
9023
|
+
* @returns The asset's address on the hub chain
|
|
9024
|
+
*/
|
|
9025
|
+
async getAssetAddress(chainId, spokeAddress, assetManager, client) {
|
|
9026
|
+
return client.readContract({
|
|
9027
|
+
address: assetManager,
|
|
9028
|
+
abi: assetManagerAbi,
|
|
9029
|
+
functionName: "assets",
|
|
9030
|
+
args: [chainId, spokeAddress]
|
|
9031
|
+
});
|
|
9032
|
+
}
|
|
9033
|
+
};
|
|
9034
|
+
|
|
9035
|
+
// src/services/hub/EvmWalletAbstraction.ts
|
|
9036
|
+
var EvmWalletAbstraction = class {
|
|
9037
|
+
constructor() {
|
|
9038
|
+
}
|
|
9039
|
+
/**
|
|
9040
|
+
* Get the hub wallet address for a given spoke chain and address.
|
|
9041
|
+
* @param chainId - The spoke chain ID.
|
|
9042
|
+
* @param address - The address on the spoke chain.
|
|
9043
|
+
* @param hubProvider - The hub provider.
|
|
9044
|
+
* @returns The hub wallet address.
|
|
9045
|
+
*/
|
|
9046
|
+
static async getUserHubWalletAddress(chainId, address, hubProvider) {
|
|
9047
|
+
return hubProvider.publicClient.readContract({
|
|
9048
|
+
address: hubProvider.chainConfig.addresses.hubWallet,
|
|
9049
|
+
abi: walletFactoryAbi,
|
|
9050
|
+
functionName: "getDeployedAddress",
|
|
9051
|
+
args: [BigInt(getIntentRelayChainId(chainId)), address]
|
|
9052
|
+
});
|
|
9053
|
+
}
|
|
9054
|
+
};
|
|
9155
9055
|
var EvmSpokeService = class _EvmSpokeService {
|
|
9156
9056
|
constructor() {
|
|
9157
9057
|
}
|
|
@@ -9548,9 +9448,10 @@ var IconSpokeService = class _IconSpokeService {
|
|
|
9548
9448
|
getIconAddressBytes(params.from),
|
|
9549
9449
|
hubProvider
|
|
9550
9450
|
);
|
|
9451
|
+
const token = isNativeToken(spokeProvider.chainConfig.chain.id, params.token) ? spokeProvider.chainConfig.addresses.wICX : params.token;
|
|
9551
9452
|
return {
|
|
9552
9453
|
spokeChainID: spokeProvider.chainConfig.chain.id,
|
|
9553
|
-
token: encodeAddress(spokeProvider.chainConfig.chain.id,
|
|
9454
|
+
token: encodeAddress(spokeProvider.chainConfig.chain.id, token),
|
|
9554
9455
|
from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),
|
|
9555
9456
|
to,
|
|
9556
9457
|
amount: params.amount,
|
|
@@ -9971,7 +9872,7 @@ var StellarSpokeService = class _StellarSpokeService {
|
|
|
9971
9872
|
return {
|
|
9972
9873
|
spokeChainID: spokeProvider.chainConfig.chain.id,
|
|
9973
9874
|
token: encodeAddress(spokeProvider.chainConfig.chain.id, params.token),
|
|
9974
|
-
from: params.from,
|
|
9875
|
+
from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),
|
|
9975
9876
|
to,
|
|
9976
9877
|
amount: params.amount,
|
|
9977
9878
|
data: params.data,
|
|
@@ -10183,6 +10084,7 @@ var SonicSpokeService = class _SonicSpokeService {
|
|
|
10183
10084
|
* @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash
|
|
10184
10085
|
*/
|
|
10185
10086
|
static async deposit(params, spokeProvider, raw) {
|
|
10087
|
+
invariant11(spokeProvider instanceof SonicSpokeProvider, "[SonicSpokeService] invalid spoke provider");
|
|
10186
10088
|
const userHubAddress = params.to ?? await _SonicSpokeService.getUserRouter(params.from, spokeProvider);
|
|
10187
10089
|
const calls = Array.from(
|
|
10188
10090
|
decodeAbiParameters(
|
|
@@ -10237,7 +10139,7 @@ var SonicSpokeService = class _SonicSpokeService {
|
|
|
10237
10139
|
value: params.token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase() ? params.amount : 0n
|
|
10238
10140
|
};
|
|
10239
10141
|
if (raw) {
|
|
10240
|
-
return rawTx;
|
|
10142
|
+
return Promise.resolve(rawTx);
|
|
10241
10143
|
}
|
|
10242
10144
|
return spokeProvider.walletProvider.sendTransaction(rawTx);
|
|
10243
10145
|
}
|
|
@@ -10314,6 +10216,7 @@ var SonicSpokeService = class _SonicSpokeService {
|
|
|
10314
10216
|
* @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash
|
|
10315
10217
|
*/
|
|
10316
10218
|
static async callWallet(payload, spokeProvider, raw) {
|
|
10219
|
+
invariant11(spokeProvider instanceof SonicSpokeProvider, "[SonicSpokeService] invalid spoke provider");
|
|
10317
10220
|
const calls = decodeAbiParameters(
|
|
10318
10221
|
[
|
|
10319
10222
|
{
|
|
@@ -10348,7 +10251,7 @@ var SonicSpokeService = class _SonicSpokeService {
|
|
|
10348
10251
|
if (raw) {
|
|
10349
10252
|
return rawTx;
|
|
10350
10253
|
}
|
|
10351
|
-
return spokeProvider.walletProvider.sendTransaction(rawTx);
|
|
10254
|
+
return await spokeProvider.walletProvider.sendTransaction(rawTx);
|
|
10352
10255
|
}
|
|
10353
10256
|
/**
|
|
10354
10257
|
* Get withdraw information for a given token
|
|
@@ -10822,6 +10725,7 @@ var SpokeService = class _SpokeService {
|
|
|
10822
10725
|
return InjectiveSpokeService.deposit(params, spokeProvider, hubProvider, raw);
|
|
10823
10726
|
}
|
|
10824
10727
|
if (spokeProvider instanceof IconSpokeProvider) {
|
|
10728
|
+
await _SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);
|
|
10825
10729
|
return IconSpokeService.deposit(
|
|
10826
10730
|
params,
|
|
10827
10731
|
spokeProvider,
|
|
@@ -10848,6 +10752,7 @@ var SpokeService = class _SpokeService {
|
|
|
10848
10752
|
);
|
|
10849
10753
|
}
|
|
10850
10754
|
if (spokeProvider instanceof StellarSpokeProvider) {
|
|
10755
|
+
await _SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);
|
|
10851
10756
|
return StellarSpokeService.deposit(
|
|
10852
10757
|
params,
|
|
10853
10758
|
spokeProvider,
|
|
@@ -10951,7 +10856,11 @@ var SpokeService = class _SpokeService {
|
|
|
10951
10856
|
*/
|
|
10952
10857
|
static async callWallet(from, payload, spokeProvider, hubProvider, raw, skipSimulation = false) {
|
|
10953
10858
|
if (isSonicSpokeProvider(spokeProvider)) {
|
|
10954
|
-
return await SonicSpokeService.callWallet(
|
|
10859
|
+
return await SonicSpokeService.callWallet(
|
|
10860
|
+
payload,
|
|
10861
|
+
spokeProvider,
|
|
10862
|
+
raw
|
|
10863
|
+
);
|
|
10955
10864
|
}
|
|
10956
10865
|
if (isEvmSpokeProvider(spokeProvider)) {
|
|
10957
10866
|
await _SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);
|
|
@@ -11834,7 +11743,18 @@ var SolverService = class {
|
|
|
11834
11743
|
ok: false,
|
|
11835
11744
|
error: {
|
|
11836
11745
|
code: "POST_EXECUTION_FAILED",
|
|
11837
|
-
data:
|
|
11746
|
+
data: {
|
|
11747
|
+
...result.error,
|
|
11748
|
+
intent,
|
|
11749
|
+
intentDeliveryInfo: {
|
|
11750
|
+
srcChainId: params.srcChain,
|
|
11751
|
+
srcTxHash: spokeTxHash,
|
|
11752
|
+
srcAddress: params.srcAddress,
|
|
11753
|
+
dstChainId: params.dstChain,
|
|
11754
|
+
dstTxHash: dstIntentTxHash,
|
|
11755
|
+
dstAddress: params.dstAddress
|
|
11756
|
+
}
|
|
11757
|
+
}
|
|
11838
11758
|
}
|
|
11839
11759
|
};
|
|
11840
11760
|
}
|
|
@@ -12083,7 +12003,7 @@ var SolverService = class {
|
|
|
12083
12003
|
params.srcAddress.toLowerCase() === walletAddress.toLowerCase(),
|
|
12084
12004
|
"srcAddress must be the same as wallet address"
|
|
12085
12005
|
);
|
|
12086
|
-
const creatorHubWalletAddress =
|
|
12006
|
+
const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
12087
12007
|
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {
|
|
12088
12008
|
const [txResult, intent, feeAmount, data] = await SonicSpokeService.createSwapIntent(
|
|
12089
12009
|
params,
|
|
@@ -12156,7 +12076,7 @@ var SolverService = class {
|
|
|
12156
12076
|
invariant11(isValidIntentRelayChainId(intent.srcChain), `Invalid intent.srcChain: ${intent.srcChain}`);
|
|
12157
12077
|
invariant11(isValidIntentRelayChainId(intent.dstChain), `Invalid intent.dstChain: ${intent.dstChain}`);
|
|
12158
12078
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
12159
|
-
const creatorHubWalletAddress =
|
|
12079
|
+
const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
12160
12080
|
const calls = [];
|
|
12161
12081
|
const intentsContract = this.config.intentsContract;
|
|
12162
12082
|
calls.push(EvmSolverService.encodeCancelIntent(intent, intentsContract));
|
|
@@ -12195,6 +12115,19 @@ var SolverService = class {
|
|
|
12195
12115
|
getIntentHash(intent) {
|
|
12196
12116
|
return EvmSolverService.getIntentHash(intent);
|
|
12197
12117
|
}
|
|
12118
|
+
/**
|
|
12119
|
+
* Gets the deadline for a swap by querying hub chain block timestamp and adding the deadline offset
|
|
12120
|
+
* @param {bigint} deadline (default: 5 minutes) - The deadline offset in seconds for the swap to be cancelled
|
|
12121
|
+
* @returns {bigint} The deadline for the swap as a sum of hub chain block timestamp and deadline offset
|
|
12122
|
+
*/
|
|
12123
|
+
async getSwapDeadline(deadline = DEFAULT_DEADLINE_OFFSET) {
|
|
12124
|
+
invariant11(deadline > 0n, "Deadline must be greater than 0");
|
|
12125
|
+
const block = await this.hubProvider.publicClient.getBlock({
|
|
12126
|
+
includeTransactions: false,
|
|
12127
|
+
blockTag: "latest"
|
|
12128
|
+
});
|
|
12129
|
+
return block.timestamp + deadline;
|
|
12130
|
+
}
|
|
12198
12131
|
};
|
|
12199
12132
|
|
|
12200
12133
|
// src/abis/icxSwap.abi.ts
|
|
@@ -13872,8 +13805,6 @@ var Sodax = class {
|
|
|
13872
13805
|
|
|
13873
13806
|
// src/services/hub/WalletAbstractionService.ts
|
|
13874
13807
|
var WalletAbstractionService = class {
|
|
13875
|
-
constructor() {
|
|
13876
|
-
}
|
|
13877
13808
|
/**
|
|
13878
13809
|
* Gets the hub wallet address for a user based on their spoke chain address.
|
|
13879
13810
|
* @param address - The user's address on the spoke chain
|
|
@@ -13881,14 +13812,14 @@ var WalletAbstractionService = class {
|
|
|
13881
13812
|
* @param hubProvider - The provider for interacting with the hub chain
|
|
13882
13813
|
* @returns The user's hub wallet address
|
|
13883
13814
|
*/
|
|
13884
|
-
static async
|
|
13815
|
+
static async getUserAbstractedWalletAddress(address, spokeProvider, hubProvider) {
|
|
13885
13816
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, address);
|
|
13886
13817
|
if (spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id) {
|
|
13887
13818
|
if (spokeProvider instanceof SonicSpokeProvider) {
|
|
13888
13819
|
return SonicSpokeService.getUserRouter(encodedAddress, spokeProvider);
|
|
13889
13820
|
}
|
|
13890
13821
|
throw new Error(
|
|
13891
|
-
"[
|
|
13822
|
+
"[getUserHubWalletAddress] Invalid spoke provider for matching hub id. Sonic spoke provider is required."
|
|
13892
13823
|
);
|
|
13893
13824
|
}
|
|
13894
13825
|
return EvmWalletAbstraction.getUserHubWalletAddress(
|
|
@@ -13898,6 +13829,111 @@ var WalletAbstractionService = class {
|
|
|
13898
13829
|
);
|
|
13899
13830
|
}
|
|
13900
13831
|
};
|
|
13832
|
+
async function retry(action, retryCount = DEFAULT_MAX_RETRY, delayMs = DEFAULT_RETRY_DELAY_MS) {
|
|
13833
|
+
do {
|
|
13834
|
+
try {
|
|
13835
|
+
return await action(retryCount);
|
|
13836
|
+
} catch (e) {
|
|
13837
|
+
retryCount--;
|
|
13838
|
+
if (retryCount <= 0) {
|
|
13839
|
+
console.error(`Failed to perform operation even after ${DEFAULT_MAX_RETRY} attempts.. Throwing origin error..`);
|
|
13840
|
+
throw e;
|
|
13841
|
+
}
|
|
13842
|
+
}
|
|
13843
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
13844
|
+
} while (retryCount > 0);
|
|
13845
|
+
throw new Error(`Retry exceeded MAX_RETRY_DEFAULT=${DEFAULT_MAX_RETRY}`);
|
|
13846
|
+
}
|
|
13847
|
+
function getRandomBytes(length) {
|
|
13848
|
+
const array = new Uint8Array(length);
|
|
13849
|
+
for (let i = 0; i < length; i++) {
|
|
13850
|
+
array[i] = Math.floor(Math.random() * 256);
|
|
13851
|
+
}
|
|
13852
|
+
return array;
|
|
13853
|
+
}
|
|
13854
|
+
function randomUint256() {
|
|
13855
|
+
const bytes = getRandomBytes(32);
|
|
13856
|
+
let hex = "";
|
|
13857
|
+
for (const byte of bytes) {
|
|
13858
|
+
hex += byte.toString(16).padStart(2, "0") ?? "";
|
|
13859
|
+
}
|
|
13860
|
+
return BigInt(`0x${hex}`);
|
|
13861
|
+
}
|
|
13862
|
+
function calculatePercentageFeeAmount(amount, percentage) {
|
|
13863
|
+
return amount * BigInt(percentage) / FEE_PERCENTAGE_SCALE;
|
|
13864
|
+
}
|
|
13865
|
+
function calculateFeeAmount(inputAmount, fee) {
|
|
13866
|
+
if (!fee) {
|
|
13867
|
+
return 0n;
|
|
13868
|
+
}
|
|
13869
|
+
invariant11(inputAmount > 0n, "Input amount must be greater than 0");
|
|
13870
|
+
let feeAmount = 0n;
|
|
13871
|
+
if (isPartnerFeeAmount(fee)) {
|
|
13872
|
+
invariant11(
|
|
13873
|
+
fee.amount >= 0 && fee.amount <= inputAmount,
|
|
13874
|
+
`Fee amount must be greater than 0 and less than or equal to the input amount: ${fee.amount}`
|
|
13875
|
+
);
|
|
13876
|
+
feeAmount = fee.amount;
|
|
13877
|
+
} else if (isPartnerFeePercentage(fee)) {
|
|
13878
|
+
invariant11(
|
|
13879
|
+
fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,
|
|
13880
|
+
`Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`
|
|
13881
|
+
);
|
|
13882
|
+
feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);
|
|
13883
|
+
}
|
|
13884
|
+
return feeAmount;
|
|
13885
|
+
}
|
|
13886
|
+
function adjustAmountByFee(amount, fee, quoteType) {
|
|
13887
|
+
invariant11(amount > 0n, "Amount must be greater than 0");
|
|
13888
|
+
invariant11(quoteType === "exact_input" || quoteType === "exact_output", "Invalid quote type");
|
|
13889
|
+
if (quoteType === "exact_input") {
|
|
13890
|
+
return amount - calculateFeeAmount(amount, fee);
|
|
13891
|
+
}
|
|
13892
|
+
if (quoteType === "exact_output") {
|
|
13893
|
+
return amount + calculateFeeAmount(amount, fee);
|
|
13894
|
+
}
|
|
13895
|
+
throw new Error("Invalid quote type");
|
|
13896
|
+
}
|
|
13897
|
+
function BigIntToHex(value) {
|
|
13898
|
+
return `0x${value.toString(16)}`;
|
|
13899
|
+
}
|
|
13900
|
+
function encodeAddress(spokeChainId, address) {
|
|
13901
|
+
switch (spokeChainId) {
|
|
13902
|
+
case "0xa86a.avax":
|
|
13903
|
+
case "0x2105.base":
|
|
13904
|
+
case "0xa.optimism":
|
|
13905
|
+
case "0x38.bsc":
|
|
13906
|
+
case "0x89.polygon":
|
|
13907
|
+
case "0xa4b1.arbitrum":
|
|
13908
|
+
case "sonic":
|
|
13909
|
+
return address;
|
|
13910
|
+
case "injective-1":
|
|
13911
|
+
return toHex(Buffer.from(address, "utf-8"));
|
|
13912
|
+
case "0x1.icon":
|
|
13913
|
+
return toHex(Buffer.from(address.replace("cx", "01").replace("hx", "00") ?? "f8", "hex"));
|
|
13914
|
+
case "sui":
|
|
13915
|
+
return toHex(bcs.Address.serialize(address).toBytes());
|
|
13916
|
+
case "solana":
|
|
13917
|
+
return toHex(Buffer.from(new PublicKey(address).toBytes()));
|
|
13918
|
+
case "stellar":
|
|
13919
|
+
return `0x${Address.fromString(address).toScVal().toXDR("hex")}`;
|
|
13920
|
+
default:
|
|
13921
|
+
return address;
|
|
13922
|
+
}
|
|
13923
|
+
}
|
|
13924
|
+
function hexToBigInt(hex) {
|
|
13925
|
+
const trimmed = hex.trim().toLowerCase();
|
|
13926
|
+
const isValid = /^(0x)?[0-9a-f]+$/.test(trimmed);
|
|
13927
|
+
if (!isValid) {
|
|
13928
|
+
throw new Error(`Invalid hex string: "${hex}"`);
|
|
13929
|
+
}
|
|
13930
|
+
const normalized = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
|
|
13931
|
+
return BigInt(normalized);
|
|
13932
|
+
}
|
|
13933
|
+
async function deriveUserWalletAddress(spokeProvider, hubProvider, walletAddress) {
|
|
13934
|
+
const address = walletAddress ?? await spokeProvider.walletProvider.getWalletAddress();
|
|
13935
|
+
return spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id ? address : await WalletAbstractionService.getUserAbstractedWalletAddress(address, spokeProvider, hubProvider);
|
|
13936
|
+
}
|
|
13901
13937
|
var BigNumberZeroDecimal = BigNumber.clone({
|
|
13902
13938
|
DECIMAL_PLACES: 0,
|
|
13903
13939
|
ROUNDING_MODE: BigNumber.ROUND_DOWN
|
|
@@ -15258,11 +15294,7 @@ var MoneyMarketDataService = class {
|
|
|
15258
15294
|
*/
|
|
15259
15295
|
async getUserReservesData(spokeProvider) {
|
|
15260
15296
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15261
|
-
const hubWalletAddress = await
|
|
15262
|
-
walletAddress,
|
|
15263
|
-
spokeProvider,
|
|
15264
|
-
this.hubProvider
|
|
15265
|
-
);
|
|
15297
|
+
const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15266
15298
|
return this.uiPoolDataProviderService.getUserReservesData(hubWalletAddress);
|
|
15267
15299
|
}
|
|
15268
15300
|
/**
|
|
@@ -15293,11 +15325,7 @@ var MoneyMarketDataService = class {
|
|
|
15293
15325
|
*/
|
|
15294
15326
|
async getUserReservesHumanized(spokeProvider) {
|
|
15295
15327
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15296
|
-
const hubWalletAddress = await
|
|
15297
|
-
walletAddress,
|
|
15298
|
-
spokeProvider,
|
|
15299
|
-
this.hubProvider
|
|
15300
|
-
);
|
|
15328
|
+
const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15301
15329
|
return this.uiPoolDataProviderService.getUserReservesHumanized(hubWalletAddress);
|
|
15302
15330
|
}
|
|
15303
15331
|
/**
|
|
@@ -15739,34 +15767,44 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15739
15767
|
`Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`
|
|
15740
15768
|
);
|
|
15741
15769
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15742
|
-
const
|
|
15743
|
-
walletAddress,
|
|
15744
|
-
spokeProvider,
|
|
15745
|
-
this.hubProvider
|
|
15746
|
-
);
|
|
15770
|
+
const abstractedWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15747
15771
|
const data = this.buildSupplyData(
|
|
15748
15772
|
params.token,
|
|
15749
|
-
|
|
15773
|
+
abstractedWalletAddress,
|
|
15750
15774
|
params.amount,
|
|
15751
15775
|
spokeProvider.chainConfig.chain.id
|
|
15752
15776
|
);
|
|
15753
|
-
|
|
15754
|
-
|
|
15755
|
-
|
|
15756
|
-
|
|
15757
|
-
|
|
15758
|
-
|
|
15759
|
-
|
|
15760
|
-
|
|
15761
|
-
|
|
15762
|
-
|
|
15763
|
-
|
|
15764
|
-
|
|
15777
|
+
let txResult;
|
|
15778
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id && spokeProvider instanceof SonicSpokeProvider) {
|
|
15779
|
+
txResult = await SonicSpokeService.deposit(
|
|
15780
|
+
{
|
|
15781
|
+
from: walletAddress,
|
|
15782
|
+
token: params.token,
|
|
15783
|
+
amount: params.amount,
|
|
15784
|
+
data
|
|
15785
|
+
},
|
|
15786
|
+
spokeProvider,
|
|
15787
|
+
raw
|
|
15788
|
+
);
|
|
15789
|
+
} else {
|
|
15790
|
+
txResult = await SpokeService.deposit(
|
|
15791
|
+
{
|
|
15792
|
+
from: walletAddress,
|
|
15793
|
+
to: abstractedWalletAddress,
|
|
15794
|
+
token: params.token,
|
|
15795
|
+
amount: params.amount,
|
|
15796
|
+
data
|
|
15797
|
+
},
|
|
15798
|
+
spokeProvider,
|
|
15799
|
+
this.hubProvider,
|
|
15800
|
+
raw
|
|
15801
|
+
);
|
|
15802
|
+
}
|
|
15765
15803
|
return {
|
|
15766
15804
|
ok: true,
|
|
15767
15805
|
value: txResult,
|
|
15768
15806
|
data: {
|
|
15769
|
-
address:
|
|
15807
|
+
address: abstractedWalletAddress,
|
|
15770
15808
|
payload: data
|
|
15771
15809
|
}
|
|
15772
15810
|
};
|
|
@@ -15895,11 +15933,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15895
15933
|
);
|
|
15896
15934
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15897
15935
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);
|
|
15898
|
-
const hubWallet = await
|
|
15899
|
-
walletAddress,
|
|
15900
|
-
spokeProvider,
|
|
15901
|
-
this.hubProvider
|
|
15902
|
-
);
|
|
15936
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15903
15937
|
const data = this.buildBorrowData(
|
|
15904
15938
|
hubWallet,
|
|
15905
15939
|
encodedAddress,
|
|
@@ -15907,7 +15941,12 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15907
15941
|
params.amount,
|
|
15908
15942
|
spokeProvider.chainConfig.chain.id
|
|
15909
15943
|
);
|
|
15910
|
-
|
|
15944
|
+
let txResult;
|
|
15945
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {
|
|
15946
|
+
txResult = await SonicSpokeService.callWallet(data, spokeProvider);
|
|
15947
|
+
} else {
|
|
15948
|
+
txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
15949
|
+
}
|
|
15911
15950
|
return {
|
|
15912
15951
|
ok: true,
|
|
15913
15952
|
value: txResult,
|
|
@@ -16030,11 +16069,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16030
16069
|
);
|
|
16031
16070
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
16032
16071
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);
|
|
16033
|
-
const hubWallet = await
|
|
16034
|
-
walletAddress,
|
|
16035
|
-
spokeProvider,
|
|
16036
|
-
this.hubProvider
|
|
16037
|
-
);
|
|
16072
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
16038
16073
|
let data;
|
|
16039
16074
|
if (spokeProvider instanceof SonicSpokeProvider) {
|
|
16040
16075
|
const withdrawInfo = await SonicSpokeService.getWithdrawInfo(
|
|
@@ -16060,7 +16095,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16060
16095
|
spokeProvider.chainConfig.chain.id
|
|
16061
16096
|
);
|
|
16062
16097
|
}
|
|
16063
|
-
const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
16098
|
+
const txResult = spokeProvider instanceof SonicSpokeProvider ? await SonicSpokeService.callWallet(data, spokeProvider, raw) : await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
16064
16099
|
return {
|
|
16065
16100
|
ok: true,
|
|
16066
16101
|
value: txResult,
|
|
@@ -16184,24 +16219,34 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16184
16219
|
`Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`
|
|
16185
16220
|
);
|
|
16186
16221
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
16187
|
-
const hubWallet = await
|
|
16188
|
-
walletAddress,
|
|
16189
|
-
spokeProvider,
|
|
16190
|
-
this.hubProvider
|
|
16191
|
-
);
|
|
16222
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
16192
16223
|
const data = this.buildRepayData(params.token, hubWallet, params.amount, spokeProvider.chainConfig.chain.id);
|
|
16193
|
-
|
|
16194
|
-
|
|
16195
|
-
|
|
16196
|
-
|
|
16197
|
-
|
|
16198
|
-
|
|
16199
|
-
|
|
16200
|
-
|
|
16201
|
-
|
|
16202
|
-
|
|
16203
|
-
|
|
16204
|
-
|
|
16224
|
+
let txResult;
|
|
16225
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id && spokeProvider instanceof SonicSpokeProvider) {
|
|
16226
|
+
txResult = await SonicSpokeService.deposit(
|
|
16227
|
+
{
|
|
16228
|
+
from: walletAddress,
|
|
16229
|
+
token: params.token,
|
|
16230
|
+
amount: params.amount,
|
|
16231
|
+
data
|
|
16232
|
+
},
|
|
16233
|
+
spokeProvider,
|
|
16234
|
+
raw
|
|
16235
|
+
);
|
|
16236
|
+
} else {
|
|
16237
|
+
txResult = await SpokeService.deposit(
|
|
16238
|
+
{
|
|
16239
|
+
from: walletAddress,
|
|
16240
|
+
to: hubWallet,
|
|
16241
|
+
token: params.token,
|
|
16242
|
+
amount: params.amount,
|
|
16243
|
+
data
|
|
16244
|
+
},
|
|
16245
|
+
spokeProvider,
|
|
16246
|
+
this.hubProvider,
|
|
16247
|
+
raw
|
|
16248
|
+
);
|
|
16249
|
+
}
|
|
16205
16250
|
return {
|
|
16206
16251
|
ok: true,
|
|
16207
16252
|
value: txResult,
|
|
@@ -16583,6 +16628,6 @@ var SolverIntentErrorCode = /* @__PURE__ */ ((SolverIntentErrorCode2) => {
|
|
|
16583
16628
|
return SolverIntentErrorCode2;
|
|
16584
16629
|
})(SolverIntentErrorCode || {});
|
|
16585
16630
|
|
|
16586
|
-
export { BalnSwapService, BigIntToHex, BigNumberZeroDecimal, BnUSDMigrationService, ChainIdToIntentRelayChainId, DEFAULT_MAX_RETRY, DEFAULT_RELAYER_API_ENDPOINT, DEFAULT_RELAY_TX_TIMEOUT, DEFAULT_RETRY_DELAY_MS, EVM_CHAIN_IDS, EVM_SPOKE_CHAIN_IDS, Erc20Service, EvmAssetManagerService, EvmHubProvider, EvmSolverService, EvmSpokeProvider, EvmSpokeService, EvmVaultTokenService, EvmWalletAbstraction, FEE_PERCENTAGE_SCALE, HALF_RAY, HALF_WAD, HubVaultSymbols, ICON_TX_RESULT_WAIT_MAX_RETRY, INTENT_RELAY_CHAIN_IDS, IconSpokeProvider, IcxMigrationService, InjectiveSpokeProvider, IntentCreatedEventAbi, IntentDataType, IntentsAbi, LTV_PRECISION, LendingPoolService, LockupMultiplier, LockupPeriod, MAX_UINT256, MigrationService, MoneyMarketDataService, MoneyMarketService, RAY, RAY_DECIMALS, SECONDS_PER_YEAR, STELLAR_DEFAULT_TX_TIMEOUT_SECONDS, STELLAR_PRIORITY_FEE, Sodax, SolanaSpokeProvider, SolverIntentErrorCode, SolverIntentStatusCode, SolverService, SonicSpokeProvider, SonicSpokeService, SpokeService, StellarSpokeProvider, SuiSpokeProvider, SupportedMigrationTokens, USD_DECIMALS, UiPoolDataProviderService, VAULT_TOKEN_DECIMALS, WAD, WAD_RAY_RATIO, WEI_DECIMALS, WalletAbstractionService, adjustAmountByFee, assetManagerAbi, balnSwapAbi, binomialApproximatedRayPow, bnUSDLegacySpokeChainIds, bnUSDLegacyTokens, bnUSDNewTokens, calculateAllReserveIncentives, calculateAllUserIncentives, calculateAvailableBorrowsMarketReferenceCurrency, calculateCompoundedInterest, calculateCompoundedRate, calculateFeeAmount, calculateHealthFactorFromBalances, calculateHealthFactorFromBalancesBigUnits, calculateLinearInterest, calculatePercentageFeeAmount, chainIdToHubAssetsMap, connectionAbi, encodeAddress, encodeContractCalls, erc20Abi, formatBasisPoints, formatEModeCategory, formatEModes, formatPercentage, formatReserve, formatReserveUSD, formatReserves, formatReservesAndIncentives, formatUserSummary, formatUserSummaryAndIncentives, getAllLegacybnUSDTokens, getAndFormatReserveEModes, getCompoundedBalance, getEvmViemChain, getHubAssetInfo, getHubChainConfig, getIconAddressBytes, getIntentRelayChainId, getLinearBalance, getMarketReferenceCurrencyAndUsdBalance, getMoneyMarketConfig, getOriginalAssetAddress, getPacket, getRandomBytes, getReserveNormalizedIncome, getReservesEModes, getSolanaAddressBytes, getSolverConfig, getSpokeChainIdFromIntentRelayChainId, getSupportedMoneyMarketTokens, getSupportedSolverTokens, getTransactionPackets, hexToBigInt, hubAssetToOriginalAssetMap, hubAssets, hubVaults, hubVaultsAddressSet, intentRelayChainIdToSpokeChainIdMap, isBalnMigrateParams, isConfiguredMoneyMarketConfig, isConfiguredSolverConfig, isEvmHubChainConfig, isEvmInitializedConfig, isEvmSpokeChainConfig, isEvmSpokeProvider, isEvmUninitializedBrowserConfig, isEvmUninitializedConfig, isEvmUninitializedPrivateKeyConfig, isIconAddress, isIconSpokeProvider, isIcxCreateRevertMigrationParams, isIcxMigrateParams, isInjectiveSpokeProvider, isIntentCreationFailedError, isIntentCreationUnknownError, isIntentPostExecutionFailedError, isIntentRelayChainId, isIntentSubmitTxFailedError, isJsonRpcPayloadResponse, isLegacybnUSDChainId, isLegacybnUSDToken, isMoneyMarketBorrowUnknownError, isMoneyMarketCreateBorrowIntentFailedError, isMoneyMarketCreateRepayIntentFailedError, isMoneyMarketCreateSupplyIntentFailedError, isMoneyMarketCreateWithdrawIntentFailedError, isMoneyMarketRelayTimeoutError, isMoneyMarketRepayUnknownError, isMoneyMarketReserveAsset, isMoneyMarketReserveHubAsset, isMoneyMarketSubmitTxFailedError, isMoneyMarketSupplyUnknownError, isMoneyMarketSupportedToken, isMoneyMarketWithdrawUnknownError, isNativeToken, isNewbnUSDChainId, isNewbnUSDToken, isPartnerFeeAmount, isPartnerFeePercentage, isResponseAddressType, isResponseSigningType, isSolanaSpokeProvider, isSolverSupportedToken, isSonicSpokeProvider, isStellarSpokeProvider, isSuiSpokeProvider, isUnifiedBnUSDMigrateParams, isValidChainHubAsset, isValidHubAsset, isValidIntentRelayChainId, isValidOriginalAssetAddress, isValidSpokeChainId, isWaitUntilIntentExecutedFailed, moneyMarketReserveAssets, moneyMarketReserveHubAssetsSet, moneyMarketSupportedTokens, nativeToUSD, newbnUSDSpokeChainIds, normalize, normalizeBN, normalizedToUsd, originalAssetTohubAssetMap, poolAbi, randomUint256, rayDiv, rayMul, rayPow, rayToWad, relayTxAndWaitPacket, requestAddress, requestJsonRpc, requestSigning, retry, sonicWalletFactoryAbi, spokeAssetManagerAbi, spokeChainConfig, spokeChainIdsSet, submitTransaction, supportedHubAssets, supportedHubChains, supportedSpokeChains, supportedTokensPerChain, uiPoolDataAbi, valueToBigNumber, valueToZDBigNumber, variableDebtTokenAbi, vaultTokenAbi, wadToRay, waitForTransactionReceipt, waitUntilIntentExecuted, walletFactoryAbi, wrappedSonicAbi };
|
|
16631
|
+
export { BalnSwapService, BigIntToHex, BigNumberZeroDecimal, BnUSDMigrationService, ChainIdToIntentRelayChainId, DEFAULT_DEADLINE_OFFSET, DEFAULT_MAX_RETRY, DEFAULT_RELAYER_API_ENDPOINT, DEFAULT_RELAY_TX_TIMEOUT, DEFAULT_RETRY_DELAY_MS, EVM_CHAIN_IDS, EVM_SPOKE_CHAIN_IDS, Erc20Service, EvmAssetManagerService, EvmHubProvider, EvmSolverService, EvmSpokeProvider, EvmSpokeService, EvmVaultTokenService, EvmWalletAbstraction, FEE_PERCENTAGE_SCALE, HALF_RAY, HALF_WAD, HubVaultSymbols, ICON_TX_RESULT_WAIT_MAX_RETRY, INTENT_RELAY_CHAIN_IDS, IconSpokeProvider, IcxMigrationService, InjectiveSpokeProvider, IntentCreatedEventAbi, IntentDataType, IntentsAbi, LTV_PRECISION, LendingPoolService, LockupMultiplier, LockupPeriod, MAX_UINT256, MigrationService, MoneyMarketDataService, MoneyMarketService, RAY, RAY_DECIMALS, SECONDS_PER_YEAR, STELLAR_DEFAULT_TX_TIMEOUT_SECONDS, STELLAR_PRIORITY_FEE, Sodax, SolanaSpokeProvider, SolverIntentErrorCode, SolverIntentStatusCode, SolverService, SonicSpokeProvider, SonicSpokeService, SpokeService, StellarSpokeProvider, SuiSpokeProvider, SupportedMigrationTokens, USD_DECIMALS, UiPoolDataProviderService, VAULT_TOKEN_DECIMALS, WAD, WAD_RAY_RATIO, WEI_DECIMALS, WalletAbstractionService, adjustAmountByFee, assetManagerAbi, balnSwapAbi, binomialApproximatedRayPow, bnUSDLegacySpokeChainIds, bnUSDLegacyTokens, bnUSDNewTokens, calculateAllReserveIncentives, calculateAllUserIncentives, calculateAvailableBorrowsMarketReferenceCurrency, calculateCompoundedInterest, calculateCompoundedRate, calculateFeeAmount, calculateHealthFactorFromBalances, calculateHealthFactorFromBalancesBigUnits, calculateLinearInterest, calculatePercentageFeeAmount, chainIdToHubAssetsMap, connectionAbi, deriveUserWalletAddress, encodeAddress, encodeContractCalls, erc20Abi, formatBasisPoints, formatEModeCategory, formatEModes, formatPercentage, formatReserve, formatReserveUSD, formatReserves, formatReservesAndIncentives, formatUserSummary, formatUserSummaryAndIncentives, getAllLegacybnUSDTokens, getAndFormatReserveEModes, getCompoundedBalance, getEvmViemChain, getHubAssetInfo, getHubChainConfig, getIconAddressBytes, getIntentRelayChainId, getLinearBalance, getMarketReferenceCurrencyAndUsdBalance, getMoneyMarketConfig, getOriginalAssetAddress, getPacket, getRandomBytes, getReserveNormalizedIncome, getReservesEModes, getSolanaAddressBytes, getSolverConfig, getSpokeChainIdFromIntentRelayChainId, getSupportedMoneyMarketTokens, getSupportedSolverTokens, getTransactionPackets, hexToBigInt, hubAssetToOriginalAssetMap, hubAssets, hubVaults, hubVaultsAddressSet, intentRelayChainIdToSpokeChainIdMap, isBalnMigrateParams, isConfiguredMoneyMarketConfig, isConfiguredSolverConfig, isEvmHubChainConfig, isEvmInitializedConfig, isEvmSpokeChainConfig, isEvmSpokeProvider, isEvmUninitializedBrowserConfig, isEvmUninitializedConfig, isEvmUninitializedPrivateKeyConfig, isIconAddress, isIconSpokeProvider, isIcxCreateRevertMigrationParams, isIcxMigrateParams, isInjectiveSpokeProvider, isIntentCreationFailedError, isIntentCreationUnknownError, isIntentPostExecutionFailedError, isIntentRelayChainId, isIntentSubmitTxFailedError, isJsonRpcPayloadResponse, isLegacybnUSDChainId, isLegacybnUSDToken, isMoneyMarketBorrowUnknownError, isMoneyMarketCreateBorrowIntentFailedError, isMoneyMarketCreateRepayIntentFailedError, isMoneyMarketCreateSupplyIntentFailedError, isMoneyMarketCreateWithdrawIntentFailedError, isMoneyMarketRelayTimeoutError, isMoneyMarketRepayUnknownError, isMoneyMarketReserveAsset, isMoneyMarketReserveHubAsset, isMoneyMarketSubmitTxFailedError, isMoneyMarketSupplyUnknownError, isMoneyMarketSupportedToken, isMoneyMarketWithdrawUnknownError, isNativeToken, isNewbnUSDChainId, isNewbnUSDToken, isPartnerFeeAmount, isPartnerFeePercentage, isResponseAddressType, isResponseSigningType, isSolanaSpokeProvider, isSolverSupportedToken, isSonicSpokeProvider, isStellarSpokeProvider, isSuiSpokeProvider, isUnifiedBnUSDMigrateParams, isValidChainHubAsset, isValidHubAsset, isValidIntentRelayChainId, isValidOriginalAssetAddress, isValidSpokeChainId, isWaitUntilIntentExecutedFailed, moneyMarketReserveAssets, moneyMarketReserveHubAssetsSet, moneyMarketSupportedTokens, nativeToUSD, newbnUSDSpokeChainIds, normalize, normalizeBN, normalizedToUsd, originalAssetTohubAssetMap, poolAbi, randomUint256, rayDiv, rayMul, rayPow, rayToWad, relayTxAndWaitPacket, requestAddress, requestJsonRpc, requestSigning, retry, sonicWalletFactoryAbi, spokeAssetManagerAbi, spokeChainConfig, spokeChainIdsSet, submitTransaction, supportedHubAssets, supportedHubChains, supportedSpokeChains, supportedTokensPerChain, uiPoolDataAbi, valueToBigNumber, valueToZDBigNumber, variableDebtTokenAbi, vaultTokenAbi, wadToRay, waitForTransactionReceipt, waitUntilIntentExecuted, walletFactoryAbi, wrappedSonicAbi };
|
|
16587
16632
|
//# sourceMappingURL=index.mjs.map
|
|
16588
16633
|
//# sourceMappingURL=index.mjs.map
|