@sodax/sdk 0.0.1-rc.27 → 0.0.1-rc.28
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 +821 -785
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -5
- package/dist/index.d.ts +19 -5
- package/dist/index.mjs +828 -794
- 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);
|
|
@@ -12083,7 +11992,7 @@ var SolverService = class {
|
|
|
12083
11992
|
params.srcAddress.toLowerCase() === walletAddress.toLowerCase(),
|
|
12084
11993
|
"srcAddress must be the same as wallet address"
|
|
12085
11994
|
);
|
|
12086
|
-
const creatorHubWalletAddress =
|
|
11995
|
+
const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
12087
11996
|
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {
|
|
12088
11997
|
const [txResult, intent, feeAmount, data] = await SonicSpokeService.createSwapIntent(
|
|
12089
11998
|
params,
|
|
@@ -12156,7 +12065,7 @@ var SolverService = class {
|
|
|
12156
12065
|
invariant11(isValidIntentRelayChainId(intent.srcChain), `Invalid intent.srcChain: ${intent.srcChain}`);
|
|
12157
12066
|
invariant11(isValidIntentRelayChainId(intent.dstChain), `Invalid intent.dstChain: ${intent.dstChain}`);
|
|
12158
12067
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
12159
|
-
const creatorHubWalletAddress =
|
|
12068
|
+
const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
12160
12069
|
const calls = [];
|
|
12161
12070
|
const intentsContract = this.config.intentsContract;
|
|
12162
12071
|
calls.push(EvmSolverService.encodeCancelIntent(intent, intentsContract));
|
|
@@ -12195,6 +12104,19 @@ var SolverService = class {
|
|
|
12195
12104
|
getIntentHash(intent) {
|
|
12196
12105
|
return EvmSolverService.getIntentHash(intent);
|
|
12197
12106
|
}
|
|
12107
|
+
/**
|
|
12108
|
+
* Gets the deadline for a swap by querying hub chain block timestamp and adding the deadline offset
|
|
12109
|
+
* @param {bigint} deadline (default: 5 minutes) - The deadline offset in seconds for the swap to be cancelled
|
|
12110
|
+
* @returns {bigint} The deadline for the swap as a sum of hub chain block timestamp and deadline offset
|
|
12111
|
+
*/
|
|
12112
|
+
async getSwapDeadline(deadline = DEFAULT_DEADLINE_OFFSET) {
|
|
12113
|
+
invariant11(deadline > 0n, "Deadline must be greater than 0");
|
|
12114
|
+
const block = await this.hubProvider.publicClient.getBlock({
|
|
12115
|
+
includeTransactions: false,
|
|
12116
|
+
blockTag: "latest"
|
|
12117
|
+
});
|
|
12118
|
+
return block.timestamp + deadline;
|
|
12119
|
+
}
|
|
12198
12120
|
};
|
|
12199
12121
|
|
|
12200
12122
|
// src/abis/icxSwap.abi.ts
|
|
@@ -13872,8 +13794,6 @@ var Sodax = class {
|
|
|
13872
13794
|
|
|
13873
13795
|
// src/services/hub/WalletAbstractionService.ts
|
|
13874
13796
|
var WalletAbstractionService = class {
|
|
13875
|
-
constructor() {
|
|
13876
|
-
}
|
|
13877
13797
|
/**
|
|
13878
13798
|
* Gets the hub wallet address for a user based on their spoke chain address.
|
|
13879
13799
|
* @param address - The user's address on the spoke chain
|
|
@@ -13881,14 +13801,14 @@ var WalletAbstractionService = class {
|
|
|
13881
13801
|
* @param hubProvider - The provider for interacting with the hub chain
|
|
13882
13802
|
* @returns The user's hub wallet address
|
|
13883
13803
|
*/
|
|
13884
|
-
static async
|
|
13804
|
+
static async getUserAbstractedWalletAddress(address, spokeProvider, hubProvider) {
|
|
13885
13805
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, address);
|
|
13886
13806
|
if (spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id) {
|
|
13887
13807
|
if (spokeProvider instanceof SonicSpokeProvider) {
|
|
13888
13808
|
return SonicSpokeService.getUserRouter(encodedAddress, spokeProvider);
|
|
13889
13809
|
}
|
|
13890
13810
|
throw new Error(
|
|
13891
|
-
"[
|
|
13811
|
+
"[getUserHubWalletAddress] Invalid spoke provider for matching hub id. Sonic spoke provider is required."
|
|
13892
13812
|
);
|
|
13893
13813
|
}
|
|
13894
13814
|
return EvmWalletAbstraction.getUserHubWalletAddress(
|
|
@@ -13898,6 +13818,111 @@ var WalletAbstractionService = class {
|
|
|
13898
13818
|
);
|
|
13899
13819
|
}
|
|
13900
13820
|
};
|
|
13821
|
+
async function retry(action, retryCount = DEFAULT_MAX_RETRY, delayMs = DEFAULT_RETRY_DELAY_MS) {
|
|
13822
|
+
do {
|
|
13823
|
+
try {
|
|
13824
|
+
return await action(retryCount);
|
|
13825
|
+
} catch (e) {
|
|
13826
|
+
retryCount--;
|
|
13827
|
+
if (retryCount <= 0) {
|
|
13828
|
+
console.error(`Failed to perform operation even after ${DEFAULT_MAX_RETRY} attempts.. Throwing origin error..`);
|
|
13829
|
+
throw e;
|
|
13830
|
+
}
|
|
13831
|
+
}
|
|
13832
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
13833
|
+
} while (retryCount > 0);
|
|
13834
|
+
throw new Error(`Retry exceeded MAX_RETRY_DEFAULT=${DEFAULT_MAX_RETRY}`);
|
|
13835
|
+
}
|
|
13836
|
+
function getRandomBytes(length) {
|
|
13837
|
+
const array = new Uint8Array(length);
|
|
13838
|
+
for (let i = 0; i < length; i++) {
|
|
13839
|
+
array[i] = Math.floor(Math.random() * 256);
|
|
13840
|
+
}
|
|
13841
|
+
return array;
|
|
13842
|
+
}
|
|
13843
|
+
function randomUint256() {
|
|
13844
|
+
const bytes = getRandomBytes(32);
|
|
13845
|
+
let hex = "";
|
|
13846
|
+
for (const byte of bytes) {
|
|
13847
|
+
hex += byte.toString(16).padStart(2, "0") ?? "";
|
|
13848
|
+
}
|
|
13849
|
+
return BigInt(`0x${hex}`);
|
|
13850
|
+
}
|
|
13851
|
+
function calculatePercentageFeeAmount(amount, percentage) {
|
|
13852
|
+
return amount * BigInt(percentage) / FEE_PERCENTAGE_SCALE;
|
|
13853
|
+
}
|
|
13854
|
+
function calculateFeeAmount(inputAmount, fee) {
|
|
13855
|
+
if (!fee) {
|
|
13856
|
+
return 0n;
|
|
13857
|
+
}
|
|
13858
|
+
invariant11(inputAmount > 0n, "Input amount must be greater than 0");
|
|
13859
|
+
let feeAmount = 0n;
|
|
13860
|
+
if (isPartnerFeeAmount(fee)) {
|
|
13861
|
+
invariant11(
|
|
13862
|
+
fee.amount >= 0 && fee.amount <= inputAmount,
|
|
13863
|
+
`Fee amount must be greater than 0 and less than or equal to the input amount: ${fee.amount}`
|
|
13864
|
+
);
|
|
13865
|
+
feeAmount = fee.amount;
|
|
13866
|
+
} else if (isPartnerFeePercentage(fee)) {
|
|
13867
|
+
invariant11(
|
|
13868
|
+
fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,
|
|
13869
|
+
`Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`
|
|
13870
|
+
);
|
|
13871
|
+
feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);
|
|
13872
|
+
}
|
|
13873
|
+
return feeAmount;
|
|
13874
|
+
}
|
|
13875
|
+
function adjustAmountByFee(amount, fee, quoteType) {
|
|
13876
|
+
invariant11(amount > 0n, "Amount must be greater than 0");
|
|
13877
|
+
invariant11(quoteType === "exact_input" || quoteType === "exact_output", "Invalid quote type");
|
|
13878
|
+
if (quoteType === "exact_input") {
|
|
13879
|
+
return amount - calculateFeeAmount(amount, fee);
|
|
13880
|
+
}
|
|
13881
|
+
if (quoteType === "exact_output") {
|
|
13882
|
+
return amount + calculateFeeAmount(amount, fee);
|
|
13883
|
+
}
|
|
13884
|
+
throw new Error("Invalid quote type");
|
|
13885
|
+
}
|
|
13886
|
+
function BigIntToHex(value) {
|
|
13887
|
+
return `0x${value.toString(16)}`;
|
|
13888
|
+
}
|
|
13889
|
+
function encodeAddress(spokeChainId, address) {
|
|
13890
|
+
switch (spokeChainId) {
|
|
13891
|
+
case "0xa86a.avax":
|
|
13892
|
+
case "0x2105.base":
|
|
13893
|
+
case "0xa.optimism":
|
|
13894
|
+
case "0x38.bsc":
|
|
13895
|
+
case "0x89.polygon":
|
|
13896
|
+
case "0xa4b1.arbitrum":
|
|
13897
|
+
case "sonic":
|
|
13898
|
+
return address;
|
|
13899
|
+
case "injective-1":
|
|
13900
|
+
return toHex(Buffer.from(address, "utf-8"));
|
|
13901
|
+
case "0x1.icon":
|
|
13902
|
+
return toHex(Buffer.from(address.replace("cx", "01").replace("hx", "00") ?? "f8", "hex"));
|
|
13903
|
+
case "sui":
|
|
13904
|
+
return toHex(bcs.Address.serialize(address).toBytes());
|
|
13905
|
+
case "solana":
|
|
13906
|
+
return toHex(Buffer.from(new PublicKey(address).toBytes()));
|
|
13907
|
+
case "stellar":
|
|
13908
|
+
return `0x${Address.fromString(address).toScVal().toXDR("hex")}`;
|
|
13909
|
+
default:
|
|
13910
|
+
return address;
|
|
13911
|
+
}
|
|
13912
|
+
}
|
|
13913
|
+
function hexToBigInt(hex) {
|
|
13914
|
+
const trimmed = hex.trim().toLowerCase();
|
|
13915
|
+
const isValid = /^(0x)?[0-9a-f]+$/.test(trimmed);
|
|
13916
|
+
if (!isValid) {
|
|
13917
|
+
throw new Error(`Invalid hex string: "${hex}"`);
|
|
13918
|
+
}
|
|
13919
|
+
const normalized = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
|
|
13920
|
+
return BigInt(normalized);
|
|
13921
|
+
}
|
|
13922
|
+
async function deriveUserWalletAddress(spokeProvider, hubProvider, walletAddress) {
|
|
13923
|
+
const address = walletAddress ?? await spokeProvider.walletProvider.getWalletAddress();
|
|
13924
|
+
return spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id ? address : await WalletAbstractionService.getUserAbstractedWalletAddress(address, spokeProvider, hubProvider);
|
|
13925
|
+
}
|
|
13901
13926
|
var BigNumberZeroDecimal = BigNumber.clone({
|
|
13902
13927
|
DECIMAL_PLACES: 0,
|
|
13903
13928
|
ROUNDING_MODE: BigNumber.ROUND_DOWN
|
|
@@ -15258,11 +15283,7 @@ var MoneyMarketDataService = class {
|
|
|
15258
15283
|
*/
|
|
15259
15284
|
async getUserReservesData(spokeProvider) {
|
|
15260
15285
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15261
|
-
const hubWalletAddress = await
|
|
15262
|
-
walletAddress,
|
|
15263
|
-
spokeProvider,
|
|
15264
|
-
this.hubProvider
|
|
15265
|
-
);
|
|
15286
|
+
const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15266
15287
|
return this.uiPoolDataProviderService.getUserReservesData(hubWalletAddress);
|
|
15267
15288
|
}
|
|
15268
15289
|
/**
|
|
@@ -15293,11 +15314,7 @@ var MoneyMarketDataService = class {
|
|
|
15293
15314
|
*/
|
|
15294
15315
|
async getUserReservesHumanized(spokeProvider) {
|
|
15295
15316
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15296
|
-
const hubWalletAddress = await
|
|
15297
|
-
walletAddress,
|
|
15298
|
-
spokeProvider,
|
|
15299
|
-
this.hubProvider
|
|
15300
|
-
);
|
|
15317
|
+
const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15301
15318
|
return this.uiPoolDataProviderService.getUserReservesHumanized(hubWalletAddress);
|
|
15302
15319
|
}
|
|
15303
15320
|
/**
|
|
@@ -15739,34 +15756,44 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15739
15756
|
`Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`
|
|
15740
15757
|
);
|
|
15741
15758
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15742
|
-
const
|
|
15743
|
-
walletAddress,
|
|
15744
|
-
spokeProvider,
|
|
15745
|
-
this.hubProvider
|
|
15746
|
-
);
|
|
15759
|
+
const abstractedWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15747
15760
|
const data = this.buildSupplyData(
|
|
15748
15761
|
params.token,
|
|
15749
|
-
|
|
15762
|
+
abstractedWalletAddress,
|
|
15750
15763
|
params.amount,
|
|
15751
15764
|
spokeProvider.chainConfig.chain.id
|
|
15752
15765
|
);
|
|
15753
|
-
|
|
15754
|
-
|
|
15755
|
-
|
|
15756
|
-
|
|
15757
|
-
|
|
15758
|
-
|
|
15759
|
-
|
|
15760
|
-
|
|
15761
|
-
|
|
15762
|
-
|
|
15763
|
-
|
|
15764
|
-
|
|
15766
|
+
let txResult;
|
|
15767
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id && spokeProvider instanceof SonicSpokeProvider) {
|
|
15768
|
+
txResult = await SonicSpokeService.deposit(
|
|
15769
|
+
{
|
|
15770
|
+
from: walletAddress,
|
|
15771
|
+
token: params.token,
|
|
15772
|
+
amount: params.amount,
|
|
15773
|
+
data
|
|
15774
|
+
},
|
|
15775
|
+
spokeProvider,
|
|
15776
|
+
raw
|
|
15777
|
+
);
|
|
15778
|
+
} else {
|
|
15779
|
+
txResult = await SpokeService.deposit(
|
|
15780
|
+
{
|
|
15781
|
+
from: walletAddress,
|
|
15782
|
+
to: abstractedWalletAddress,
|
|
15783
|
+
token: params.token,
|
|
15784
|
+
amount: params.amount,
|
|
15785
|
+
data
|
|
15786
|
+
},
|
|
15787
|
+
spokeProvider,
|
|
15788
|
+
this.hubProvider,
|
|
15789
|
+
raw
|
|
15790
|
+
);
|
|
15791
|
+
}
|
|
15765
15792
|
return {
|
|
15766
15793
|
ok: true,
|
|
15767
15794
|
value: txResult,
|
|
15768
15795
|
data: {
|
|
15769
|
-
address:
|
|
15796
|
+
address: abstractedWalletAddress,
|
|
15770
15797
|
payload: data
|
|
15771
15798
|
}
|
|
15772
15799
|
};
|
|
@@ -15895,11 +15922,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15895
15922
|
);
|
|
15896
15923
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
15897
15924
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);
|
|
15898
|
-
const hubWallet = await
|
|
15899
|
-
walletAddress,
|
|
15900
|
-
spokeProvider,
|
|
15901
|
-
this.hubProvider
|
|
15902
|
-
);
|
|
15925
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
15903
15926
|
const data = this.buildBorrowData(
|
|
15904
15927
|
hubWallet,
|
|
15905
15928
|
encodedAddress,
|
|
@@ -15907,7 +15930,12 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
15907
15930
|
params.amount,
|
|
15908
15931
|
spokeProvider.chainConfig.chain.id
|
|
15909
15932
|
);
|
|
15910
|
-
|
|
15933
|
+
let txResult;
|
|
15934
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {
|
|
15935
|
+
txResult = await SonicSpokeService.callWallet(data, spokeProvider);
|
|
15936
|
+
} else {
|
|
15937
|
+
txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
15938
|
+
}
|
|
15911
15939
|
return {
|
|
15912
15940
|
ok: true,
|
|
15913
15941
|
value: txResult,
|
|
@@ -16030,11 +16058,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16030
16058
|
);
|
|
16031
16059
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
16032
16060
|
const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);
|
|
16033
|
-
const hubWallet = await
|
|
16034
|
-
walletAddress,
|
|
16035
|
-
spokeProvider,
|
|
16036
|
-
this.hubProvider
|
|
16037
|
-
);
|
|
16061
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
16038
16062
|
let data;
|
|
16039
16063
|
if (spokeProvider instanceof SonicSpokeProvider) {
|
|
16040
16064
|
const withdrawInfo = await SonicSpokeService.getWithdrawInfo(
|
|
@@ -16060,7 +16084,7 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16060
16084
|
spokeProvider.chainConfig.chain.id
|
|
16061
16085
|
);
|
|
16062
16086
|
}
|
|
16063
|
-
const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
16087
|
+
const txResult = spokeProvider instanceof SonicSpokeProvider ? await SonicSpokeService.callWallet(data, spokeProvider, raw) : await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);
|
|
16064
16088
|
return {
|
|
16065
16089
|
ok: true,
|
|
16066
16090
|
value: txResult,
|
|
@@ -16184,24 +16208,34 @@ var MoneyMarketService = class _MoneyMarketService {
|
|
|
16184
16208
|
`Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`
|
|
16185
16209
|
);
|
|
16186
16210
|
const walletAddress = await spokeProvider.walletProvider.getWalletAddress();
|
|
16187
|
-
const hubWallet = await
|
|
16188
|
-
walletAddress,
|
|
16189
|
-
spokeProvider,
|
|
16190
|
-
this.hubProvider
|
|
16191
|
-
);
|
|
16211
|
+
const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);
|
|
16192
16212
|
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
|
-
|
|
16213
|
+
let txResult;
|
|
16214
|
+
if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id && spokeProvider instanceof SonicSpokeProvider) {
|
|
16215
|
+
txResult = await SonicSpokeService.deposit(
|
|
16216
|
+
{
|
|
16217
|
+
from: walletAddress,
|
|
16218
|
+
token: params.token,
|
|
16219
|
+
amount: params.amount,
|
|
16220
|
+
data
|
|
16221
|
+
},
|
|
16222
|
+
spokeProvider,
|
|
16223
|
+
raw
|
|
16224
|
+
);
|
|
16225
|
+
} else {
|
|
16226
|
+
txResult = await SpokeService.deposit(
|
|
16227
|
+
{
|
|
16228
|
+
from: walletAddress,
|
|
16229
|
+
to: hubWallet,
|
|
16230
|
+
token: params.token,
|
|
16231
|
+
amount: params.amount,
|
|
16232
|
+
data
|
|
16233
|
+
},
|
|
16234
|
+
spokeProvider,
|
|
16235
|
+
this.hubProvider,
|
|
16236
|
+
raw
|
|
16237
|
+
);
|
|
16238
|
+
}
|
|
16205
16239
|
return {
|
|
16206
16240
|
ok: true,
|
|
16207
16241
|
value: txResult,
|
|
@@ -16583,6 +16617,6 @@ var SolverIntentErrorCode = /* @__PURE__ */ ((SolverIntentErrorCode2) => {
|
|
|
16583
16617
|
return SolverIntentErrorCode2;
|
|
16584
16618
|
})(SolverIntentErrorCode || {});
|
|
16585
16619
|
|
|
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 };
|
|
16620
|
+
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
16621
|
//# sourceMappingURL=index.mjs.map
|
|
16588
16622
|
//# sourceMappingURL=index.mjs.map
|