@sodax/sdk 0.0.1-rc.9 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +228 -68
- package/dist/index.cjs +16324 -8317
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8638 -4615
- package/dist/index.d.ts +8638 -4615
- package/dist/index.mjs +16214 -8286
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -29
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/abis/asset-manager.abi.ts","../src/abis/connection.abi.ts","../src/abis/erc20.abi.ts","../src/abis/pool.abi.ts","../src/abis/spokeAssetManager.abi.ts","../src/abis/uiPoolData.abi.ts","../src/abis/vaultToken.abi.ts","../src/abis/walletFactory.abi.ts","../src/abis/intents.abi.ts","../src/abis/sonicWalletFactory.abi.ts","../src/abis/wrappedSonic.abi.ts","../src/abis/variableDebtToken.abi.ts","../src/constants.ts","../src/entities/cosmos/CW20Token.ts","../src/entities/cosmos/CWSpokeProvider.ts","../src/entities/icon/IconSpokeProvider.ts","../src/entities/icon/utils.ts","../src/entities/Providers.ts","../src/entities/stellar/StellarSpokeProvider.ts","../src/entities/sui/SuiSpokeProvider.ts","../src/entities/solana/SolanaWalletProvider.ts","../src/entities/solana/SolanaSpokeProvider.ts","../src/entities/solana/utils/utils.ts","../src/entities/icon/HanaWalletConnector.ts","../src/utils/evm-utils.ts","../src/services/shared/Erc20Service.ts","../src/services/hub/EvmVaultTokenService.ts","../src/services/hub/EvmAssetManagerService.ts","../src/services/hub/EvmWalletAbstraction.ts","../src/services/hub/WalletAbstractionService.ts","../src/utils/shared-utils.ts","../src/services/moneyMarket/MoneyMarketService.ts","../src/services/spoke/EvmSpokeService.ts","../src/services/spoke/CWSpokeService.ts","../src/services/spoke/IconSpokeService.ts","../src/entities/solana/Configs.ts","../src/entities/solana/pda/pda.ts","../src/services/spoke/SolanaSpokeService.ts","../src/services/spoke/StellarSpokeService.ts","../src/services/spoke/SuiSpokeService.ts","../src/services/spoke/SonicSpokeService.ts","../src/guards.ts","../src/services/spoke/SpokeService.ts","../src/services/intentRelay/IntentRelayApiService.ts","../src/services/solver/EvmSolverService.ts","../src/services/solver/SolverApiService.ts","../src/services/solver/SolverService.ts","../src/entities/Sodax.ts","../src/types.ts"],"names":["isNative","SONIC_MAINNET_CHAIN_ID","rpc","StellarRpc","coins","coin","toHex","SOLANA_MAINNET_CHAIN_ID","erc20Abi","encodeFunctionData","invariant","IconSdk","IconSdkRaw2","IconSdkRaw","Connection","PublicKey","fromHex","packet","solverConfig","encodeAbiParameters","IntentDataType","IntentStatusCode","IntentErrorCode"],"mappings":"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","file":"index.mjs","sourcesContent":["export const assetManagerAbi = [\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assetImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assetInfo',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'spokeAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assets',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'configureAssetManager',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'connection',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IConnection',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deployAsset',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: '_connection',\n type: 'address',\n internalType: 'contract IConnection',\n },\n {\n name: '_walletFactory',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n {\n name: '_assetImplementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'overrideToken',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'asset',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'receiveMessage',\n inputs: [\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signatures',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signedMessages',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'spokeAssetManager',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'upgradeToken',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'impl',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'walletFactory',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'HookFailed',\n inputs: [\n {\n name: 'wallet',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'reason',\n type: 'bytes',\n indexed: false,\n internalType: 'bytes',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const;\n","export const connectionAbi = [\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'dstChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'dstAddress',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n ],\n name: 'sendMessage',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'srcChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'srcAddress',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'connSn',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n {\n internalType: 'bytes[]',\n name: 'signedMessages',\n type: 'bytes[]',\n },\n ],\n name: 'verifyMessage',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signedMessages',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n] as const;\n","export const erc20Abi = [\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalSupply',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'ERC20InsufficientAllowance',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientBalance',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'balance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidApprover',\n inputs: [\n {\n name: 'approver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidReceiver',\n inputs: [\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSender',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSpender',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n] as const;\n","export const poolAbi = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'mintUnbacked',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'backUnbacked',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'supply',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n ],\n name: 'borrow',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n ],\n name: 'repay',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'deadline',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'permitV',\n type: 'uint8',\n },\n {\n internalType: 'bytes32',\n name: 'permitR',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'permitS',\n type: 'bytes32',\n },\n ],\n name: 'repayWithPermit',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n ],\n name: 'repayWithATokens',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'useAsCollateral',\n type: 'bool',\n },\n ],\n name: 'setUserUseReserveAsCollateral',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'collateralAsset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'debtAsset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'debtToCover',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'receiveAToken',\n type: 'bool',\n },\n ],\n name: 'liquidationCall',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address[]',\n name: 'assets',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'amounts',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'interestRateModes',\n type: 'uint256[]',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoan',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoanSimple',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserAccountData',\n outputs: [\n {\n internalType: 'uint256',\n name: 'totalCollateralBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'totalDebtBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'availableBorrowsBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'currentLiquidationThreshold',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'ltv',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'healthFactor',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'aTokenAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'variableDebtAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'interestRateStrategyAddress',\n type: 'address',\n },\n ],\n name: 'initReserve',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'dropReserve',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'rateStrategyAddress',\n type: 'address',\n },\n ],\n name: 'setReserveInterestRateStrategyAddress',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'syncIndexesState',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'syncRatesState',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'struct DataTypes.ReserveConfigurationMap',\n name: 'configuration',\n type: 'tuple',\n },\n ],\n name: 'setConfiguration',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getConfiguration',\n outputs: [\n {\n internalType: 'struct DataTypes.ReserveConfigurationMap',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserConfiguration',\n outputs: [\n {\n internalType: 'struct DataTypes.UserConfigurationMap',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveNormalizedIncome',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveNormalizedVariableDebt',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveData',\n outputs: [\n {\n components: [\n { name: 'configuration', type: 'uint256' },\n { name: 'liquidityIndex', type: 'uint128' },\n { name: 'currentLiquidityRate', type: 'uint128' },\n { name: 'variableBorrowIndex', type: 'uint128' },\n { name: 'currentVariableBorrowRate', type: 'uint128' },\n { name: 'currentStableBorrowRate', type: 'uint128' },\n { name: 'lastUpdateTimestamp', type: 'uint40' },\n { name: 'id', type: 'uint16' },\n { name: 'aTokenAddress', type: 'address' },\n { name: 'stableDebtTokenAddress', type: 'address' },\n { name: 'variableDebtTokenAddress', type: 'address' },\n { name: 'interestRateStrategyAddress', type: 'address' },\n { name: 'accruedToTreasury', type: 'uint128' },\n { name: 'unbacked', type: 'uint128' },\n { name: 'isolationModeTotalDebt', type: 'uint128' },\n ],\n internalType: 'struct DataTypes.ReserveDataLegacy',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getVirtualUnderlyingBalance',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'rescueTokens',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address[]',\n name: 'assets',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'amounts',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'interestRateModes',\n type: 'uint256[]',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoan',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'ADDRESSES_PROVIDER',\n outputs: [\n {\n internalType: 'contract IPoolAddressesProvider',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'FLASHLOAN_PREMIUM_TOTAL',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'BRIDGE_PROTOCOL_FEE',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'FLASHLOAN_PREMIUM_TO_PROTOCOL',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MAX_NUMBER_RESERVES',\n outputs: [\n {\n internalType: 'uint16',\n name: '',\n type: 'uint16',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getReservesList',\n outputs: [\n {\n internalType: 'address[]',\n name: '',\n type: 'address[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getReservesCount',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","export const spokeAssetManagerAbi = [\n {\n inputs: [],\n name: 'InsufficientValue',\n type: 'error',\n },\n {\n inputs: [],\n name: 'TransferFailed',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'oldRateLimit',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newRateLimit',\n type: 'address',\n },\n ],\n name: 'RateLimitUpdated',\n type: 'event',\n },\n {\n inputs: [],\n name: 'connection',\n outputs: [\n {\n internalType: 'contract IConnection',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getImplementation',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'hubAssetManager',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'hubChainId',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IConnection',\n name: '_connection',\n type: 'address',\n },\n {\n internalType: 'contract RateLimit',\n name: '_rateLimit',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: '_hubAssetManager',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: '_hubChainId',\n type: 'uint256',\n },\n ],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rateLimit',\n outputs: [\n {\n internalType: 'contract RateLimit',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'nonce',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'srcChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'srcAddress',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n {\n internalType: 'bytes[]',\n name: 'signatures',\n type: 'bytes[]',\n },\n ],\n name: 'recvMessage',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract RateLimit',\n name: '_rateLimit',\n type: 'address',\n },\n ],\n name: 'setRateLimit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'to',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n] as const;\n","export const uiPoolDataAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_networkBaseTokenPriceInUsdProxyAggregator',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n {\n name: '_marketReferenceCurrencyPriceInUsdProxyAggregator',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'ETH_CURRENCY_UNIT',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'MKR_ADDRESS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'bytes32ToString',\n inputs: [\n {\n name: '_bytes32',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'getEModes',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.Emode[]',\n components: [\n {\n name: 'id',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'eMode',\n type: 'tuple',\n internalType: 'struct DataTypes.EModeCategory',\n components: [\n {\n name: 'ltv',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'liquidationThreshold',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'liquidationBonus',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'collateralBitmap',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'label',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'borrowableBitmap',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getReservesData',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.AggregatedReserveData[]',\n components: [\n {\n name: 'underlyingAsset',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'symbol',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'decimals',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'baseLTVasCollateral',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveLiquidationThreshold',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveLiquidationBonus',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveFactor',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'usageAsCollateralEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'borrowingEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isActive',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isFrozen',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'liquidityIndex',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'variableBorrowIndex',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'liquidityRate',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'variableBorrowRate',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'lastUpdateTimestamp',\n type: 'uint40',\n internalType: 'uint40',\n },\n {\n name: 'aTokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'variableDebtTokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'interestRateStrategyAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'availableLiquidity',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'totalScaledVariableDebt',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'priceInMarketReferenceCurrency',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'priceOracle',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'variableRateSlope1',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'variableRateSlope2',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'baseVariableBorrowRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'optimalUsageRatio',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isPaused',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isSiloedBorrowing',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'accruedToTreasury',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'unbacked',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'isolationModeTotalDebt',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'flashLoanEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'debtCeiling',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'debtCeilingDecimals',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'borrowCap',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'supplyCap',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'borrowableInIsolation',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'virtualAccActive',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'virtualUnderlyingBalance',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n {\n name: '',\n type: 'tuple',\n internalType: 'struct IUiPoolDataProviderV3.BaseCurrencyInfo',\n components: [\n {\n name: 'marketReferenceCurrencyUnit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'marketReferenceCurrencyPriceInUsd',\n type: 'int256',\n internalType: 'int256',\n },\n {\n name: 'networkBaseTokenPriceInUsd',\n type: 'int256',\n internalType: 'int256',\n },\n {\n name: 'networkBaseTokenPriceDecimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getReservesList',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getUserReservesData',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.UserReserveData[]',\n components: [\n {\n name: 'underlyingAsset',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'scaledATokenBalance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'usageAsCollateralEnabledOnUser',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'scaledVariableDebt',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'marketReferenceCurrencyPriceInUsdProxyAggregator',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'networkBaseTokenPriceInUsdProxyAggregator',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","export const vaultTokenAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'FEE_DENOMINATOR',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'addSupportedToken',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'credit',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcToken',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'currentDebit',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'debit',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstToken',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'depositAndBurn',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'feeRecipient',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getAllTokenInfo',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct VaultToken.TokenInfo[]',\n components: [\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isSupported',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n },\n {\n name: '',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getVaultReserves',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n {\n name: '',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'symbol',\n type: 'string',\n internalType: 'string',\n },\n {\n name: '_feeRecipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_rateLimits',\n type: 'address',\n internalType: 'contract IRateLimits',\n },\n {\n name: '_xTokenManager',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'maxDebit',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'rateLimits',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IRateLimits',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setDebit',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'token',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setFeeRecipient',\n inputs: [\n {\n name: '_feeRecipient',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setMaxDebit',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'token',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setMaxDeposit',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setXTokenManager',\n inputs: [\n {\n name: '_xTokenManager',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'supportedTokens',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'tokenInfo',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isSupported',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalSupply',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'updateToken',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'withdraw',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'xTokenManager',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientAllowance',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientBalance',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'balance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidApprover',\n inputs: [\n {\n name: 'approver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidReceiver',\n inputs: [\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSender',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSpender',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const;\n","export const walletFactoryAbi = [\n {\n type: 'function',\n name: 'getDeployedAddress',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'user',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: 'computedAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","export const IntentsAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'HUB_CHAIN_ID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'addSpoke',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'spokeAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'assetManager',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IAssetManager',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'cancelIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'connection',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IConnection',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'createIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'externalFills',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fillIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n {\n name: '_inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_externalFillId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: '_walletFactory',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n {\n name: '_assetManager',\n type: 'address',\n internalType: 'contract IAssetManager',\n },\n {\n name: '_connection',\n type: 'address',\n internalType: 'contract IConnection',\n },\n {\n name: '_HUB_CHAIN_ID',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'intentStates',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: 'exists',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'remainingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receivedOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingPayment',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingIntentStates',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: 'pendingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingPayouts',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'preFillIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n {\n name: '_inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_externalFillId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signatures',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setWhitelistedSolver',\n inputs: [\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'whitelisted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'spokes',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'walletFactory',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'whitelistedSolvers',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'ExternalFillFailed',\n inputs: [\n {\n name: 'fillId',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'fill',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.ExternalFill',\n components: [\n {\n name: 'intentHash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentCancelled',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentCreated',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n {\n name: 'intent',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentFilled',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n {\n name: 'intentState',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.IntentState',\n components: [\n {\n name: 'exists',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'remainingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receivedOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingPayment',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FillAlreadyExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'IntentAlreadyExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'IntentNotFound',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidAmount',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidOutputToken',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidSolver',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'PartialFillNotAllowed',\n inputs: [],\n },\n {\n type: 'error',\n name: 'PendingFillExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'SpokeNotConfigured',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n {\n type: 'error',\n name: 'Unauthorized',\n inputs: [],\n },\n] as const;\n","export const sonicWalletFactoryAbi = [\n { inputs: [{ internalType: 'address', name: 'target', type: 'address' }], name: 'AddressEmptyCode', type: 'error' },\n {\n inputs: [{ internalType: 'address', name: 'implementation', type: 'address' }],\n name: 'ERC1967InvalidImplementation',\n type: 'error',\n },\n { inputs: [], name: 'ERC1967NonPayable', type: 'error' },\n { inputs: [], name: 'FailedCall', type: 'error' },\n { inputs: [], name: 'InvalidInitialization', type: 'error' },\n { inputs: [], name: 'NotInitializing', type: 'error' },\n { inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], name: 'OwnableInvalidOwner', type: 'error' },\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'OwnableUnauthorizedAccount',\n type: 'error',\n },\n { inputs: [], name: 'UUPSUnauthorizedCallContext', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'slot', type: 'bytes32' }],\n name: 'UUPSUnsupportedProxiableUUID',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: 'uint64', name: 'version', type: 'uint64' }],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },\n { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },\n ],\n name: 'OwnershipTransferStarted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },\n { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: true, internalType: 'address', name: 'implementation', type: 'address' }],\n name: 'Upgraded',\n type: 'event',\n },\n {\n inputs: [],\n name: 'UPGRADE_INTERFACE_VERSION',\n outputs: [{ internalType: 'string', name: '', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'acceptOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [{ internalType: 'bytes32', name: 'salt', type: 'bytes32' }],\n name: 'deploy',\n outputs: [{ internalType: 'address', name: 'deployedAddress', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'user', type: 'address' }],\n name: 'getDeployedAddress',\n outputs: [{ internalType: 'address', name: 'computedAddress', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getImplementation',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'implementation',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'initialize', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingOwner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'proxiableUUID',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'registerMe', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n { inputs: [], name: 'renounceOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'addr', type: 'address' },\n { internalType: 'uint256', name: 'value', type: 'uint256' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n internalType: 'struct ISonicRouterWallet.ContractCall[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'route',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: '_newWalletImplementation', type: 'address' }],\n name: 'updateWalletImplementation',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'newImplementation', type: 'address' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n] as const;\n","export const wrappedSonicAbi = [\n {\n inputs: [],\n name: 'ERC20InvalidZeroDeposit',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'recipient',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'ERC20WithdrawFailed',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Deposit',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Withdrawal',\n type: 'event',\n },\n {\n stateMutability: 'payable',\n type: 'fallback',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'depositFor',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'deposit',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'withdraw',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'withdrawTo',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","export const variableDebtTokenAbi = [\n {\n inputs: [\n {\n name: 'delegatee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n name: 'approveDelegation',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n type: 'function',\n name: 'borrowAllowance',\n inputs: [\n {\n name: 'fromUser',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'toUser',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","import type { Address, Chain } from 'viem';\nimport { arbitrum, avalanche, base, bsc, nibiru, optimism, polygon, sonic } from 'viem/chains';\nimport type {\n CosmosSpokeChainConfig,\n EvmChainId,\n EvmHubChainConfig,\n EvmSpokeChainConfig,\n HubAssetInfo,\n IconSpokeChainConfig,\n IntentRelayChainId,\n MoneyMarketConfig,\n OriginalAssetAddress,\n SolanaChainConfig,\n SolverConfig,\n SonicSpokeChainConfig,\n StellarSpokeChainConfig,\n SuiSpokeChainConfig,\n VaultType,\n} from './index.js';\nimport {\n type ChainId,\n type Token,\n type SpokeChainId,\n AVALANCHE_MAINNET_CHAIN_ID,\n ARBITRUM_MAINNET_CHAIN_ID,\n BASE_MAINNET_CHAIN_ID,\n BSC_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n OPTIMISM_MAINNET_CHAIN_ID,\n POLYGON_MAINNET_CHAIN_ID,\n NIBIRU_MAINNET_CHAIN_ID,\n INJECTIVE_MAINNET_CHAIN_ID,\n SOLANA_MAINNET_CHAIN_ID,\n SUI_MAINNET_CHAIN_ID,\n STELLAR_MAINNET_CHAIN_ID,\n ICON_MAINNET_CHAIN_ID,\n type HubChainId,\n SPOKE_CHAIN_IDS,\n} from '@sodax/types';\n\nexport const DEFAULT_MAX_RETRY = 3;\nexport const DEFAULT_RELAY_TX_TIMEOUT = 60000; // 60 seconds\nexport const DEFAULT_RETRY_DELAY_MS = 2000;\nexport const ICON_TX_RESULT_WAIT_MAX_RETRY = 10;\nexport const MAX_UINT256 = (1n << 256n) - 1n;\nexport const FEE_PERCENTAGE_SCALE = 10000n; // 100% = 10000\n\nexport const VAULT_TOKEN_DECIMALS = 18;\n\n// NOTE: This is not the same as the actual chain ids (wormhole based ids), only used for intent relay\nexport const INTENT_RELAY_CHAIN_IDS = {\n AVAX: 6n,\n SUI: 21n,\n SONIC: 146n,\n STELLAR: 27n,\n INJ: 19n,\n SOL: 1n,\n ICON: 1768124270n,\n BASE: 30n,\n BINANCE: 4n,\n OPTIMISM: 24n,\n POLYGON: 5n,\n ARBITRUM: 23n,\n NIBIRU: 7235938n,\n} as const;\n\nexport const EVM_CHAIN_IDS = [\n AVALANCHE_MAINNET_CHAIN_ID,\n ARBITRUM_MAINNET_CHAIN_ID,\n BASE_MAINNET_CHAIN_ID,\n BSC_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n OPTIMISM_MAINNET_CHAIN_ID,\n POLYGON_MAINNET_CHAIN_ID,\n NIBIRU_MAINNET_CHAIN_ID,\n] as const;\n\nexport const EVM_SPOKE_CHAIN_IDS = [\n AVALANCHE_MAINNET_CHAIN_ID,\n ARBITRUM_MAINNET_CHAIN_ID,\n BASE_MAINNET_CHAIN_ID,\n BSC_MAINNET_CHAIN_ID,\n OPTIMISM_MAINNET_CHAIN_ID,\n POLYGON_MAINNET_CHAIN_ID,\n NIBIRU_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n] as const;\n\nconst ChainIdToIntentRelayChainId: Record<ChainId, IntentRelayChainId> = {\n [AVALANCHE_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.AVAX,\n [ARBITRUM_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.ARBITRUM,\n [BASE_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.BASE,\n [BSC_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.BINANCE,\n [INJECTIVE_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.INJ,\n [SONIC_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.SONIC,\n [OPTIMISM_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.OPTIMISM,\n [POLYGON_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.POLYGON,\n [SOLANA_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.SOL,\n [SUI_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.SUI,\n [STELLAR_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.STELLAR,\n [ICON_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.ICON,\n [NIBIRU_MAINNET_CHAIN_ID]: INTENT_RELAY_CHAIN_IDS.NIBIRU,\n};\n\nexport const getIntentRelayChainId = (chainId: ChainId): IntentRelayChainId => ChainIdToIntentRelayChainId[chainId];\n\nexport function getEvmViemChain(id: EvmChainId): Chain {\n switch (id) {\n case SONIC_MAINNET_CHAIN_ID:\n return sonic;\n case AVALANCHE_MAINNET_CHAIN_ID:\n return avalanche;\n case ARBITRUM_MAINNET_CHAIN_ID:\n return arbitrum;\n case BASE_MAINNET_CHAIN_ID:\n return base;\n case OPTIMISM_MAINNET_CHAIN_ID:\n return optimism;\n case BSC_MAINNET_CHAIN_ID:\n return bsc;\n case POLYGON_MAINNET_CHAIN_ID:\n return polygon;\n case NIBIRU_MAINNET_CHAIN_ID:\n return nibiru;\n default:\n throw new Error(`Unsupported EVM chain ID: ${id}`);\n }\n}\n\nconst hubChainConfig: Record<HubChainId, EvmHubChainConfig> = {\n [SONIC_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Sonic',\n id: SONIC_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x60c5681bD1DB4e50735c4cA3386005A4BA4937C0',\n hubWallet: '0xA0ed3047D358648F2C0583B415CffCA571FDB544',\n xTokenManager: '0x5bD2843de9D6b0e6A05d0FB742072274EA3C6CA3',\n },\n nativeToken: '0x0000000000000000000000000000000000000000',\n supportedTokens: [],\n } satisfies EvmHubChainConfig,\n} as const;\n\nexport const getHubChainConfig = (chainId: HubChainId): EvmHubChainConfig => hubChainConfig[chainId];\n\nexport const spokeChainConfig = {\n [SONIC_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Sonic',\n id: SONIC_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n walletRouter: '0xC67C3e55c665E78b25dc9829B3Aa5af47d914733',\n wrappedSonic: '0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38',\n },\n nativeToken: '0x0000000000000000000000000000000000000000',\n bnUSD: '0x6958a4CBFe11406E2a1c1d3a71A1971aD8B3b92F',\n supportedTokens: {\n Sonic: {\n symbol: 'Sonic',\n name: 'Sonic',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n WETH: {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n decimals: 18,\n address: '0x50c42dEAcD8Fc9773493ED674b675bE577f2634b',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894',\n },\n USDT: {\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 6,\n address: '0x6047828dc181963ba44974801FF68e538dA5eaF9',\n },\n wSonic: {\n symbol: 'wSonic',\n name: 'Wrapped Sonic',\n decimals: 18,\n address: '0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38',\n },\n },\n } as const satisfies SonicSpokeChainConfig,\n [SOLANA_MAINNET_CHAIN_ID]: {\n addresses: {\n assetManager: 'AnCCJjheynmGqPp6Vgat9DTirGKD4CtQzP8cwTYV8qKH',\n connection: 'GxS8i6D9qQjbSeniD487CnomUxU2pXt6V8P96T6MkUXB',\n rateLimit: '2Vyy3A3Teju2EMCkdnappEeWqBXyAaF5V2WsrU4hDtsk',\n testToken: '3Q2HS3png7fLaYerqCun3zw8rnBZo2Ksvdg6RHTyM4Ns',\n xTokenManager: '',\n },\n chain: { id: SOLANA_MAINNET_CHAIN_ID, name: 'Solana', type: 'SOLANA' },\n nativeToken: '11111111111111111111111111111111' as const,\n bnUSD: '3rSPCLNEF7Quw4wX8S1NyKivELoyij8eYA2gJwBgt4V5',\n supportedTokens: {\n SOL: {\n symbol: 'SOL',\n name: 'Solana',\n decimals: 9,\n address: '11111111111111111111111111111111',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 9,\n address: '3rSPCLNEF7Quw4wX8S1NyKivELoyij8eYA2gJwBgt4V5',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n },\n },\n gasPrice: '500000',\n rpcUrl: 'https://api.mainnet-beta.solana.com',\n wsUrl: 'https://api.mainnet-beta.solana.com',\n walletAddress: '',\n } as const satisfies SolanaChainConfig,\n [AVALANCHE_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Avalanche',\n id: AVALANCHE_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x5bDD1E1C5173F4c912cC919742FB94A55ECfaf86',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0x6958a4CBFe11406E2a1c1d3a71A1971aD8B3b92F',\n supportedTokens: {\n AVAX: {\n symbol: 'AVAX',\n name: 'Avalanche',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0x6958a4CBFe11406E2a1c1d3a71A1971aD8B3b92F',\n },\n USDT: {\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 6,\n address: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n },\n },\n } as const satisfies EvmSpokeChainConfig,\n [NIBIRU_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Nibiru',\n id: NIBIRU_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x6958a4CBFe11406E2a1c1d3a71A1971aD8B3b92F',\n connection: '0x772FFE538E45b2cDdFB5823041EC26C44815B9AB',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0x043fb7e23350Dd5b77dE5E228B528763DEcb9131',\n supportedTokens: {\n NIBI: {\n symbol: 'NIBI',\n name: 'Nibiru',\n decimals: 6,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0x043fb7e23350Dd5b77dE5E228B528763DEcb9131',\n },\n },\n } as const satisfies EvmSpokeChainConfig,\n [ARBITRUM_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Arbitrum',\n id: ARBITRUM_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x348BE44F63A458be9C1b13D6fD8e99048F297Bc3',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0xA256dd181C3f6E5eC68C6869f5D50a712d47212e',\n supportedTokens: {\n ETH: {\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0xA256dd181C3f6E5eC68C6869f5D50a712d47212e',\n },\n WETH: {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n decimals: 18,\n address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n },\n wstETH: {\n symbol: 'wstETH',\n name: 'Wrapped stETH',\n decimals: 18,\n address: '0x5979D7b546E38E414F7E9822514be443A4800529',\n },\n weETH: {\n symbol: 'weETH',\n name: 'Wrapped eETH',\n decimals: 18,\n address: '0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe',\n },\n tBTC: {\n symbol: 'tBTC',\n name: 'Arbitrum tBTC v2',\n decimals: 18,\n address: '0x6c84a8f1c29108F47a79964b5Fe888D4f4D0dE40',\n },\n WBTC: {\n symbol: 'WBTC',\n name: 'Wrapped BTC',\n decimals: 8,\n address: '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin (USDC)',\n decimals: 6,\n address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n },\n USDT: {\n symbol: 'USDT',\n name: 'TetherToken',\n decimals: 6,\n address: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n },\n } as const,\n } as const satisfies EvmSpokeChainConfig,\n [BASE_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'BASE',\n id: BASE_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x348BE44F63A458be9C1b13D6fD8e99048F297Bc3',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0xAcfab3F31C0a18559D78556BBf297EC29c6cf8aa',\n supportedTokens: {\n ETH: {\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0xAcfab3F31C0a18559D78556BBf297EC29c6cf8aa',\n },\n weETH: {\n symbol: 'weETH',\n name: 'Wrapped eETH',\n decimals: 18,\n address: '0x04c0599ae5a44757c0af6f9ec3b93da8976c150a',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n wstETH: {\n symbol: 'wstETH',\n name: 'Wrapped stETH',\n decimals: 18,\n address: '0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452',\n },\n cbBTC: {\n symbol: 'cbBTC',\n name: 'Coinbase Wrapped BTC',\n decimals: 8,\n address: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf',\n },\n } as const,\n } as const satisfies EvmSpokeChainConfig,\n [OPTIMISM_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Optimism',\n id: OPTIMISM_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x348BE44F63A458be9C1b13D6fD8e99048F297Bc3',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0xF4f7dC27c17470a26d0de9039Cf0EA5045F100E8',\n supportedTokens: {\n ETH: {\n symbol: 'ETH',\n name: 'Ethereum',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0xF4f7dC27c17470a26d0de9039Cf0EA5045F100E8',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n },\n wstETH: {\n symbol: 'wstETH',\n name: 'Wrapped stETH',\n decimals: 18,\n address: '0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb',\n },\n weETH: {\n symbol: 'weETH',\n name: 'Wrapped eETH',\n decimals: 18,\n address: '0x5A7fACB970D094B6C7FF1df0eA68D99E6e73CBFF',\n },\n USDT: {\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 6,\n address: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n },\n } as const,\n } as const satisfies EvmSpokeChainConfig,\n [BSC_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'BSC',\n id: BSC_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x348BE44F63A458be9C1b13D6fD8e99048F297Bc3',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0x8428FedC020737a5A2291F46cB1B80613eD71638',\n supportedTokens: {\n BNB: {\n symbol: 'BNB',\n name: 'BNB',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0x8428FedC020737a5A2291F46cB1B80613eD71638',\n },\n ETHB: {\n symbol: 'ETHB',\n name: 'Ethereum BSC',\n decimals: 18,\n address: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n },\n BTCB: {\n symbol: 'BTCB',\n name: 'Bitcoin BSC',\n decimals: 18,\n address: '0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 18,\n address: '0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d',\n },\n },\n } as const satisfies EvmSpokeChainConfig,\n [POLYGON_MAINNET_CHAIN_ID]: {\n chain: {\n name: 'Polygon',\n id: POLYGON_MAINNET_CHAIN_ID,\n type: 'EVM',\n },\n addresses: {\n assetManager: '0x348BE44F63A458be9C1b13D6fD8e99048F297Bc3',\n connection: '0x4555aC13D7338D9E671584C1D118c06B2a3C88eD',\n },\n nativeToken: '0x0000000000000000000000000000000000000000' as const,\n bnUSD: '0x39E77f86C1B1f3fbAb362A82b49D2E86C09659B4',\n supportedTokens: {\n POL: {\n symbol: 'POL',\n name: 'Polygon',\n decimals: 18,\n address: '0x0000000000000000000000000000000000000000',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: '0x39E77f86C1B1f3fbAb362A82b49D2E86C09659B4',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n },\n } as const,\n } as const satisfies EvmSpokeChainConfig,\n [INJECTIVE_MAINNET_CHAIN_ID]: {\n addresses: {\n assetManager: 'inj1dg6tm62uup53wn2kn97caeqfwt0sukx3qjk8rw',\n connection: 'inj1eexvfglsptxwfj9hft96xcnsdrvr7d7dalcm8w',\n rateLimit: 'inj1x8p2h56edcdrm9tzx7a7zkwe0l334klgrxpqyk',\n testToken: '',\n xTokenManager: '',\n },\n chain: {\n id: INJECTIVE_MAINNET_CHAIN_ID,\n name: 'Injective',\n type: 'INJECTIVE',\n },\n nativeToken: 'inj' as const,\n bnUSD: 'factory/inj1d036ftaatxpkqsu9hja8r24rv3v33chz3appxp/bnUSD',\n networkId: 'injective-1',\n supportedTokens: {\n INJ: {\n symbol: 'INJ',\n name: 'Injective',\n decimals: 18,\n address: 'inj',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: 'factory/inj1d036ftaatxpkqsu9hja8r24rv3v33chz3appxp/bnUSD',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: 'ibc/2CBC2EA121AE42563B08028466F37B600F2D7D4282342DE938283CC3FB2BC00E',\n },\n },\n gasPrice: '500000000inj',\n network: 'Mainnet',\n prefix: 'inj',\n isBrowser: false,\n rpcUrl: 'https://injective-rpc.publicnode.com:443',\n walletAddress: '',\n } as const satisfies CosmosSpokeChainConfig,\n [STELLAR_MAINNET_CHAIN_ID]: {\n addresses: {\n connection: 'CDFQDDPUPAM3XPGORHDOEFRNLMKOH3N3X6XTXNLSXJQXIU3RVCM3OPEP',\n assetManager: 'CCGF33A4CO6D3BXFEKPXVCFCZBK76I3AQOZK6KIKRPAWAZR3632WHCJ3',\n xTokenManager: '',\n rateLimit: 'CB6G3ULISTTBPXUN3BI6ADHQGWJEN7BPQINHL45TCB6TDFM5QWU24HAY',\n testToken: '',\n },\n supportedTokens: {\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 7,\n address: 'CD6YBFFWMU2UJHX2NGRJ7RN76IJVTCC7MRA46DUBXNB7E6W7H7JRJ2CX',\n },\n XLM: {\n symbol: 'XLM',\n name: 'Stellar Lumens',\n decimals: 7,\n address: 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 7,\n address: 'CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75',\n },\n },\n nativeToken: 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA' as const,\n bnUSD: 'CD6YBFFWMU2UJHX2NGRJ7RN76IJVTCC7MRA46DUBXNB7E6W7H7JRJ2CX',\n rpc_url: 'https://rpc.ankr.com/stellar_soroban',\n chain: {\n name: 'soroban-mainnet',\n id: STELLAR_MAINNET_CHAIN_ID,\n type: 'STELLAR',\n },\n } as const satisfies StellarSpokeChainConfig,\n [SUI_MAINNET_CHAIN_ID]: {\n addresses: {\n connection:\n '0xf3b1e696a66d02cb776dc15aae73c68bc8f03adcb6ba0ec7f6332d9d90a6a3d2::connectionv3::0x3ee76d13909ac58ae13baab4c9be5a5142818d9a387aed641825e5d4356969bf',\n assetManager:\n '0x897f911a4b7691870a1a2513af7e85fdee8de275615c77068fd8b90b8e78c678::asset_manager::0xcb7346339340b7f8dea40fcafb70721dc2fcfa7e8626a89fd954d46c1f928b61',\n xTokenManager: '',\n rateLimit: '',\n testToken: '',\n },\n supportedTokens: {\n SUI: {\n symbol: 'SUI',\n name: 'SUI',\n decimals: 9,\n address: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 9,\n address: '0xff4de2b2b57dd7611d2812d231a467d007b702a101fd5c7ad3b278257cddb507::bnusd::BNUSD',\n },\n USDC: {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n },\n },\n nativeToken: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI' as const,\n bnUSD: '0xff4de2b2b57dd7611d2812d231a467d007b702a101fd5c7ad3b278257cddb507::bnusd::BNUSD',\n rpc_url: 'https://fullnode.mainnet.sui.io:443',\n chain: {\n name: 'Sui',\n id: SUI_MAINNET_CHAIN_ID,\n type: 'SUI',\n },\n } as const satisfies SuiSpokeChainConfig,\n [ICON_MAINNET_CHAIN_ID]: {\n addresses: {\n assetManager: 'cx1be33c283c7dc7617181d1b21a6a2309e71b1ee7',\n connection: 'cxe5cdf3b0f26967b0efc72d470d57bbf534268f94',\n rateLimit: 'cxbbdcea9e6757023a046067ba8daa3c4c50304358',\n },\n chain: {\n id: ICON_MAINNET_CHAIN_ID,\n name: 'ICON Mainnet',\n type: 'ICON',\n },\n supportedTokens: {\n ICX: {\n symbol: 'ICX',\n name: 'ICON',\n decimals: 18,\n address: 'cx0000000000000000000000000000000000000000',\n },\n wICX: {\n symbol: 'wICX',\n name: 'Wrapped ICX',\n decimals: 18,\n address: 'cx3975b43d260fb8ec802cef6e60c2f4d07486f11d',\n },\n bnUSD: {\n symbol: 'bnUSD',\n name: 'bnUSD',\n decimals: 18,\n address: 'cx88fd7df7ddff82f7cc735c871dc519838cb235bb',\n },\n } as const,\n nativeToken: 'cx0000000000000000000000000000000000000000' as const,\n bnUSD: 'cx88fd7df7ddff82f7cc735c871dc519838cb235bb',\n nid: '0x1',\n } as const satisfies IconSpokeChainConfig,\n} as const;\n\nexport const hubAssets: Record<\n SpokeChainId,\n Record<Address | string, { asset: Address; decimal: number; vault: Address; symbol: string; name: string }>\n> = {\n [SONIC_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[SONIC_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38',\n decimal: 18,\n symbol: 'S',\n name: 'Sonic',\n vault: '0x62ecc3Eeb80a162c57624B3fF80313FE69f5203e',\n },\n [spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.wSonic.address]: {\n asset: '0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38',\n decimal: 18,\n symbol: 'wSonic',\n name: 'Sonic',\n vault: '0x62ecc3Eeb80a162c57624B3fF80313FE69f5203e',\n },\n [spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.WETH.address]: {\n asset: '0x50c42dEAcD8Fc9773493ED674b675bE577f2634b',\n decimal: 18,\n symbol: 'WETH',\n name: 'Wrapped Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894',\n decimal: 6,\n symbol: 'USDC ',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n [spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDT.address]: {\n asset: '0x6047828dc181963ba44974801ff68e538da5eaf9',\n decimal: 6,\n symbol: 'USDT',\n name: 'Tether USD',\n vault: '0xbDf1F453FCB61424011BBDDCB96cFDB30f3Fe876',\n },\n },\n [AVALANCHE_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0xc9e4f0B6195F389D9d2b639f2878B7674eB9D8cD',\n decimal: 18,\n symbol: 'AVAX',\n name: 'AVAX',\n vault: '0x14238D267557E9d799016ad635B53CD15935d290',\n },\n [spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDT.address]: {\n asset: '0x41Fd5c169e014e2A657B9de3553f7a7b735Fe47A',\n decimal: 6,\n symbol: 'USDT',\n name: 'Tether USD',\n vault: '0xbDf1F453FCB61424011BBDDCB96cFDB30f3Fe876',\n },\n [spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x41abF4B1559FF709Ef8150079BcB26DB1Fffd117',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n [spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x289cDa1043b4Ce26BDCa3c12E534f56b24308A5B',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n },\n [ARBITRUM_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0xdcd9578b51ef55239b6e68629d822a8d97c95b86',\n decimal: 18,\n symbol: 'ETH',\n name: 'Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.WBTC.address]: {\n asset: '0xfB0ACB1b2720B620935F50a6dd3F7FEA52b2FCBe',\n decimal: 8,\n symbol: 'WBTC',\n name: 'Wrapped Bitcoin',\n vault: '0x7A1A5555842Ad2D0eD274d09b5c4406a95799D5d',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.weETH.address]: {\n asset: '0x08D5cf039De35627fD5C0f48B8AF4a1647a462E8',\n decimal: 18,\n symbol: 'weETH',\n name: 'Wrapped eETH',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.wstETH.address]: {\n asset: '0x2D5A7837D68b0c2CC4b14C2af2a1F0Ef420DDDc5',\n decimal: 18,\n symbol: 'wstETH',\n name: 'Wrapped Staked Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.tBTC.address]: {\n asset: '0x96Fc8540736f1598b7E235e6dE8814062b3b5d3B',\n decimal: 18,\n symbol: 'tBTC',\n name: 'Arbitrum tBTC',\n vault: '0x7A1A5555842Ad2D0eD274d09b5c4406a95799D5d',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDT.address]: {\n asset: '0x3C0a80C6a1110fC80309382b3989eC626c135eE9',\n decimal: 6,\n symbol: 'USDT',\n name: 'Tether USD',\n vault: '0xbDf1F453FCB61424011BBDDCB96cFDB30f3Fe876',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0xdB7BdA65c3a1C51D64dC4444e418684677334109',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n [spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x419cA9054E44E94ceAb52846eCdC3997439BBcA6',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n },\n [BASE_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x70178089842be7f8e4726b33f0d1569db8021faa',\n decimal: 18,\n symbol: 'ETH',\n name: 'Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.cbBTC.address]: {\n asset: '0x2803a23a3BA6b09e57D1c71deC0D9eFdBB00A27F',\n decimal: 8,\n symbol: 'cbBTC',\n name: 'Coinbase Wrapped BTC',\n vault: '0x7A1A5555842Ad2D0eD274d09b5c4406a95799D5d',\n },\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x72E852545B024ddCbc5b70C1bCBDAA025164259C',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0xDF5639D91359866f266b56D60d98edE9fEEDd100',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.weETH.address]: {\n asset: '0x55e0ad45eb97493b3045eee417fb6726cb85dfd4',\n decimal: 18,\n symbol: 'weETH',\n name: 'Wrapped eETH',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.wstETH.address]: {\n asset: '0x494aaeaefdf5964d4ed400174e8c5b98c00957aa',\n decimal: 18,\n symbol: 'wstETH',\n name: 'Wrapped Staked Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n },\n [OPTIMISM_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0xad332860dd3b6f0e63f4f66e9457900917ac78cd',\n decimal: 18,\n symbol: 'ETH',\n name: 'Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x238384AE2b4F0EC189ecB5031859bA306B2679c5',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0xb7C213CbD24967dE9838fa014668FDDB338f724B',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.wstETH.address]: {\n asset: '0x61e26f611090CdC6bc79A7Bf156b0fD10f1fC212',\n decimal: 18,\n symbol: 'wstETH',\n name: 'Wrapped Staked Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.weETH.address]: {\n asset: '0xE121c0Dc2B33c00ff31ee3D902D248cc3f19Ea50',\n decimal: 18,\n symbol: 'weETH',\n name: 'Wrapped eETH',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDT.address]: {\n asset: '0xc168067d95109003805aC865ae556e8476DC69bc',\n decimal: 6,\n symbol: 'USDT',\n name: 'Tether USD',\n vault: '0xbDf1F453FCB61424011BBDDCB96cFDB30f3Fe876',\n },\n },\n [NIBIRU_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[NIBIRU_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0xe0064414c2c1a636a9424C7a17D86fbF7FD3f190',\n decimal: 18,\n symbol: 'NIBI',\n name: 'Nibiru',\n vault: '0xc6c85287a8b173A509C2F198bB719A8a5a2d0C68',\n },\n [spokeChainConfig[NIBIRU_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x11b93C162aABFfD026539bb3B9F9eC22c8b7ef8a',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n },\n [BSC_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[BSC_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x13b70564b1ec12876b20fab5d1bb630311312f4f',\n decimal: 18,\n symbol: 'BNB',\n name: 'BNB',\n vault: '0x40Cd41b35DB9e5109ae7E54b44De8625dB320E6b',\n },\n [spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.ETHB.address]: {\n asset: '0x57fC2aC5701e463ae261AdBd6C99FBeB48Ce5293',\n decimal: 18,\n symbol: 'ETHB',\n name: 'Wrapped Ethereum',\n vault: '0x4effB5813271699683C25c734F4daBc45B363709',\n },\n [spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.BTCB.address]: {\n asset: '0xD8A24c71FEa5bB81c66C01e532dE7d9B11e13905',\n decimal: 18,\n symbol: 'BTCB',\n name: 'Wrapped Bitcoin',\n vault: '0x7A1A5555842Ad2D0eD274d09b5c4406a95799D5d',\n },\n [spokeChainConfig[BSC_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x5Ce6C1c51ff762cF3acD21396257046f694168b6',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x9d58508ad10d34048a11640735ca5075bba07b35',\n decimal: 18,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n },\n [POLYGON_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x9ee17486571917837210824b0d4cadfe3b324d12',\n decimal: 18,\n symbol: 'MATIC',\n name: 'Polygon',\n vault: '0x0000000000000000000000000000000000000000',\n },\n [spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x18f85f9E80ff9496EeBD5979a051AF16Ce751567',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0xa36893ba308b332FDEbfa95916D1dF3a2e3CF8B3',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n },\n [INJECTIVE_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.INJ.address]: {\n asset: '0xd375590b4955f6ea5623f799153f9b787a3bd319',\n decimal: 18,\n symbol: 'INJ',\n name: 'Injective',\n vault: '0x1f22279C89B213944b7Ea41daCB0a868DdCDFd13',\n },\n [spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x69425FFb14704124A58d6F69d510f74A59D9a5bC',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x4bc1211faa06fb50ff61a70331f56167ae511057',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n },\n [STELLAR_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x8ac68af223907fb1b893086601a3d99e00f2fa9d',\n decimal: 7,\n symbol: 'XLM',\n name: 'Stellar Lumens',\n vault: '0x6BC8C37cba91F76E68C9e6d689A9C21E4d32079B',\n },\n [spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x23225Ab8E63FCa4070296678cb46566d57E1BBe3',\n decimal: 7,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x348007B53F25A9A857aB8eA81ec9E3CCBCf440f2',\n decimal: 7,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xAbbb91c0617090F0028BDC27597Cd0D038F3A833',\n },\n },\n [SUI_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[SUI_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0x4676b2a551b25c04e235553c1c81019337384673',\n decimal: 9,\n symbol: 'SUI',\n name: 'Sui',\n vault: '0xdc5B4b00F98347E95b9F94911213DAB4C687e1e3',\n },\n [spokeChainConfig[SUI_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0xDf23097B9AEb917Bf8fb70e99b6c528fffA35364',\n decimal: 9,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x5635369c8a29A081d26C2e9e28012FCa548BA0Cb',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xdc5B4b00F98347E95b9F94911213DAB4C687e1e3',\n },\n },\n [SOLANA_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.SOL.address]: {\n asset: '0x0c09e69a4528945de6d16c7e469dea6996fdf636',\n decimal: 9,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xdEa692287E2cE8Cb08FA52917Be0F16b1DACDC87',\n },\n [spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x14C65b1CDc0B821569081b1F77342dA0D0CbF439',\n decimal: 9,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n },\n [spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.USDC.address]: {\n asset: '0x0c09e69a4528945de6d16c7e469dea6996fdf636',\n decimal: 6,\n symbol: 'USDC',\n name: 'USD Coin',\n vault: '0xdEa692287E2cE8Cb08FA52917Be0F16b1DACDC87',\n },\n },\n [ICON_MAINNET_CHAIN_ID]: {\n [spokeChainConfig[ICON_MAINNET_CHAIN_ID].nativeToken]: {\n asset: '0xb66cB7D841272AF6BaA8b8119007EdEE35d2C24F',\n decimal: 18,\n symbol: 'ICX',\n name: 'ICON',\n vault: '0x0000000000000000000000000000000000000000',\n },\n [spokeChainConfig[ICON_MAINNET_CHAIN_ID].bnUSD]: {\n asset: '0x654dddf32a9a2ac53f5fb54bf1e93f66791f8047',\n decimal: 18,\n symbol: 'bnUSD',\n name: 'bnUSD',\n vault: '0x9D4b663Eb075d2a1C7B8eaEFB9eCCC0510388B51',\n },\n },\n} as const;\n\nexport const DEFAULT_RELAYER_API_ENDPOINT = 'https://xcall-relay.nw.iconblockchain.xyz';\n\nconst solverConfig = {\n [SONIC_MAINNET_CHAIN_ID]: {\n intentsContract: '0x6382D6ccD780758C5e8A6123c33ee8F4472F96ef',\n solverApiEndpoint: 'https://staging-new-world.iconblockchain.xyz', // TODO replace with mainnet\n } satisfies SolverConfig,\n};\n\nexport const getSolverConfig = (chainId: HubChainId): SolverConfig => solverConfig[chainId];\n\n// currently supported spoke chain tokens for solver\nconst solverSupportedTokens: Record<SpokeChainId, readonly Token[]> = {\n [SONIC_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.WETH,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDT,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.wSonic,\n ] as const satisfies Token[],\n [AVALANCHE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.AVAX,\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDT,\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [ARBITRUM_MAINNET_CHAIN_ID]: [\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.WBTC,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.tBTC,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDT,\n ] as const satisfies Token[],\n [BASE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.cbBTC,\n ] as const satisfies Token[],\n [OPTIMISM_MAINNET_CHAIN_ID]: [\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDT,\n ] as const satisfies Token[],\n [POLYGON_MAINNET_CHAIN_ID]: [\n spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.POL,\n spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [BSC_MAINNET_CHAIN_ID]: [\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.BNB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.ETHB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.BTCB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [SOLANA_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.SOL,\n spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [ICON_MAINNET_CHAIN_ID]: [\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.ICX,\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.wICX,\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const satisfies Token[],\n [STELLAR_MAINNET_CHAIN_ID]: [\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.XLM,\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [SUI_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.SUI,\n spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [INJECTIVE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.INJ,\n spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const satisfies Token[],\n [NIBIRU_MAINNET_CHAIN_ID]: [] as const satisfies Token[],\n} as const;\n\n// get supported spoke chain tokens for solver\nexport const getSupportedSolverTokens = (chainId: SpokeChainId): readonly Token[] => solverSupportedTokens[chainId];\n\n// check if token address for given spoke chain id is supported\nexport const isSolverSupportedToken = (chainId: SpokeChainId, token: string): boolean =>\n solverSupportedTokens[chainId].some(t => t.address.toLowerCase() === token.toLowerCase());\n\nconst moneyMarketConfig = {\n [SONIC_MAINNET_CHAIN_ID]: {\n lendingPool: '0x553434896D39F867761859D0FE7189d2Af70514E',\n uiPoolDataProvider: '0xC04d746C38f1E51C8b3A3E2730250bbAC2F271bf',\n poolAddressesProvider: '0x036aDe0aBAA4c82445Cb7597f2d6d6130C118c7b',\n bnUSD: '0x94dC79ce9C515ba4AE4D195da8E6AB86c69BFc38',\n bnUSDVault: '0xE801CA34E19aBCbFeA12025378D19c4FBE250131',\n } satisfies MoneyMarketConfig,\n} as const;\n\nexport const getMoneyMarketConfig = (chainId: HubChainId): MoneyMarketConfig => moneyMarketConfig[chainId];\n\n// currently supported spoke chain tokens for money market\nconst moneyMarketSupportedTokens = {\n [AVALANCHE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.AVAX,\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDT,\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[AVALANCHE_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [ARBITRUM_MAINNET_CHAIN_ID]: [\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.WBTC,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.tBTC,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDT,\n spokeChainConfig[ARBITRUM_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const,\n [BASE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[BASE_MAINNET_CHAIN_ID].supportedTokens.cbBTC,\n ] as const,\n [OPTIMISM_MAINNET_CHAIN_ID]: [\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.ETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.wstETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.weETH,\n spokeChainConfig[OPTIMISM_MAINNET_CHAIN_ID].supportedTokens.USDT,\n ] as const,\n [POLYGON_MAINNET_CHAIN_ID]: [\n spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.POL,\n spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[POLYGON_MAINNET_CHAIN_ID].supportedTokens.USDC,\n ] as const,\n [BSC_MAINNET_CHAIN_ID]: [\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.BNB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.ETHB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.BTCB,\n spokeChainConfig[BSC_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [SOLANA_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.SOL,\n spokeChainConfig[SOLANA_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [ICON_MAINNET_CHAIN_ID]: [\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.ICX,\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.wICX,\n ] as const,\n [STELLAR_MAINNET_CHAIN_ID]: [\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.XLM,\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [SUI_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.SUI,\n spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [INJECTIVE_MAINNET_CHAIN_ID]: [\n spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.INJ,\n spokeChainConfig[INJECTIVE_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n ] as const,\n [NIBIRU_MAINNET_CHAIN_ID]: [] as const,\n [SONIC_MAINNET_CHAIN_ID]: [\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.Sonic,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.WETH,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDC,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.USDT,\n spokeChainConfig[SONIC_MAINNET_CHAIN_ID].supportedTokens.wSonic,\n ] as const,\n} as const satisfies Record<SpokeChainId, Readonly<Token[]>>;\n\nexport const isMoneyMarketSupportedToken = (chainId: SpokeChainId, token: string): boolean =>\n moneyMarketSupportedTokens[chainId].some(t => t.address.toLowerCase() === token.toLowerCase());\n\n// get supported spoke chain tokens for money market\nexport const getSupportedMoneyMarketTokens = (chainId: SpokeChainId): readonly Token[] =>\n moneyMarketSupportedTokens[chainId];\n\nexport const HubVaultSymbols = [\n 'sodaAVAX',\n 'sodaBNB',\n 'sodaETH',\n 'sodaBTC',\n 'sodaSUI',\n 'sodaINJ',\n 'sodaXLM',\n 'sodaSOL',\n] as const;\n\nexport type HubVaultSymbol = (typeof HubVaultSymbols)[number];\n\nexport const hubVaults: Record<HubVaultSymbol, VaultType> = {\n sodaAVAX: {\n // SODA AVAX vault\n address: '0x14238d267557e9d799016ad635b53cd15935d290',\n reserves: [\n // hub asset addresses contained in the vault\n '0xc9e4f0b6195f389d9d2b639f2878b7674eb9d8cd', // AvalancheAVAX hub asset\n ] as const,\n },\n sodaBNB: {\n // SODA BNB vault\n address: '0x40cd41b35db9e5109ae7e54b44de8625db320e6b',\n reserves: [\n // hub asset addresses contained in the vault\n '0x13b70564b1ec12876b20fab5d1bb630311312f4f', // BSC BNB hub asset\n ] as const,\n },\n sodaETH: {\n // SODA ETH vault\n address: '0x4effb5813271699683c25c734f4dabc45b363709',\n reserves: [\n // hub asset addresses contained in the vault\n '0x70178089842be7f8e4726b33f0d1569db8021faa', // BASE ETH hub asset\n '0xad332860dd3b6f0e63f4f66e9457900917ac78cd', // Optimism ETH hub asset\n '0xdcd9578b51ef55239b6e68629d822a8d97c95b86', // Arbitrum ETH hub asset\n '0x57fc2ac5701e463ae261adbd6c99fbeb48ce5293', // BSC ETH hub asset\n ] as const,\n },\n sodaBTC: {\n // SODA BTC vault\n address: '0x7a1a5555842ad2d0ed274d09b5c4406a95799d5d',\n reserves: [\n // hub asset addresses contained in the vault\n '0x2803a23a3ba6b09e57d1c71dec0d9efdbb00a27f', // BASE cbBTC hub asset,\n '0xfb0acb1b2720b620935f50a6dd3f7fea52b2fcbe', // Arbitrum wBTC hub asset\n '0x96fc8540736f1598b7e235e6de8814062b3b5d3b', // Arbitrum tBTC hub asset,\n '0xd8a24c71fea5bb81c66c01e532de7d9b11e13905', // BSC BTCB hub asset\n ] as const,\n },\n sodaSUI: {\n // SODA SUI vault\n address: '0xdc5b4b00f98347e95b9f94911213dab4c687e1e3',\n reserves: [\n // hub asset addresses contained in the vault\n '0x4676b2a551b25c04e235553c1c81019337384673', // SUI SUI hub asset\n ] as const,\n },\n sodaINJ: {\n // SODA INJ vault\n address: '0x1f22279c89b213944b7ea41dacb0a868ddcdfd13',\n reserves: [\n // hub asset addresses contained in the vault\n '0xd375590b4955f6ea5623f799153f9b787a3bd319', // Injective INJ hub asset\n ] as const,\n },\n sodaXLM: {\n // SODA XLM vault\n address: '0x6bc8c37cba91f76e68c9e6d689a9c21e4d32079b',\n reserves: [\n // hub asset addresses contained in the vault\n '0x8ac68af223907fb1b893086601a3d99e00f2fa9d', // Stellar XLM hub asset\n ] as const,\n },\n sodaSOL: {\n // SODA SOL vault\n address: '0xdea692287e2ce8cb08fa52917be0f16b1dacdc87',\n reserves: [\n // hub asset addresses contained in the vault\n '0x0c09e69a4528945de6d16c7e469dea6996fdf636', // Solana SOL hub asset\n ] as const,\n },\n} as const;\n\nexport const hubVaultsAddressSet = new Set<Address>(\n Object.values(hubVaults).map(vault => vault.address.toLowerCase() as Address),\n);\n\n// all hub assets contained in the money market reserves (supply / borrow assets)\nexport const moneyMarketReserveHubAssetsSet = new Set<Address>(\n Object.values(hubVaults).flatMap(vault => vault.reserves.map(reserve => reserve.toLowerCase() as Address)),\n);\n\nexport const isMoneyMarketReserveHubAsset = (hubAsset: Address): boolean =>\n moneyMarketReserveHubAssetsSet.has(hubAsset.toLowerCase() as Address);\n\nexport const moneyMarketReserveAssets = [\n hubVaults['sodaAVAX'].address,\n hubVaults['sodaBNB'].address,\n hubVaults['sodaETH'].address,\n hubVaults['sodaBTC'].address,\n hubVaults['sodaSUI'].address,\n hubVaults['sodaINJ'].address,\n hubVaults['sodaXLM'].address,\n hubVaults['sodaSOL'].address,\n getMoneyMarketConfig(SONIC_MAINNET_CHAIN_ID).bnUSDVault,\n] as const;\n\nexport const isMoneyMarketReserveAsset = (asset: Address): boolean =>\n moneyMarketReserveAssets.map(a => a.toLowerCase()).includes(asset.toLowerCase());\n\nexport const originalAssetTohubAssetMap: Map<SpokeChainId, Map<OriginalAssetAddress, HubAssetInfo>> = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([asset, info]) => [asset.toLowerCase(), info])),\n ]),\n);\nexport const hubAssetToOriginalAssetMap: Map<SpokeChainId, Map<Address, OriginalAssetAddress>> = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([asset, info]) => [info.asset.toLowerCase() as Address, asset])),\n ]),\n);\nexport const chainIdToHubAssetsMap: Map<SpokeChainId, Map<Address, HubAssetInfo>> = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([, info]) => [info.asset.toLowerCase() as Address, info])),\n ]),\n);\nexport const supportedHubAssets: Set<Address> = new Set(\n Object.values(hubAssets).flatMap(assets => Object.values(assets).map(info => info.asset.toLowerCase() as Address)),\n);\nexport const spokeChainIdsSet = new Set(SPOKE_CHAIN_IDS);\n\nexport const getHubAssetInfo = (chainId: SpokeChainId, asset: OriginalAssetAddress): HubAssetInfo | undefined =>\n originalAssetTohubAssetMap.get(chainId)?.get(asset.toLowerCase());\nexport const isValidOriginalAssetAddress = (chainId: SpokeChainId, asset: OriginalAssetAddress): boolean =>\n originalAssetTohubAssetMap.get(chainId)?.has(asset.toLowerCase()) ?? false;\nexport const getOriginalAssetAddress = (chainId: SpokeChainId, hubAsset: Address): OriginalAssetAddress | undefined =>\n hubAssetToOriginalAssetMap.get(chainId)?.get(hubAsset.toLowerCase() as Address);\nexport const isValidHubAsset = (hubAsset: Address): boolean =>\n supportedHubAssets.has(hubAsset.toLowerCase() as Address);\nexport const isValidChainHubAsset = (chainId: SpokeChainId, hubAsset: Address): boolean =>\n chainIdToHubAssetsMap.get(chainId)?.has(hubAsset.toLowerCase() as Address) ?? false;\nexport const isValidSpokeChainId = (chainId: SpokeChainId): boolean => spokeChainIdsSet.has(chainId);\nexport const isValidIntentRelayChainId = (chainId: bigint): boolean =>\n Object.values(INTENT_RELAY_CHAIN_IDS).some(id => id === chainId);\nexport const supportedHubChains: HubChainId[] = Object.keys(hubChainConfig) as HubChainId[];\nexport const supportedSpokeChains: SpokeChainId[] = Object.keys(spokeChainConfig) as SpokeChainId[];\nexport const intentRelayChainIdToSpokeChainIdMap: Map<IntentRelayChainId, SpokeChainId> = new Map(\n Object.entries(ChainIdToIntentRelayChainId).map(([chainId, intentRelayChainId]) => [\n intentRelayChainId,\n chainId as SpokeChainId,\n ]),\n);\nexport const supportedTokensPerChain: Map<SpokeChainId, readonly Token[]> = new Map(\n Object.entries(spokeChainConfig).map(([chainId, config]) => [\n chainId as SpokeChainId,\n Object.values(config.supportedTokens),\n ]),\n);\n\nexport const getSpokeChainIdFromIntentRelayChainId = (intentRelayChainId: IntentRelayChainId): SpokeChainId => {\n const spokeChainId = intentRelayChainIdToSpokeChainIdMap.get(intentRelayChainId);\n if (!spokeChainId) {\n throw new Error(`Invalid intent relay chain id: ${intentRelayChainId}`);\n }\n return spokeChainId;\n};\nexport const isNativeToken = (chainId: SpokeChainId, token: Token | string): boolean => {\n if (typeof token === 'string') {\n return token.toLowerCase() === spokeChainConfig[chainId].nativeToken.toLowerCase();\n }\n\n return token.address.toLowerCase() === spokeChainConfig[chainId].nativeToken.toLowerCase();\n};\n","import type { ICWWalletProvider, CWExecuteResponse } from '@sodax/types';\n\nexport interface TokenInfo {\n name: string;\n symbol: string;\n decimals: number;\n total_supply: string;\n}\n\nexport interface Balance {\n balance: string;\n}\n\nexport interface AllowanceResponse {\n allowance: string;\n expires: {\n never?: {};\n at_height?: number;\n at_time?: string;\n };\n}\n\nexport class CW20Token {\n private client: ICWWalletProvider;\n private contractAddress: string;\n\n constructor(client: ICWWalletProvider, contractAddress: string) {\n this.client = client;\n this.contractAddress = contractAddress;\n }\n\n // Query Methods\n async getTokenInfo(): Promise<TokenInfo> {\n return (await this.client.queryContractSmart(this.contractAddress, {\n token_info: {},\n })) as TokenInfo;\n }\n\n async getBalance(address: string): Promise<Balance> {\n return (await this.client.queryContractSmart(this.contractAddress, {\n balance: { address },\n })) as Balance;\n }\n\n async getAllowance(owner: string, spender: string): Promise<AllowanceResponse> {\n return (await this.client.queryContractSmart(this.contractAddress, {\n allowance: { owner, spender },\n })) as AllowanceResponse;\n }\n\n // Execute Methods (requires SigningCosmWasmClient)\n async transfer(senderAddress: string, recipientAddress: string, amount: string): Promise<CWExecuteResponse> {\n const msg = {\n transfer: {\n recipient: recipientAddress,\n amount: amount,\n },\n };\n\n return await this.client.execute(senderAddress, this.contractAddress, msg, 'auto');\n }\n\n async increaseAllowance(\n senderAddress: string,\n spenderAddress: string,\n amount: string,\n expires?: { at_height?: number; at_time?: string; never?: {} },\n ): Promise<CWExecuteResponse> {\n const msg = {\n increase_allowance: {\n spender: spenderAddress,\n amount: amount,\n expires,\n },\n };\n\n return await this.client.execute(senderAddress, this.contractAddress, msg, 'auto');\n }\n\n async decreaseAllowance(\n senderAddress: string,\n spenderAddress: string,\n amount: string,\n expires?: { at_height?: number; at_time?: string; never?: {} },\n ): Promise<CWExecuteResponse> {\n const msg = {\n decrease_allowance: {\n spender: spenderAddress,\n amount: amount,\n expires,\n },\n };\n\n return await this.client.execute(senderAddress, this.contractAddress, msg, 'auto');\n }\n\n async transferFrom(\n senderAddress: string,\n ownerAddress: string,\n recipientAddress: string,\n amount: string,\n ): Promise<CWExecuteResponse> {\n const msg = {\n transfer_from: {\n owner: ownerAddress,\n recipient: recipientAddress,\n amount: amount,\n },\n };\n\n return await this.client.execute(senderAddress, this.contractAddress, msg, 'auto');\n }\n}\n","import { type Coin, coins } from '@cosmjs/stargate';\nimport { type Address, type Hex, fromHex } from 'viem';\nimport type { CosmosSpokeChainConfig, CWReturnType, PromiseCWTxReturnType } from '../../types.js';\nimport type { ISpokeProvider } from '../Providers.js';\nimport type { IInjectiveWalletProvider, ICWWalletProvider, CWExecuteResponse } from '@sodax/types';\nimport { CW20Token } from './CW20Token.js';\n\nexport type CWSpokeDepositParams = {\n from: string; // The address of the user on the spoke chain\n token: string; // The address of the token to deposit\n amount: string; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport interface InstantiateMsg {\n connection: string;\n rate_limit: string;\n hub_chain_id: string; // u128 as string\n hub_asset_manager: Uint8Array;\n}\n\nexport interface ConnMsg {\n send_message?: {\n dst_chain_id: number;\n dst_address: Array<Number>;\n payload: Array<Number>;\n };\n}\n\nexport interface ExecuteMsg {\n transfer?: {\n token: string;\n to: Array<Number>;\n amount: string; // should be string for u128 , but in injective it fails in type conversion.\n data: Array<Number>;\n };\n recv_message?: {\n src_chain_id: string; // u128 as string\n src_address: Uint8Array;\n conn_sn: string; // u128 as string\n payload: Uint8Array;\n signatures: Uint8Array[];\n };\n set_rate_limit?: {\n rate_limit: string;\n };\n set_connection?: {\n connection: string;\n };\n set_owner?: {\n owner: string;\n };\n}\n\nexport interface QueryMsg {\n get_state: {};\n}\n\nexport interface State {\n connection: string;\n rate_limit: string;\n hub_asset_manager: Uint8Array;\n hub_chain_id: string; // u128 as string\n owner: string;\n}\n\nexport class CWSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: ICWWalletProvider | IInjectiveWalletProvider;\n\n public chainConfig: CosmosSpokeChainConfig;\n\n constructor(conf: CosmosSpokeChainConfig, walletProvider: ICWWalletProvider | IInjectiveWalletProvider) {\n this.chainConfig = conf;\n this.walletProvider = walletProvider;\n }\n\n // Query Methods\n async getState(): Promise<State> {\n return (await this.walletProvider.queryContractSmart(this.chainConfig.addresses.assetManager, {\n get_state: {},\n })) as State;\n }\n\n async getBalance(token: String): Promise<number> {\n return (await this.walletProvider.queryContractSmart(this.chainConfig.addresses.assetManager, {\n get_balance: { denom: token },\n })) as number;\n }\n\n // Execute Methods (requires SigningCosmWasmClient)\n\n private async transfer<R extends boolean = false>(\n senderAddress: string,\n token: string,\n to: Uint8Array,\n amount: string,\n data: Uint8Array = new Uint8Array(),\n funds: Coin[] = [],\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const msg: ExecuteMsg = {\n transfer: {\n token,\n to: Array.from(to),\n amount: amount,\n data: Array.from(data),\n },\n };\n\n if (raw) {\n return this.walletProvider.getRawTransaction(\n this.chainConfig.networkId,\n this.chainConfig.prefix,\n senderAddress,\n this.chainConfig.addresses.connection,\n msg,\n ) as CWReturnType<R>;\n }\n const res = await this.walletProvider.execute(\n senderAddress as `inj${string}`,\n this.chainConfig.addresses.assetManager,\n msg,\n 'auto',\n undefined,\n funds,\n );\n return res.transactionHash as CWReturnType<R>;\n }\n\n async depositToken<R extends boolean = false>(\n sender: string,\n tokenAddress: string,\n to: Uint8Array,\n amount: string,\n data: Uint8Array = new Uint8Array(),\n raw?: R,\n ) {\n const cw20Token = new CW20Token(this.walletProvider, tokenAddress);\n await cw20Token.increaseAllowance(sender, this.chainConfig.addresses.assetManager, amount);\n return this.transfer(sender, tokenAddress, to, amount, data, [], raw);\n }\n\n static async deposit<R extends boolean = false>(\n sender: string,\n token_address: string,\n to: Address,\n amount: string,\n data: Hex = '0x',\n provider: CWSpokeProvider,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const isNative = await provider.isNative(token_address);\n const toBytes = fromHex(to, 'bytes');\n const dataBytes = fromHex(data, 'bytes');\n\n if (isNative) {\n return provider.depositNative(sender, token_address, toBytes, amount, dataBytes, raw);\n }\n\n return provider.depositToken(sender, token_address, toBytes, amount, dataBytes, raw);\n }\n\n async depositNative<R extends boolean = false>(\n sender: string,\n token: string,\n to: Uint8Array,\n amount: string,\n data: Uint8Array = new Uint8Array([2, 2, 2]),\n raw?: R,\n ) {\n const funds = coins(amount, token);\n return this.transfer(sender, token, to, amount, data, funds, raw);\n }\n\n async isNative(token: string): Promise<boolean> {\n let isNative = true;\n const cw20Token = new CW20Token(this.walletProvider, token);\n try {\n await cw20Token.getTokenInfo();\n isNative = false;\n } catch (err) {}\n return isNative;\n }\n\n async receiveMessage(\n senderAddress: string,\n srcChainId: string,\n srcAddress: Uint8Array,\n connSn: string,\n payload: Uint8Array,\n signatures: Uint8Array[],\n ): Promise<CWExecuteResponse> {\n const msg: ExecuteMsg = {\n recv_message: {\n src_chain_id: srcChainId,\n src_address: srcAddress,\n conn_sn: connSn,\n payload,\n signatures,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg, 'auto');\n }\n\n async setRateLimit(senderAddress: string, rateLimit: string): Promise<CWExecuteResponse> {\n const msg: ExecuteMsg = {\n set_rate_limit: {\n rate_limit: rateLimit,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg, 'auto');\n }\n\n async setConnection(senderAddress: string, connection: string): Promise<CWExecuteResponse> {\n const msg: ExecuteMsg = {\n set_connection: {\n connection,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg, 'auto');\n }\n\n async setOwner(senderAddress: string, owner: string): Promise<CWExecuteResponse> {\n const msg: ExecuteMsg = {\n set_owner: {\n owner,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg, 'auto');\n }\n\n async send_message<R extends boolean = false>(\n sender: string,\n dst_chain_id: string,\n dst_address: Hex,\n payload: Hex,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const msg: ConnMsg = {\n send_message: {\n dst_chain_id: Number.parseInt(dst_chain_id),\n dst_address: Array.from(fromHex(dst_address, 'bytes')),\n payload: Array.from(fromHex(payload, 'bytes')),\n },\n };\n if (raw) {\n return this.walletProvider.getRawTransaction(\n this.chainConfig.networkId,\n this.chainConfig.prefix,\n sender,\n this.chainConfig.addresses.connection,\n msg,\n ) as CWReturnType<R>;\n }\n const res = await this.walletProvider.execute(sender, this.chainConfig.addresses.connection, msg, 'auto');\n return res.transactionHash as CWReturnType<R>;\n }\n\n // Helper Methods\n static stringToUint8Array(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n }\n\n static uint8ArrayToString(arr: Uint8Array): string {\n return new TextDecoder().decode(arr);\n }\n\n static toBigIntString(num: number | bigint): string {\n return num.toString();\n }\n}\n","import type { IconSpokeChainConfig } from '../../types.js';\nimport * as IconSdkRaw from 'icon-sdk-js';\nconst IconSdk = (IconSdkRaw.default?.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nimport type { IconService } from 'icon-sdk-js';\nimport type { IIconWalletProvider } from '@sodax/types';\n\nexport class IconSpokeProvider {\n public readonly walletProvider: IIconWalletProvider;\n public readonly chainConfig: IconSpokeChainConfig;\n public readonly iconService: IconService;\n\n constructor(\n walletProvider: IIconWalletProvider,\n chainConfig: IconSpokeChainConfig,\n rpcUrl: `http${string}` = 'https://ctz.solidwallet.io/api/v3', // default to mainnet\n ) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n this.iconService = new IconSdk.IconService(new IconSdk.IconService.HttpProvider(rpcUrl));\n }\n}\n","import type { Hex } from 'viem';\n\nexport function getIconAddressBytes(address: string): Hex {\n return `0x${Buffer.from(address.replace('cx', '01').replace('hx', '00') ?? 'f8', 'hex').toString('hex')}`;\n}\n","import {\n http,\n type Account,\n type Address,\n type Chain,\n type CustomTransport,\n type Hex,\n type HttpTransport,\n type PublicClient,\n type WalletClient,\n createPublicClient,\n} from 'viem';\nimport { getEvmViemChain, getHubChainConfig } from '../constants.js';\nimport type {\n EvmChainId,\n EvmHubChainConfig,\n EvmSpokeChainConfig,\n SonicSpokeChainConfig,\n SpokeChainConfig,\n} from '../types.js';\nimport type { CWSpokeProvider } from './cosmos/CWSpokeProvider.js';\nimport type { IconSpokeProvider } from './icon/IconSpokeProvider.js';\nimport type { SolanaSpokeProvider } from './solana/SolanaSpokeProvider.js';\nimport type { SolanaWalletProvider } from './solana/SolanaWalletProvider.js';\nimport type { StellarSpokeProvider } from './stellar/StellarSpokeProvider.js';\nimport type { SuiSpokeProvider } from './sui/SuiSpokeProvider.js';\nimport {\n SONIC_MAINNET_CHAIN_ID,\n type IEvmWalletProvider,\n type IStellarWalletProvider,\n type ISuiWalletProvider,\n type IIconWalletProvider,\n type IInjectiveWalletProvider,\n type ICWWalletProvider,\n} from '@sodax/types';\n\nexport type CustomProvider = { request(...args: unknown[]): Promise<unknown> };\n\nexport interface ISpokeProvider {\n readonly walletProvider: IWalletProvider;\n readonly chainConfig: SpokeChainConfig;\n}\n\nexport type EvmUninitializedBrowserConfig = {\n userAddress: Address;\n chain: EvmChainId;\n provider: CustomProvider;\n};\n\nexport type EvmUninitializedPrivateKeyConfig = {\n chain: EvmChainId;\n privateKey: Hex | undefined;\n provider: string; // rpc url\n};\n\nexport type EvmUninitializedConfig = EvmUninitializedBrowserConfig | EvmUninitializedPrivateKeyConfig;\n\nexport type EvmInitializedConfig = {\n walletClient: WalletClient<CustomTransport | HttpTransport, Chain, Account>;\n publicClient: PublicClient<CustomTransport | HttpTransport>;\n};\n\nexport type EvmHubProviderConfig = {\n hubRpcUrl: string;\n chainConfig: EvmHubChainConfig;\n};\n\nexport class EvmHubProvider {\n public readonly publicClient: PublicClient<HttpTransport>;\n public readonly chainConfig: EvmHubChainConfig;\n\n constructor(config?: EvmHubProviderConfig) {\n if (config) {\n this.publicClient = createPublicClient({\n transport: http(config.hubRpcUrl),\n chain: getEvmViemChain(config.chainConfig.chain.id),\n });\n this.chainConfig = config.chainConfig;\n } else {\n // default to Sonic mainnet\n this.publicClient = createPublicClient({\n transport: http('https://rpc.soniclabs.com'),\n chain: getEvmViemChain(SONIC_MAINNET_CHAIN_ID),\n });\n this.chainConfig = getHubChainConfig(SONIC_MAINNET_CHAIN_ID);\n }\n }\n}\n\nexport class SonicSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: IEvmWalletProvider;\n public readonly chainConfig: SonicSpokeChainConfig;\n public readonly publicClient: PublicClient<HttpTransport>;\n\n constructor(walletProvider: IEvmWalletProvider, chainConfig: SonicSpokeChainConfig, rpcUrl?: string) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n if (rpcUrl) {\n this.publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n } else {\n this.publicClient = createPublicClient({\n transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n }\n }\n}\n\nexport class EvmSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: IEvmWalletProvider;\n public readonly chainConfig: EvmSpokeChainConfig;\n public readonly publicClient: PublicClient<HttpTransport>;\n\n constructor(walletProvider: IEvmWalletProvider, chainConfig: EvmSpokeChainConfig, rpcUrl?: string) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n if (rpcUrl) {\n this.publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n } else {\n this.publicClient = createPublicClient({\n transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n }\n }\n}\n\nexport { CWSpokeProvider } from './cosmos/CWSpokeProvider.js';\nexport { IconSpokeProvider } from './icon/IconSpokeProvider.js';\nexport { getIconAddressBytes } from './icon/utils.js';\n\nexport type IWalletProvider =\n | IEvmWalletProvider\n | ICWWalletProvider\n | IStellarWalletProvider\n | ISuiWalletProvider\n | IIconWalletProvider\n | IInjectiveWalletProvider\n | SolanaWalletProvider;\n\nexport type SpokeProvider = (\n | EvmSpokeProvider\n | CWSpokeProvider\n | IconSpokeProvider\n | SuiSpokeProvider\n | StellarSpokeProvider\n | SolanaSpokeProvider\n | SonicSpokeProvider\n) &\n ISpokeProvider;\n","import {\n Contract,\n TransactionBuilder,\n BASE_FEE,\n Address,\n rpc as StellarRpc,\n nativeToScVal,\n TimeoutInfinite,\n scValToBigInt,\n} from '@stellar/stellar-sdk';\nimport type { PromiseStellarTxReturnType, StellarReturnType, StellarSpokeChainConfig } from '../../types.js';\nimport { toHex, type Hex } from 'viem';\nimport type { ISpokeProvider } from '../Providers.js';\nimport type { Server } from '@stellar/stellar-sdk/rpc';\nimport type { IStellarWalletProvider } from '@sodax/types';\n\nexport class StellarSpokeProvider implements ISpokeProvider {\n private readonly server: Server;\n private readonly contract: Contract;\n public readonly chainConfig: StellarSpokeChainConfig;\n public readonly walletProvider: IStellarWalletProvider;\n\n constructor(\n walletProvider: IStellarWalletProvider,\n contractAddress: string,\n config: StellarSpokeChainConfig,\n rpc: string,\n ) {\n this.server = new StellarRpc.Server(rpc);\n this.walletProvider = walletProvider;\n this.contract = new Contract(contractAddress);\n this.chainConfig = config;\n }\n\n async getBalance(tokenAddress: string): Promise<number> {\n const [network, walletAddress] = await Promise.all([\n this.server.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n const sourceAccount = await this.server.getAccount(walletAddress);\n\n const tx = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(this.contract.call('get_token_balance', nativeToScVal(tokenAddress, { type: 'address' })))\n .setTimeout(TimeoutInfinite)\n .build();\n\n const result = await this.server.simulateTransaction(tx);\n\n if (StellarRpc.Api.isSimulationError(result)) {\n throw new Error('Failed to simulate transaction');\n }\n\n const resultValue = result.result;\n\n if (resultValue) {\n return Number(scValToBigInt(resultValue.retval));\n }\n\n throw new Error('result undefined');\n }\n\n async deposit<R extends boolean = false>(\n token: string,\n amount: string,\n recipient: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n try {\n const [network, walletAddress] = await Promise.all([\n this.server.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n const sourceAccount = await this.server.getAccount(walletAddress);\n const simulateTx = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(\n this.contract.call(\n 'transfer',\n nativeToScVal(Address.fromString(walletAddress), { type: 'address' }),\n nativeToScVal(Address.fromString(token), {\n type: 'address',\n }),\n nativeToScVal(BigInt(amount), { type: 'u128' }),\n nativeToScVal(recipient),\n nativeToScVal(Buffer.from(data), { type: 'bytes' }),\n ),\n )\n .setTimeout(100)\n .build();\n\n const simResult = await this.server.simulateTransaction(simulateTx);\n const tx = StellarRpc.assembleTransaction(simulateTx, simResult).build();\n\n if (raw) {\n const transactionXdr = tx.toXDR();\n\n return {\n from: walletAddress,\n to: this.chainConfig.addresses.assetManager,\n value: BigInt(amount),\n data: transactionXdr,\n } as StellarReturnType<R>;\n }\n\n if (tx) {\n const signedTx = await this.walletProvider.signTransaction(tx.toXDR());\n const sendResponse = await this.server.sendTransaction(\n TransactionBuilder.fromXDR(signedTx, tx.networkPassphrase),\n );\n if (sendResponse.hash) {\n return `0x${sendResponse.hash}` as StellarReturnType<R>;\n }\n }\n throw new Error('Failed to create transaction');\n } catch (error) {\n console.error('Error during deposit:', error);\n throw error;\n }\n }\n\n async sendMessage<R extends boolean = false>(\n dst_chain_id: string,\n dst_address: Uint8Array,\n payload: Uint8Array,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n try {\n const [network, walletAddress] = await Promise.all([\n this.server.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n const sourceAccount = await this.server.getAccount(walletAddress);\n const connection = new Contract(this.chainConfig.addresses.connection);\n\n const simulateTx = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(\n connection.call(\n 'send_message',\n nativeToScVal(Address.fromString(walletAddress), { type: 'address' }),\n nativeToScVal(dst_chain_id, { type: 'u128' }),\n nativeToScVal(Buffer.from(dst_address), { type: 'bytes' }),\n nativeToScVal(Buffer.from(payload), { type: 'bytes' }),\n ),\n )\n .setTimeout(100)\n .build();\n\n const simResult = await this.server.simulateTransaction(simulateTx);\n const tx = StellarRpc.assembleTransaction(simulateTx, simResult).build();\n\n if (raw) {\n const transactionXdr = tx.toXDR();\n return {\n from: walletAddress,\n to: this.chainConfig.addresses.assetManager,\n value: 0n,\n data: transactionXdr,\n } as StellarReturnType<R>;\n }\n\n if (tx) {\n const signedTx = await this.walletProvider.signTransaction(tx.toXDR());\n const sendResponse = await this.server.sendTransaction(\n TransactionBuilder.fromXDR(signedTx, tx.networkPassphrase),\n );\n if (sendResponse.hash) {\n return `0x${sendResponse.hash}` as StellarReturnType<R>;\n }\n }\n throw new Error('Failed to create transaction');\n } catch (error) {\n console.error('Error during deposit:', error);\n throw error;\n }\n }\n\n static getAddressBCSBytes(stellaraddress: string): Hex {\n return `0x${Address.fromString(stellaraddress).toScVal().toXDR('hex')}`;\n }\n\n static getTsWalletBytes(stellaraddress: string): Hex {\n return toHex(Buffer.from(stellaraddress, 'hex'));\n }\n}\n","import { bcs } from '@mysten/sui/bcs';\nimport { Transaction, type TransactionResult } from '@mysten/sui/transactions';\nimport { type Hex, toHex } from 'viem';\nimport type { PromiseSuiTxReturnType, SuiReturnType, SuiSpokeChainConfig } from '../../types.js';\nimport type { ISpokeProvider } from '../index.js';\nimport type { ISuiWalletProvider } from '@sodax/types';\n\ntype SuiNativeCoinResult = { $kind: 'NestedResult'; NestedResult: [number, number] };\ntype SuiTxObject = { $kind: 'Input'; Input: number; type?: 'object' | undefined };\nexport class SuiSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: ISuiWalletProvider;\n public chainConfig: SuiSpokeChainConfig;\n\n constructor(config: SuiSpokeChainConfig, wallet_provider: ISuiWalletProvider) {\n this.chainConfig = config;\n this.walletProvider = wallet_provider;\n }\n\n async getBalance(token: string): Promise<bigint> {\n const assetmanager = this.splitAddress(this.chainConfig.addresses.assetManager);\n const tx = new Transaction();\n const result = await this.walletProvider.viewContract(\n tx,\n assetmanager.packageId,\n assetmanager.moduleId,\n 'get_token_balance',\n [tx.object(assetmanager.stateId)],\n [token],\n );\n if (\n !Array.isArray(result?.returnValues) ||\n !Array.isArray(result.returnValues[0]) ||\n result.returnValues[0][0] === undefined\n ) {\n throw new Error('Failed to get Balance');\n }\n const val: number[] = result.returnValues[0][0];\n const str_u64 = bcs.U64.parse(Uint8Array.from(val));\n return BigInt(str_u64);\n }\n\n async transfer<R extends boolean = false>(\n token: string,\n amount: bigint,\n to: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const isNative = token.toLowerCase() === this.chainConfig.nativeToken.toLowerCase();\n const tx = new Transaction();\n const walletAddress = await this.walletProvider.getWalletAddressBytes();\n const coin: TransactionResult | SuiNativeCoinResult | SuiTxObject = isNative\n ? await this.getNativeCoin(tx, amount)\n : await this.getCoin(tx, token, amount, walletAddress);\n const connection = this.splitAddress(this.chainConfig.addresses.connection);\n const assetManager = this.splitAddress(this.chainConfig.addresses.assetManager);\n\n // Call transfer function\n tx.moveCall({\n target: `${assetManager.packageId}::${assetManager.moduleId}::transfer`,\n typeArguments: [token],\n arguments: [\n tx.object(assetManager.stateId),\n tx.object(connection.stateId), // Connection state object\n coin,\n tx.pure(bcs.vector(bcs.u8()).serialize(to)),\n tx.pure(bcs.vector(bcs.u8()).serialize(data)),\n ],\n });\n if (raw) {\n const transactionRaw = await tx.build();\n const transactionRawBase64String = Buffer.from(transactionRaw).toString('base64');\n return {\n from: walletAddress,\n to: `${assetManager.packageId}::${assetManager.moduleId}::transfer`,\n value: amount,\n data: transactionRawBase64String,\n } as SuiReturnType<R>;\n }\n // Execute transaction\n return this.walletProvider.signAndExecuteTxn(tx) as PromiseSuiTxReturnType<R>;\n }\n\n public async getNativeCoin(tx: Transaction, amount: bigint): Promise<SuiNativeCoinResult> {\n const coin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])[0];\n\n if (coin === undefined) {\n return Promise.reject(Error('[SuiIntentService.getNativeCoin] coin undefined'));\n }\n\n return coin;\n }\n\n public async getCoin(\n tx: Transaction,\n coin: string,\n amount: bigint,\n address: string,\n ): Promise<TransactionResult | SuiTxObject> {\n const coins = await this.walletProvider.getCoins(address, coin);\n\n const objects: string[] = [];\n let totalAmount = BigInt(0);\n\n for (const coin of coins.data) {\n totalAmount += BigInt(coin.balance);\n objects.push(coin.coinObjectId);\n\n if (totalAmount >= amount) {\n break;\n }\n }\n\n const firstObject = objects[0];\n\n if (!firstObject) {\n throw new Error(`[SuiIntentService.getCoin] Coin=${coin} not found for address=${address} and amount=${amount}`);\n }\n\n if (objects.length > 1) {\n tx.mergeCoins(firstObject, objects.slice(1));\n }\n\n if (totalAmount === amount) {\n return tx.object(firstObject);\n }\n\n return tx.splitCoins(firstObject, [amount]);\n }\n\n splitAddress(address: string): { packageId: string; moduleId: string; stateId: string } {\n const parts = address.split('::');\n if (parts.length === 3) {\n if (parts[0] && parts[1] && parts[2]) {\n return { packageId: parts[0], moduleId: parts[1], stateId: parts[2] };\n }\n throw new Error('Invalid package address');\n }\n throw new Error('Invalid package address');\n }\n\n async sendMessage<R extends boolean = false>(\n dst_chain_id: bigint,\n dst_address: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const txb = new Transaction();\n const connection = this.splitAddress(this.chainConfig.addresses.connection);\n // Perform send message transaction\n txb.moveCall({\n target: `${connection.packageId}::${connection.moduleId}::send_message_ua`,\n arguments: [\n txb.object(connection.stateId),\n txb.pure.u256(dst_chain_id),\n txb.pure(bcs.vector(bcs.u8()).serialize(dst_address)),\n txb.pure(bcs.vector(bcs.u8()).serialize(data)),\n ],\n });\n if (raw) {\n const transactionRaw = await txb.build();\n const transactionRawBase64String = Buffer.from(transactionRaw).toString('base64');\n const walletAddress = await this.walletProvider.getWalletAddressBytes();\n return {\n from: walletAddress,\n to: `${connection.packageId}::${connection.moduleId}::send_message_ua`,\n value: 0n,\n data: transactionRawBase64String,\n } as SuiReturnType<R>;\n }\n\n return this.walletProvider.signAndExecuteTxn(txb) as PromiseSuiTxReturnType<R>;\n }\n\n async configureAssetManagerHub(hubNetworkId: number, hubAssetManager: Uint8Array): Promise<string> {\n const tx = new Transaction();\n const assetmanager = this.splitAddress(this.chainConfig.addresses.assetManager);\n\n tx.moveCall({\n target: `${assetmanager.packageId}::${assetmanager.moduleId}::set_hub_details`,\n arguments: [tx.object(assetmanager.stateId), tx.pure.u64(hubNetworkId), tx.pure.vector('u8', hubAssetManager)],\n });\n\n const result = await this.walletProvider.signAndExecuteTxn(tx);\n return result;\n }\n\n async getWalletAddress(): Promise<string> {\n return this.walletProvider.getWalletAddress();\n }\n\n async getWalletAddressBytes(): Promise<Hex> {\n const address = await this.getWalletAddress();\n return SuiSpokeProvider.getAddressBCSBytes(address);\n }\n\n static getAddressBCSBytes(suiaddress: string): Hex {\n return toHex(bcs.Address.serialize(suiaddress).toBytes());\n }\n}\n","import { getAssociatedTokenAddress } from '@solana/spl-token';\nimport {\n Connection,\n Keypair,\n type PublicKey,\n type TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport type { Hash, Hex } from 'viem';\nimport type { WalletAddressProvider } from '@sodax/types';\n\nexport type SolanaWalletConfig = { privateKey: Uint8Array };\n\nexport class SolanaWalletProvider implements WalletAddressProvider {\n private readonly wallet: Keypair;\n public readonly connection: Connection;\n\n constructor(walletConfig: SolanaWalletConfig, url: string) {\n this.wallet = Keypair.fromSecretKey(walletConfig.privateKey);\n this.connection = new Connection(url, 'confirmed');\n }\n\n private async waitForConfirmation(signature: string, connection: Connection) {\n const commitment = 'finalized';\n const latestBlockhash = await connection.getLatestBlockhash();\n const response = await connection.confirmTransaction(\n {\n signature,\n blockhash: latestBlockhash.blockhash,\n lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,\n },\n commitment,\n );\n console.log('Transaction confirmed:', response);\n }\n\n public async sendTransaction(transaction: VersionedTransaction): Promise<Hash> {\n const txHash = (await this.connection.sendTransaction(transaction)) as Hash;\n await this.waitForConfirmation(txHash, this.connection);\n return txHash;\n }\n\n async buildV0Txn(instructions: TransactionInstruction[], signers: Keypair[]) {\n const blockHash = await this.connection.getLatestBlockhash().then(res => res.blockhash);\n\n const messageV0 = new TransactionMessage({\n //@ts-ignore\n payerKey: signers[0]?.publicKey,\n recentBlockhash: blockHash,\n instructions,\n }).compileToV0Message();\n\n const tx = new VersionedTransaction(messageV0);\n tx.sign(signers);\n return tx;\n }\n\n public getAddress(): PublicKey {\n return this.wallet.publicKey;\n }\n\n public getWallet(): Keypair {\n return this.wallet;\n }\n\n public async getWalletAddress(): Promise<string> {\n return this.getAddress().toBase58();\n }\n\n public async getWalletAddressBytes(): Promise<Hex> {\n return `0x${Buffer.from(await this.getWalletAddress()).toString('hex')}` as Hex;\n }\n\n public async getAssociatedTokenAddress(mint: PublicKey): Promise<PublicKey> {\n return await getAssociatedTokenAddress(mint, this.getAddress(), true);\n }\n}\n","import type { SolanaChainConfig } from '../../types.js';\nimport type { SolanaWalletProvider } from './SolanaWalletProvider.js';\nimport type { ISpokeProvider } from '../index.js';\n\nexport class SolanaSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: SolanaWalletProvider;\n public readonly chainConfig: SolanaChainConfig;\n\n constructor(walletProvider: SolanaWalletProvider, chainConfig: SolanaChainConfig) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n }\n}\n","import { PublicKey } from '@solana/web3.js';\nimport type { Hex } from 'viem';\nimport { spokeChainConfig } from '../../../constants.js';\nimport type { SolanaChainConfig } from '../../../types.js';\nimport { SOLANA_MAINNET_CHAIN_ID } from '@sodax/types';\nconst solanaSpokeChainConfig = spokeChainConfig[SOLANA_MAINNET_CHAIN_ID] as SolanaChainConfig;\n\nexport function getSolanaAddressBytes(address: PublicKey): Hex {\n return `0x${Buffer.from(address.toBytes()).toString('hex')}` as Hex;\n}\n\nexport function hexToSolanaAddress(hex: Hex): PublicKey {\n const hexWithoutPrefix = hex.startsWith('0x') ? hex.slice(2) : hex;\n return new PublicKey(Buffer.from(hexWithoutPrefix, 'hex'));\n}\n\nexport function isNative(address: PublicKey): Boolean {\n if (address.equals(new PublicKey(solanaSpokeChainConfig.nativeToken))) {\n return true;\n }\n return false;\n}\n","import {\n isJsonRpcPayloadResponse,\n isResponseAddressType,\n isResponseSigningType,\n type IconAddress,\n type Result,\n} from '../../index.js';\n\nexport type IconJsonRpcVersion = '2.0';\n\nexport type HanaWalletRequestEvent =\n | 'REQUEST_HAS_ACCOUNT'\n | 'REQUEST_HAS_ADDRESS'\n | 'REQUEST_ADDRESS'\n | 'REQUEST_JSON'\n | 'REQUEST_SIGNING'\n | 'REQUEST_JSON-RPC';\nexport type HanaWalletResponseEvent =\n | 'RESPONSE_HAS_ACCOUNT'\n | 'RESPONSE_HAS_ADDRESS'\n | 'RESPONSE_ADDRESS'\n | 'RESPONSE_JSON-RPC'\n | 'RESPONSE_SIGNING'\n | 'CANCEL_SIGNING'\n | 'CANCEL_JSON-RPC';\n\nexport type ResponseAddressType = {\n type: 'RESPONSE_ADDRESS';\n payload: IconAddress;\n};\n\nexport type ResponseSigningType = {\n type: 'RESPONSE_SIGNING';\n payload: string;\n};\n\nexport type RelayRequestDetail = {\n type: HanaWalletRequestEvent;\n payload?: {\n jsonrpc: IconJsonRpcVersion;\n method: string;\n params: unknown;\n id: number | undefined;\n };\n};\n\nexport type RelayRequestSigning = {\n type: 'REQUEST_SIGNING';\n payload: {\n from: IconAddress;\n hash: string;\n };\n};\n\nexport type JsonRpcPayloadResponse = {\n id: number;\n result: string; // txHash\n};\n\ninterface RelayResponseEventDetail {\n type: HanaWalletResponseEvent;\n payload: unknown;\n}\n\nexport function requestAddress(): Promise<Result<IconAddress>> {\n return new Promise(resolve => {\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const response = customEvent.detail;\n if (isResponseAddressType(response)) {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n resolve({\n ok: true,\n value: response.payload,\n });\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler, false);\n window.dispatchEvent(\n new CustomEvent<RelayRequestDetail>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_ADDRESS',\n },\n }),\n );\n });\n}\n\nexport function requestSigning(from: IconAddress, hash: string): Promise<Result<string>> {\n return new Promise((resolve, reject) => {\n const signRequest = new CustomEvent<RelayRequestSigning>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_SIGNING',\n payload: {\n from,\n hash,\n },\n },\n });\n\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const response = customEvent.detail;\n if (isResponseSigningType(response)) {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n\n // resolve signature\n resolve({\n ok: true,\n value: response.payload,\n });\n } else if (response.type === 'CANCEL_SIGNING') {\n reject(new Error('CANCEL_SIGNING'));\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.dispatchEvent(signRequest);\n });\n}\n\nexport function requestJsonRpc(rawTransaction: unknown, id = 99999): Promise<Result<JsonRpcPayloadResponse>> {\n return new Promise((resolve, reject) => {\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const { type, payload } = customEvent.detail;\n if (type === 'RESPONSE_JSON-RPC') {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n\n if (isJsonRpcPayloadResponse(payload)) {\n resolve({\n ok: true,\n value: payload,\n });\n } else {\n reject(new Error('Invalid payload response type (expected JsonRpcPayloadResponse)'));\n }\n } else if (type === 'CANCEL_JSON-RPC') {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n reject(new Error('CANCEL_JSON-RPC'));\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.dispatchEvent(\n new CustomEvent<RelayRequestDetail>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_JSON-RPC',\n payload: {\n jsonrpc: '2.0',\n method: 'icx_sendTransaction',\n params: rawTransaction,\n id: id,\n },\n },\n }),\n );\n });\n}\n","import { encodeAbiParameters, parseAbiParameters } from 'viem';\nimport type { EvmContractCall } from '../types.js';\nimport type { IEvmWalletProvider, EvmRawTransactionReceipt, Hex } from '@sodax/types';\n\n/**\n * ABI-encode an array of ContractCall objects.\n * @param calls An array of ContractCall objects.\n * @returns ABI-encoded bytes representing the array of ContractCall objects.\n */\nexport function encodeContractCalls(calls: EvmContractCall[]): Hex {\n return encodeAbiParameters(parseAbiParameters('(address,uint256,bytes)[]'), [\n calls.map(v => [v.address, v.value, v.data] as const),\n ]);\n}\n\nexport async function waitForTransactionReceipt(\n hash: Hex,\n provider: IEvmWalletProvider,\n): Promise<EvmRawTransactionReceipt> {\n return provider.waitForTransactionReceipt(hash);\n}\n","import { encodeFunctionData, erc20Abi, type Address } from 'viem';\nimport type { EvmContractCall, EvmReturnType, PromiseEvmTxReturnType, Result } from '../../types.js';\nimport type { EvmSpokeProvider, SonicSpokeProvider } from '../../entities/Providers.js';\n\nexport class Erc20Service {\n private constructor() {}\n\n /**\n * Check if spender has enough ERC20 allowance for given amount\n * @param token - ERC20 token address\n * @param amount - Amount to check allowance for\n * @param owner - User wallet address\n * @param spender - Spender address\n * @param spokeProvider - EVM Spoke provider\n * @return - True if spender is allowed to spend amount on behalf of owner\n */\n static async isAllowanceValid(\n token: Address,\n amount: bigint,\n owner: Address,\n spender: Address,\n spokeProvider: EvmSpokeProvider | SonicSpokeProvider,\n ): Promise<Result<boolean>> {\n try {\n if (token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase()) {\n return {\n ok: true,\n value: true,\n };\n }\n\n const allowedAmount = await spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n return {\n ok: true,\n value: allowedAmount >= amount,\n };\n } catch (e) {\n return {\n ok: false,\n error: e,\n };\n }\n }\n\n /**\n * Approve ERC20 amount spending\n * @param token - ERC20 token address\n * @param amount - Amount to approve\n * @param spender - Spender address\n * @param provider - EVM Provider\n */\n static async approve<R extends boolean = false>(\n token: Address,\n amount: bigint,\n spender: Address,\n spokeProvider: EvmSpokeProvider | SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n const rawTx = {\n from: walletAddress,\n to: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spender, amount],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Encodes a transfer transaction for a token.\n * @param token - The address of the token.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @returns The encoded contract call.\n */\n public static encodeTransfer(token: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'transfer',\n args: [to, amount],\n }),\n };\n }\n\n /**\n * Encodes a transferFrom transaction for a token.\n * @param token - The address of the token.\n * @param from - The address to transfer the token from.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @returns The encoded contract call.\n */\n public static encodeTransferFrom(token: Address, from: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'transferFrom',\n args: [from, to, amount],\n }),\n };\n }\n\n /**\n * Encodes an approval transaction for a token.\n * @param token - The address of the token.\n * @param to - The address to approve the token to.\n * @param amount - The amount of the token to approve.\n * @returns The encoded contract call.\n */\n public static encodeApprove(token: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [to, amount],\n }),\n };\n }\n}\n","import { type Address, type Hash, type HttpTransport, type PublicClient, encodeFunctionData } from 'viem';\nimport { vaultTokenAbi } from '../../abis/index.js';\nimport type { EvmContractCall, TokenInfo, VaultReserves } from '../../types.js';\nimport type { IEvmWalletProvider } from '../../index.js';\n\nexport class EvmVaultTokenService {\n private constructor() {}\n\n /**\n * Fetches token information for a specific token in the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns Token information as a TokenInfo object.\n */\n public static async getTokenInfo(\n vault: Address,\n token: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<TokenInfo> {\n const [decimals, depositFee, withdrawalFee, maxDeposit, isSupported] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'tokenInfo',\n args: [token],\n });\n\n return { decimals, depositFee, withdrawalFee, maxDeposit, isSupported };\n }\n\n /**\n * Retrieves the reserves of the vault.\n * @param vault - The address of the vault.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns An object containing tokens and their balances.\n */\n public static async getVaultReserves(\n vault: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<VaultReserves> {\n const [tokens, balances] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'getVaultReserves',\n args: [],\n });\n\n return {\n tokens,\n balances,\n };\n }\n\n /**\n * Retrieves all token information for the vault.\n * @param vault - The address of the vault.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns A promise that resolves to an object containing tokens, their infos, and reserves.\n */\n async getAllTokenInfo(\n vault: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<{\n tokens: readonly Address[];\n infos: readonly TokenInfo[];\n reserves: readonly bigint[];\n }> {\n const [tokens, infos, reserves] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'getAllTokenInfo',\n args: [],\n });\n\n return {\n tokens,\n infos,\n reserves,\n };\n }\n\n /**\n * Deposits a specified amount of a token into the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to deposit.\n * @param amount - The amount of the token to deposit.\n * @param walletProvider - IEvmWalletProvider\n * @returns Transaction hash\n */\n public static async deposit(\n vault: Address,\n token: Address,\n amount: bigint,\n walletProvider: IEvmWalletProvider,\n ): Promise<Hash> {\n const from = (await walletProvider.getWalletAddress()) as `0x${string}`;\n return walletProvider.sendTransaction({\n from,\n to: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'deposit',\n args: [token, amount],\n }),\n });\n }\n\n /**\n * Withdraws a specified amount of a token from the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to withdraw.\n * @param amount - The amount of the token to withdraw.\n * @param provider - EvmWalletProvider\n * @returns Transaction hash\n */\n public static async withdraw(\n vault: Address,\n token: Address,\n amount: bigint,\n provider: IEvmWalletProvider,\n ): Promise<Hash> {\n const from = (await provider.getWalletAddress()) as `0x${string}`;\n return provider.sendTransaction({\n from,\n to: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'withdraw',\n args: [token, amount],\n }),\n });\n }\n\n /**\n * Encodes the deposit transaction data for the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to deposit.\n * @param amount - The amount of the token to deposit.\n * @returns The encoded contract call data.\n */\n static encodeDeposit(vault: Address, token: Address, amount: bigint): EvmContractCall {\n return {\n address: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'deposit',\n args: [token, amount],\n }),\n };\n }\n\n /**\n * Encodes the withdraw transaction data for the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to withdraw.\n * @param amount - The amount of the token to withdraw.\n * @returns The encoded contract call data.\n */\n static encodeWithdraw(vault: Address, token: Address, amount: bigint): EvmContractCall {\n return {\n address: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'withdraw',\n args: [token, amount],\n }),\n };\n }\n\n /**\n * Translates token amounts from their native decimals to 18 decimals\n * @param decimals - The number of decimals of the token\n * @param amount - The amount to translate\n * @returns The translated amount\n */\n public static translateIncomingDecimals(decimals: number, amount: bigint): bigint {\n if (decimals <= 18) {\n return amount * BigInt(10 ** (18 - decimals));\n }\n return amount / BigInt(10 ** (decimals - 18));\n }\n\n /**\n * Translates token amounts from 18 decimals back to their native decimals\n * @param decimals - The number of decimals of the token\n * @param amount - The amount to translate\n * @returns The translated amount\n */\n public static translateOutgoingDecimals(decimals: number, amount: bigint): bigint {\n if (decimals <= 18) {\n return amount / BigInt(10 ** (18 - decimals));\n }\n return amount * BigInt(10 ** (decimals - 18));\n }\n}\n","import { type Address, type Hex, type PublicClient, encodeFunctionData } from 'viem';\nimport { assetManagerAbi } from '../../abis/index.js';\nimport { getHubAssetInfo } from '../../constants.js';\nimport type { EvmHubProvider } from '../../entities/Providers.js';\nimport type { AssetInfo, EvmContractCall } from '../../types.js';\nimport { encodeContractCalls } from '../../utils/evm-utils.js';\nimport { Erc20Service } from '../shared/Erc20Service.js';\nimport { EvmVaultTokenService } from './EvmVaultTokenService.js';\nimport type { SpokeChainId } from '@sodax/types';\n\nexport type EvmDepositToDataParams = {\n token: Hex | string;\n to: Address;\n amount: bigint;\n};\n\nexport type EvmWithdrawAssetDataParams = {\n token: Hex | string;\n to: Hex; // since spoke chain can be non-evm as well\n amount: bigint;\n};\n\nexport class EvmAssetManagerService {\n private constructor() {}\n\n /**\n * Get asset information for a given asset address\n * @param asset - The address of the asset contract\n * @param assetManager - The address of the asset manager contract\n * @param client - The Viem public client\n * @returns Object containing chainID and spoke address for the asset\n */\n public static async getAssetInfo(asset: Address, assetManager: Address, client: PublicClient): Promise<AssetInfo> {\n const [chainId, spokeAddress] = await client.readContract({\n address: assetManager,\n abi: assetManagerAbi,\n functionName: 'assetInfo',\n args: [asset],\n });\n\n return {\n chainId,\n spokeAddress,\n };\n }\n\n /**\n * Encodes a transfer transaction for an asset.\n * @param token - The address of the token.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @param assetManager\n * @returns The encoded contract call.\n */\n public static encodeTransfer(token: Address, to: Address, amount: bigint, assetManager: Address): EvmContractCall {\n return {\n address: assetManager,\n value: 0n,\n data: encodeFunctionData({\n abi: assetManagerAbi,\n functionName: 'transfer',\n args: [token, to, amount, '0x'],\n }),\n };\n }\n\n /**\n * Constructs the data for depositing tokens to the spoke chain.\n * @param {EvmDepositToDataParams} params - The address of the token to deposit.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Hex} Encoded contract calls for the deposit transaction.\n * @throws Will throw an error if the asset or vault address is not found.\n */\n public static depositToData(params: EvmDepositToDataParams, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = getHubAssetInfo(spokeChainId, params.token);\n\n if (!assetConfig) {\n throw new Error('[depositToData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, params.amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, params.amount);\n calls.push(Erc20Service.encodeTransfer(vaultAddress, params.to, translatedAmount));\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Withdraw tokens from the spoke chain.\n * @param {EvmWithdrawAssetDataParams} params - Parameters for the withdrawal.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Hex} Encoded contract calls for the withdrawal transaction.\n * @throws Will throw an error if the asset address is not found.\n */\n public static withdrawAssetData(\n params: EvmWithdrawAssetDataParams,\n hubProvider: EvmHubProvider,\n spokeChainId: SpokeChainId,\n ): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = getHubAssetInfo(spokeChainId, params.token);\n\n if (!assetConfig) {\n throw new Error('[withdrawAssetData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n params.to,\n params.amount,\n hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Get asset address for a given chain ID and spoke address\n * @param chainId Chain ID where the asset exists\n * @param spokeAddress Address of the asset on the spoke chain\n * @param assetManager Address of the asset manager contract\n * @param client The Viem public client\n * @returns The asset's address on the hub chain\n */\n async getAssetAddress(\n chainId: bigint,\n spokeAddress: Address,\n assetManager: Address,\n client: PublicClient,\n ): Promise<Address> {\n return client.readContract({\n address: assetManager,\n abi: assetManagerAbi,\n functionName: 'assets',\n args: [chainId, spokeAddress],\n });\n }\n}\n","import type { Address } from 'viem';\nimport { walletFactoryAbi } from '../../abis/index.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { type Hex, getIntentRelayChainId } from '../../index.js';\nimport type { SpokeChainId } from '@sodax/types';\n\nexport class EvmWalletAbstraction {\n private constructor() {}\n\n /**\n * Get the hub wallet address for a given spoke chain and address.\n * @param chainId - The spoke chain ID.\n * @param address - The address on the spoke chain.\n * @param hubProvider - The hub provider.\n * @returns The hub wallet address.\n */\n public static async getUserHubWalletAddress(\n chainId: SpokeChainId,\n address: Hex,\n hubProvider: EvmHubProvider,\n ): Promise<Address> {\n return hubProvider.publicClient.readContract({\n address: hubProvider.chainConfig.addresses.hubWallet,\n abi: walletFactoryAbi,\n functionName: 'getDeployedAddress',\n args: [BigInt(getIntentRelayChainId(chainId)), address],\n });\n }\n}\n","import type { Address, Hex, SpokeChainId } from '@sodax/types';\nimport { SonicSpokeProvider, type EvmHubProvider, type SpokeProvider } from '../../entities/index.js';\nimport { EvmWalletAbstraction, SonicSpokeService } from '../../index.js';\n\n/**\n * Service to get valid hub wallet address which may differ based on the spoke chain.\n */\nexport class WalletAbstractionService {\n private constructor() {}\n\n public static async getUserHubWalletAddress(\n chainId: SpokeChainId,\n address: Hex,\n hubProvider: EvmHubProvider,\n spokeProvider: SpokeProvider,\n ): Promise<Address> {\n // if chainId is the same as the hub chain id, use the user router (sonic)\n if (chainId === hubProvider.chainConfig.chain.id) {\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.getUserRouter(address, spokeProvider);\n }\n\n throw new Error(\n '[WalletAbstractionService.getUserHubWalletAddress] Invalid spoke provider. Sonic spoke provider is required.',\n );\n }\n\n return EvmWalletAbstraction.getUserHubWalletAddress(chainId, address, hubProvider);\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n DEFAULT_MAX_RETRY,\n DEFAULT_RETRY_DELAY_MS,\n FEE_PERCENTAGE_SCALE,\n isPartnerFeeAmount,\n isPartnerFeePercentage,\n type Hex,\n type PartnerFee,\n} from '../index.js';\n\nexport async function retry<T>(\n action: (retryCount: number) => Promise<T>,\n retryCount: number = DEFAULT_MAX_RETRY,\n delayMs = DEFAULT_RETRY_DELAY_MS,\n): Promise<T> {\n do {\n try {\n return await action(retryCount);\n } catch (e) {\n retryCount--;\n\n if (retryCount <= 0) {\n console.error(`Failed to perform operation even after ${DEFAULT_MAX_RETRY} attempts.. Throwing origin error..`);\n throw e;\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, delayMs));\n } while (retryCount > 0);\n\n throw new Error(`Retry exceeded MAX_RETRY_DEFAULT=${DEFAULT_MAX_RETRY}`);\n}\n\nexport function getRandomBytes(length: number): Uint8Array {\n const array = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n array[i] = Math.floor(Math.random() * 256);\n }\n return array;\n}\n\nexport function randomUint256(): bigint {\n const bytes = getRandomBytes(32); // 256 bits\n let hex = '';\n\n for (const byte of bytes) {\n hex += byte.toString(16).padStart(2, '0') ?? '';\n }\n\n return BigInt(`0x${hex}`);\n}\n\n/**\n * Calculate the fee amount as a percentage of the input amount\n * @param {bigint} amount - The amount to calculate the fee for\n * @param {number} percentage - The percentage of the fee in basis points (e.g. 100 = 1%, 10000 = 100%)\n * @returns {bigint} The fee amount\n */\nexport function calculatePercentageFeeAmount(amount: bigint, percentage: number) {\n // Calculate fee as a percentage of the input amount\n return (amount * BigInt(percentage)) / FEE_PERCENTAGE_SCALE;\n}\n\n/**\n * Calculate the fee amount for a given input amount and fee\n * @param {bigint} inputAmount - The amount of input tokens\n * @param {PartnerFee} fee - The fee to calculate\n * @returns {bigint} The fee amount\n */\nexport function calculateFeeAmount(inputAmount: bigint, fee: PartnerFee | undefined): bigint {\n if (!fee) {\n return 0n;\n }\n\n invariant(inputAmount > 0n, 'Input amount must be greater than 0');\n\n let feeAmount = 0n;\n\n if (isPartnerFeeAmount(fee)) {\n invariant(\n fee.amount >= 0 && fee.amount <= inputAmount,\n `Fee amount must be greater than 0 and less than or equal to the input amount: ${fee.amount}`,\n );\n feeAmount = fee.amount;\n } else if (isPartnerFeePercentage(fee)) {\n invariant(\n fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,\n `Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`,\n );\n\n feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);\n }\n\n return feeAmount;\n}\n\nexport function BigIntToHex(value: bigint): Hex {\n return `0x${value.toString(16)}`;\n}\n","import { type Hex, encodeFunctionData, isAddress } from 'viem';\nimport { poolAbi } from '../../abis/pool.abi.js';\nimport type { EvmHubProvider, SpokeProvider } from '../../entities/index.js';\nimport {\n DEFAULT_RELAYER_API_ENDPOINT,\n getHubAssetInfo,\n getMoneyMarketConfig,\n getSupportedMoneyMarketTokens,\n isConfiguredMoneyMarketConfig,\n isValidOriginalAssetAddress,\n isValidSpokeChainId,\n moneyMarketReserveAssets,\n SpokeService,\n relayTxAndWaitPacket,\n uiPoolDataAbi,\n type RelayErrorCode,\n DEFAULT_RELAY_TX_TIMEOUT,\n EvmSpokeProvider,\n isMoneyMarketSupportedToken,\n spokeChainConfig,\n SonicSpokeProvider,\n SonicSpokeService,\n} from '../../index.js';\nimport type {\n EvmContractCall,\n GetAddressType,\n GetSpokeDepositParamsType,\n HttpUrl,\n MoneyMarketConfigParams,\n MoneyMarketServiceConfig,\n Result,\n TxReturnType,\n} from '../../types.js';\nimport { calculateFeeAmount, encodeContractCalls } from '../../utils/index.js';\nimport { EvmAssetManagerService, EvmVaultTokenService, WalletAbstractionService } from '../hub/index.js';\nimport { Erc20Service } from '../shared/index.js';\nimport invariant from 'tiny-invariant';\nimport { SONIC_MAINNET_CHAIN_ID, type SpokeChainId, type Token, type Address } from '@sodax/types';\nimport { wrappedSonicAbi } from '../../abis/wrappedSonic.abi.js';\n\nexport type AggregatedReserveData = {\n underlyingAsset: Address;\n name: string;\n symbol: string;\n decimals: bigint;\n baseLTVasCollateral: bigint;\n reserveLiquidationThreshold: bigint;\n reserveLiquidationBonus: bigint;\n reserveFactor: bigint;\n usageAsCollateralEnabled: boolean;\n borrowingEnabled: boolean;\n isActive: boolean;\n isFrozen: boolean;\n liquidityIndex: bigint;\n variableBorrowIndex: bigint;\n liquidityRate: bigint;\n variableBorrowRate: bigint;\n lastUpdateTimestamp: number;\n aTokenAddress: Address;\n variableDebtTokenAddress: Address;\n interestRateStrategyAddress: Address;\n availableLiquidity: bigint;\n totalScaledVariableDebt: bigint;\n priceInMarketReferenceCurrency: bigint;\n priceOracle: Address;\n variableRateSlope1: bigint;\n variableRateSlope2: bigint;\n baseVariableBorrowRate: bigint;\n optimalUsageRatio: bigint;\n isPaused: boolean;\n isSiloedBorrowing: boolean;\n accruedToTreasury: bigint;\n unbacked: bigint;\n isolationModeTotalDebt: bigint;\n flashLoanEnabled: boolean;\n debtCeiling: bigint;\n debtCeilingDecimals: bigint;\n borrowCap: bigint;\n supplyCap: bigint;\n borrowableInIsolation: boolean;\n virtualAccActive: boolean;\n virtualUnderlyingBalance: bigint;\n};\n\nexport type BaseCurrencyInfo = {\n marketReferenceCurrencyUnit: bigint;\n marketReferenceCurrencyPriceInUsd: bigint;\n networkBaseTokenPriceInUsd: bigint;\n networkBaseTokenPriceDecimals: number;\n};\n\nexport type UserReserveData = {\n underlyingAsset: string;\n scaledATokenBalance: bigint;\n usageAsCollateralEnabledOnUser: boolean;\n scaledVariableDebt: bigint;\n};\n\nexport type ReserveDataLegacy = {\n //stores the reserve configuration\n configuration: bigint;\n //the liquidity index. Expressed in ray\n liquidityIndex: bigint;\n //the current supply rate. Expressed in ray\n currentLiquidityRate: bigint;\n //variable borrow index. Expressed in ray\n variableBorrowIndex: bigint;\n //the current variable borrow rate. Expressed in ray\n currentVariableBorrowRate: bigint;\n // DEPRECATED on v3.2.0\n currentStableBorrowRate: bigint;\n //timestamp of last update\n lastUpdateTimestamp: number;\n //the id of the reserve. Represents the position in the list of the active reserves\n id: number;\n //aToken address\n aTokenAddress: Address;\n // DEPRECATED on v3.2.0\n stableDebtTokenAddress: Address;\n //variableDebtToken address\n variableDebtTokenAddress: Address;\n //address of the interest rate strategy\n interestRateStrategyAddress: Address;\n //the current treasury balance, scaled\n accruedToTreasury: bigint;\n //the outstanding unbacked aTokens minted through the bridging feature\n unbacked: bigint;\n //the outstanding debt borrowed against this asset in isolation mode\n isolationModeTotalDebt: bigint;\n};\n\nexport type MoneyMarketEncodeSupplyParams = {\n asset: Address; // The address of the asset to supply.\n amount: bigint; // The amount of the asset to supply.\n onBehalfOf: Address; // The address on whose behalf the asset is supplied.\n referralCode: number; // The referral code for the transaction.\n};\n\nexport type MoneyMarketEncodeWithdrawParams = {\n asset: Address; // The address of the asset to withdraw.\n amount: bigint; // The amount of the asset to withdraw.\n to: Address; // The address that will receive the withdrawn assets.\n};\n\nexport type MoneyMarketEncodeBorrowParams = {\n asset: Address; // The address of the asset to borrow.\n amount: bigint; // The amount of the asset to borrow.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n referralCode: number; // The referral code for the borrow transaction.\n onBehalfOf: Address; // The address that will receive the borrowed assets.\n};\n\nexport type MoneyMarketEncodeRepayParams = {\n asset: Address; // The address of the asset to repay.\n amount: bigint; // The amount of the asset to repay.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n onBehalfOf: Address; // The address that will get their debt reduced/removed.\n};\n\nexport type MoneyMarketEncodeRepayWithATokensParams = {\n asset: Address; // The address of the asset to repay.\n amount: bigint; // The amount of the asset to repay.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n};\n\nexport type MoneyMarketAction = 'supply' | 'borrow' | 'withdraw' | 'repay';\n\nexport type MoneyMarketSupplyParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to supply.\n action: 'supply';\n};\n\nexport type MoneyMarketBorrowParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to borrow.\n action: 'borrow';\n};\n\nexport type MoneyMarketWithdrawParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to withdraw.\n action: 'withdraw';\n};\n\nexport type MoneyMarketRepayParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to repay.\n action: 'repay';\n};\n\nexport type MoneyMarketParams =\n | MoneyMarketSupplyParams\n | MoneyMarketBorrowParams\n | MoneyMarketWithdrawParams\n | MoneyMarketRepayParams;\n\nexport type MoneyMarketErrorCode =\n | RelayErrorCode\n | 'UNKNOWN'\n | 'SUPPLY_FAILED'\n | 'BORROW_FAILED'\n | 'WITHDRAW_FAILED'\n | 'REPAY_FAILED';\n\nexport type MoneyMarketError = {\n code: MoneyMarketErrorCode;\n error: unknown;\n};\n\nexport class MoneyMarketService {\n public readonly config: MoneyMarketServiceConfig;\n private readonly hubProvider: EvmHubProvider;\n\n constructor(config: MoneyMarketConfigParams | undefined, hubProvider: EvmHubProvider, relayerApiEndpoint?: HttpUrl) {\n if (!config) {\n this.config = {\n ...getMoneyMarketConfig(SONIC_MAINNET_CHAIN_ID), // default to mainnet config\n partnerFee: undefined,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else if (isConfiguredMoneyMarketConfig(config)) {\n this.config = {\n ...config,\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else {\n this.config = {\n ...getMoneyMarketConfig(hubProvider.chainConfig.chain.id), // default to mainnet config\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n }\n this.hubProvider = hubProvider;\n }\n\n /**\n * Check if allowance is sufficient for actions on the money market pool\n * @param {MoneyMarketParams} params - Money market params containing token address and amount\n * @param {SpokeProvider} spokeProvider - The spoke provider instance\n * @return {Promise<Result<boolean>>} - Returns true if allowance is sufficient, false otherwise\n *\n * @example\n * const allowanceValid = await isAllowanceValid({\n * token: '0x...', // Address of the token (spoke chain) to supply\n * amount: 1000n, // Amount to supply (in token decimals)\n * action: 'supply',\n * }, spokeProvider);\n *\n * if (!allowanceValid.ok) {\n * // Handle error\n * }\n *\n * if (!allowanceValid.value) {\n * // Need to approve\n * }\n */\n public async isAllowanceValid<S extends SpokeProvider>(\n params: MoneyMarketParams,\n spokeProvider: S,\n ): Promise<Result<boolean>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.token.length > 0, 'Token is required');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n if (spokeProvider instanceof EvmSpokeProvider && (params.action === 'supply' || params.action === 'repay')) {\n return await Erc20Service.isAllowanceValid(\n params.token as GetAddressType<EvmSpokeProvider>,\n params.amount,\n walletAddress as GetAddressType<EvmSpokeProvider>,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n );\n }\n if (\n spokeProvider instanceof SonicSpokeProvider &&\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id\n ) {\n if (params.action === 'withdraw') {\n const withdrawInfo = await SonicSpokeService.getWithdrawInfo(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n spokeProvider,\n this,\n );\n return await SonicSpokeService.isWithdrawApproved(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n withdrawInfo,\n spokeProvider,\n );\n }\n if (params.action === 'borrow') {\n const borrowInfo = await SonicSpokeService.getBorrowInfo(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n this,\n );\n return await SonicSpokeService.isBorrowApproved(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n borrowInfo,\n spokeProvider,\n );\n }\n if (params.action === 'supply' || params.action === 'repay') {\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n return await Erc20Service.isAllowanceValid(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n walletAddress as GetAddressType<SonicSpokeProvider>,\n userRouter,\n spokeProvider,\n );\n }\n }\n\n return {\n ok: true,\n value: true,\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Approve amount spending if isAllowanceValid returns false.\n * For evm spoke chains, the spender is the asset manager contract while\n * for sonic spoke (hub) chain, the spender is the user router contract.\n * @param token - ERC20 token address\n * @param amount - Amount to approve\n * @param spender - Spender address\n * @param spokeProvider - Spoke provider\n * @returns {Promise<Result<TxReturnType<S, R>>>} - Returns the transaction receipt\n *\n * @example\n * const approveResult = await approve(\n * {\n * token: '0x...', // ERC20 token address\n * amount: 1000n, // Amount to approve (in token decimals)\n * action: 'supply', // Action to perform\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = execute and return the transaction hash (default: false)\n * );\n *\n * if (!approveResult.ok) {\n * // Handle error\n * }\n *\n * const txReceipt = approveResult.value;\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>(\n params: MoneyMarketParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.token.length > 0, 'Token is required');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n if (spokeProvider instanceof EvmSpokeProvider) {\n invariant(\n params.action === 'supply' || params.action === 'repay',\n 'Invalid action (only supply and repay are supported on evm)',\n );\n invariant(isAddress(params.token), 'Invalid token address');\n\n const result = (await Erc20Service.approve(\n params.token,\n params.amount,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n\n if (\n spokeProvider instanceof SonicSpokeProvider &&\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id\n ) {\n invariant(\n params.action === 'withdraw' ||\n params.action === 'borrow' ||\n params.action === 'supply' ||\n params.action === 'repay',\n 'Invalid action (only withdraw, borrow, supply and repay are supported on sonic)',\n );\n invariant(isAddress(params.token), 'Invalid token address');\n\n if (params.action === 'withdraw') {\n const withdrawInfo = await SonicSpokeService.getWithdrawInfo(\n params.token,\n params.amount,\n spokeProvider,\n this,\n );\n\n const result = (await SonicSpokeService.approveWithdraw(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n withdrawInfo,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n if (params.action === 'borrow') {\n const borrowInfo = await SonicSpokeService.getBorrowInfo(\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n this,\n );\n\n const result = (await SonicSpokeService.approveBorrow(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n borrowInfo,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n if (params.action === 'supply' || params.action === 'repay') {\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n const result = (await Erc20Service.approve(\n params.token,\n params.amount,\n userRouter,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n }\n\n return {\n ok: false,\n error: new Error('Approve only supported for EVM spoke chains'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Supply tokens to the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n * @param params - The parameters for the supply transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.supplyAndSubmit(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to supply\n * amount: 1000n, // Amount to supply (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Supply transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async supplyAndSubmit<S extends SpokeProvider>(\n params: MoneyMarketSupplyParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[Hex, Hex], MoneyMarketError>> {\n try {\n const txResult = await this.supply(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'SUPPLY_FAILED',\n error: txResult.error,\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error: error,\n },\n };\n }\n }\n\n /**\n * Supply tokens to the money market pool without submitting the intent to the Solver API\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully supply tokens, you need to:\n * 1. Check if the allowance is sufficient\n * 2. Approve the asset manager contract to spend the tokens\n * 3. Supply the tokens\n * 4. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the supply transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result.\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.supply(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Supply transaction hash:', txHash);\n * } else {\n * console.error('Supply failed:', result.error);\n * }\n */\n async supply<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketSupplyParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>, MoneyMarketError>> {\n try {\n invariant(params.action === 'supply', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n const hubWallet = await WalletAbstractionService.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n\n const data: Hex = this.supplyData(params.token, hubWallet, params.amount, spokeProvider.chainConfig.chain.id);\n\n const walletAddress = (await spokeProvider.walletProvider.getWalletAddress()) as `0x${string}`;\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: hubWallet,\n token: params.token,\n amount: params.amount,\n data,\n } as unknown as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error,\n },\n };\n }\n }\n\n /**\n * Borrow tokens from the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n * @param params - The parameters for the borrow transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.borrowAndSubmit(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to borrow\n * amount: 1000n, // Amount to borrow (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Borrow transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async borrowAndSubmit<S extends SpokeProvider>(\n params: MoneyMarketBorrowParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[Hex, Hex], MoneyMarketError>> {\n try {\n const txResult = await this.borrow(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'BORROW_FAILED',\n error: txResult.error,\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error: error,\n },\n };\n }\n }\n\n /**\n * Borrow tokens from the money market pool without submitting the intent to the Solver API\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully borrow tokens, you need to:\n * 1. Execute the borrow transaction on the spoke chain\n * 2. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the borrow transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result (raw transaction data or transaction hash).\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.borrow(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Borrow transaction hash:', txHash);\n * } else {\n * console.error('Borrow failed:', result.error);\n * }\n */\n async borrow<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketBorrowParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>> {\n invariant(params.action === 'borrow', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n const hubWallet = await WalletAbstractionService.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n\n const data: Hex = this.borrowData(\n hubWallet,\n walletAddressBytes,\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n );\n\n const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n\n return { ok: true, value: txResult as TxReturnType<S, R> };\n }\n\n /**\n * Withdraw tokens from the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n *\n * @param params - The parameters for the withdraw transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.withdrawAndSubmit(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to withdraw\n * amount: 1000n, // Amount to withdraw (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Withdraw transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async withdrawAndSubmit<S extends SpokeProvider>(\n params: MoneyMarketWithdrawParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[Hex, Hex], MoneyMarketError>> {\n try {\n const txResult = await this.withdraw(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'WITHDRAW_FAILED',\n error: txResult.error,\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error: error,\n },\n };\n }\n }\n\n /**\n * Withdraw tokens from the money market pool without submitting the intent to the Solver API\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully withdraw tokens, you need to:\n * 1. Execute the withdraw transaction on the spoke chain\n * 2. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the withdraw transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result (raw transaction data or transaction hash).\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.withdraw(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Withdraw transaction hash:', txHash);\n * } else {\n * console.error('Withdraw failed:', result.error);\n * }\n */\n async withdraw<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketWithdrawParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>> {\n invariant(params.action === 'withdraw', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n const hubWallet = await WalletAbstractionService.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n\n const data: Hex = this.withdrawData(\n hubWallet,\n walletAddressBytes,\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n );\n\n const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n\n return { ok: true, value: txResult };\n }\n\n /**\n * Repay tokens to the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n *\n * @param params - The parameters for the repay transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.repayAndSubmit(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to repay\n * amount: 1000n, // Amount to repay (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Repay transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async repayAndSubmit<S extends SpokeProvider>(\n params: MoneyMarketRepayParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[Hex, Hex], MoneyMarketError>> {\n try {\n const txResult = await this.repay(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'REPAY_FAILED',\n error: txResult.error,\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error: error,\n },\n };\n }\n }\n\n /**\n * Repay tokens to the money market pool without submitting the intent to the Solver API\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully repay tokens, you need to:\n * 1. Check if the allowance is sufficient\n * 2. Approve the asset manager contract to spend the tokens\n * 3. Execute the repay transaction on the spoke chain\n * 4. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the repay transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} The transaction result (raw transaction data or transaction hash) or error.\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.repay(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Repay transaction hash:', txHash);\n * } else {\n * console.error('Repay failed:', result.error);\n * }\n */\n async repay<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketRepayParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>> {\n invariant(params.action === 'repay', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n const hubWallet = await WalletAbstractionService.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n const data: Hex = this.repayData(params.token, hubWallet, params.amount, spokeProvider.chainConfig.chain.id);\n\n const walletAddress = (await spokeProvider.walletProvider.getWalletAddress()) as `0x${string}`;\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: hubWallet,\n token: params.token,\n amount: params.amount,\n data,\n } as unknown as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return { ok: true, value: txResult as TxReturnType<S, R> };\n }\n\n /**\n * Build transaction data for supplying to the money market pool\n * @param token - The address of the token on spoke chain\n * @param to - The user wallet address on the hub chain\n * @param amount - The amount to deposit\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public supplyData(token: string, to: Address, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = getHubAssetInfo(spokeChainId, token);\n\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${token}`);\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const lendingPool = this.config.lendingPool;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, amount);\n calls.push(Erc20Service.encodeApprove(vaultAddress, lendingPool, translatedAmount));\n calls.push(\n MoneyMarketService.encodeSupply(\n { asset: vaultAddress, amount: translatedAmount, onBehalfOf: to, referralCode: 0 },\n lendingPool,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for borrowing from the money market pool\n * @param from - The user wallet address on the hub chain\n * @param to - The user wallet address on the spoke chain\n * @param token - The address of the token to borrow\n * @param amount - The amount to borrow in hub chain decimals\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public borrowData(from: Address, to: Address | Hex, token: string, amount: bigint, spokeChainId: SpokeChainId): Hex {\n invariant(isValidSpokeChainId(spokeChainId), `Invalid spokeChainId: ${spokeChainId}`);\n invariant(\n isValidOriginalAssetAddress(spokeChainId, token),\n `Unsupported spoke chain (${spokeChainId}) token: ${token}`,\n );\n\n const assetConfig = getHubAssetInfo(spokeChainId, token);\n\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${token}`);\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const bnUSDVault = this.config.bnUSDVault;\n const bnUSD = this.config.bnUSD;\n\n const feeAmount = calculateFeeAmount(amount, this.config.partnerFee);\n const calls: EvmContractCall[] = [];\n\n if (bnUSDVault && bnUSD && bnUSDVault.toLowerCase() === vaultAddress.toLowerCase()) {\n calls.push(\n MoneyMarketService.encodeBorrow(\n { asset: bnUSD, amount: amount, interestRateMode: 2n, referralCode: 0, onBehalfOf: from },\n this.config.lendingPool,\n ),\n );\n calls.push(Erc20Service.encodeApprove(bnUSD, bnUSDVault, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(bnUSDVault, bnUSD, amount));\n\n if (this.config.partnerFee && feeAmount) {\n calls.push(Erc20Service.encodeTransfer(bnUSDVault, this.config.partnerFee.address, feeAmount));\n }\n } else {\n calls.push(\n MoneyMarketService.encodeBorrow(\n { asset: vaultAddress, amount: amount, interestRateMode: 2n, referralCode: 0, onBehalfOf: from },\n this.config.lendingPool,\n ),\n );\n\n if (this.config.partnerFee && feeAmount) {\n calls.push(Erc20Service.encodeTransfer(vaultAddress, this.config.partnerFee.address, feeAmount));\n }\n }\n\n calls.push(EvmVaultTokenService.encodeWithdraw(vaultAddress, assetAddress, amount - feeAmount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(assetConfig.decimal, amount - feeAmount);\n\n if (spokeChainId === this.hubProvider.chainConfig.chain.id) {\n if (token.toLowerCase() === spokeChainConfig[this.hubProvider.chainConfig.chain.id].nativeToken.toLowerCase()) {\n const withdrawToCall = {\n address: assetAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'withdrawTo',\n args: [to, translatedAmountOut],\n }),\n };\n\n calls.push(withdrawToCall);\n } else {\n calls.push(Erc20Service.encodeTransfer(assetAddress, to, translatedAmountOut));\n }\n } else {\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for withdrawing from the money market pool\n * @param from - The user wallet address on the hub chain\n * @param to - The user wallet address on the spoke chain\n * @param token - The address of the token to borrow\n * @param amount - The amount to borrow in hub chain decimals\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public withdrawData(from: Address, to: Address, token: string, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = getHubAssetInfo(spokeChainId, token);\n\n if (!assetConfig) {\n throw new Error('[withdrawData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n\n if (!assetAddress || !vaultAddress) {\n throw new Error('Address not found');\n }\n calls.push(\n MoneyMarketService.encodeWithdraw({ asset: vaultAddress, amount: amount, to: from }, this.config.lendingPool),\n );\n\n calls.push(EvmVaultTokenService.encodeWithdraw(vaultAddress, assetAddress, amount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(assetConfig.decimal, amount);\n\n if (spokeChainId === this.hubProvider.chainConfig.chain.id) {\n if (token.toLowerCase() === spokeChainConfig[this.hubProvider.chainConfig.chain.id].nativeToken.toLowerCase()) {\n const withdrawToCall = {\n address: assetAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'withdrawTo',\n args: [to, translatedAmountOut],\n }),\n };\n calls.push(withdrawToCall);\n } else {\n calls.push(Erc20Service.encodeTransfer(assetAddress, to, translatedAmountOut));\n }\n } else {\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for repaying to the money market pool\n * @param token - The address of the token to repay\n * @param to - The user wallet address on the hub chain\n * @param amount - The amount to repay\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public repayData(token: string, to: Address, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = getHubAssetInfo(spokeChainId, token);\n\n if (!assetConfig) {\n throw new Error('[repayData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const bnUSDVault = this.config.bnUSDVault;\n const bnUSD = this.config.bnUSD;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, amount);\n\n let repayToken = vaultAddress;\n if (bnUSDVault && bnUSD && bnUSDVault.toLowerCase() === vaultAddress.toLowerCase()) {\n repayToken = bnUSD;\n calls.push(EvmVaultTokenService.encodeWithdraw(bnUSDVault, bnUSD, translatedAmount));\n }\n\n calls.push(Erc20Service.encodeApprove(repayToken, this.config.lendingPool, translatedAmount));\n calls.push(\n MoneyMarketService.encodeRepay(\n { asset: repayToken, amount: translatedAmount, interestRateMode: 2n, onBehalfOf: to },\n this.config.lendingPool,\n ),\n );\n return encodeContractCalls(calls);\n }\n\n /**\n * Get the list of all reserves in the pool\n * @param uiPoolDataProvider - The address of the UI Pool Data Provider\n * @param poolAddressesProvider - The address of the Pool Addresses Provider\n * @returns {Promise<readonly Address[]>} - Array of reserve addresses\n */\n async getReservesList(uiPoolDataProvider: Address, poolAddressesProvider: Address): Promise<readonly Address[]> {\n return this.hubProvider.publicClient.readContract({\n address: uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getReservesList',\n args: [poolAddressesProvider],\n });\n }\n\n /**\n * Get detailed data for all reserves in the pool\n * @param uiPoolDataProvider - The address of the UI Pool Data Provider\n * @param poolAddressesProvider - The address of the Pool Addresses Provider\n * @returns {Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]>} - Tuple containing array of reserve data and base currency info\n */\n async getReservesData(\n uiPoolDataProvider: Address,\n poolAddressesProvider: Address,\n ): Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]> {\n return this.hubProvider.publicClient.readContract({\n address: uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getReservesData',\n args: [poolAddressesProvider],\n });\n }\n\n /**\n * Get detailed data for a reserve in the pool\n * @param poolAddress - The address of the pool\n * @param assetAddress - The address of the asset\n * @returns Tuple containing array of reserve data and base currency info\n */\n async getReserveData(poolAddress: Address, assetAddress: Address): Promise<ReserveDataLegacy> {\n return this.hubProvider.publicClient.readContract({\n address: poolAddress,\n abi: poolAbi,\n functionName: 'getReserveData',\n args: [assetAddress],\n });\n }\n\n /**\n * Calculate aToken amount from actual amount using liquidityIndex\n * @param amount - The actual amount\n * @param normalizedIncome - The current normalized income from reserve data\n * @returns {bigint} The equivalent aToken amount\n */\n static calculateATokenAmount(amount: bigint, normalizedIncome: bigint): bigint {\n return (amount * 10n ** 27n) / normalizedIncome + 1n;\n }\n\n /**\n * Get the normalized income for a reserve\n * @param poolAddress The address of the pool\n * @param asset The address of the asset\n * @returns The normalized income\n */\n async getReserveNormalizedIncome(poolAddress: Address, asset: Address): Promise<bigint> {\n return this.hubProvider.publicClient.readContract({\n address: poolAddress,\n abi: poolAbi,\n functionName: 'getReserveNormalizedIncome',\n args: [asset],\n });\n }\n\n /**\n * Get user-specific reserve data\n * @param userAddress Address of the user\n * @param uiPoolDataProvider - The address of the UI Pool Data Provider\n * @param poolAddressesProvider - The address of the Pool Addresses Provider\n * @returns {Promise<readonly [readonly UserReserveData[], number]>} - Tuple containing array of user reserve data and eMode category ID\n */\n async getUserReservesData(\n userAddress: Address,\n uiPoolDataProvider: Address,\n poolAddressesProvider: Address,\n ): Promise<readonly [readonly UserReserveData[], number]> {\n return this.hubProvider.publicClient.readContract({\n address: uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getUserReservesData',\n args: [poolAddressesProvider, userAddress],\n });\n }\n\n /**\n * Encodes a supply transaction for a money market pool.\n * @param {MoneyMarketEncodeWithdrawParams} params - The parameters for the supply transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeSupply(params: MoneyMarketEncodeSupplyParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'supply',\n args: [params.asset, params.amount, params.onBehalfOf, params.referralCode],\n }),\n };\n }\n\n /**\n * Encodes a withdraw transaction from a pool.\n * @param {MoneyMarketEncodeWithdrawParams} params - The parameters for the withdraw transaction.\n * @param {Address} params.asset - The address of the asset to withdraw.\n * @param {bigint} params.amount - The amount of the asset to withdraw.\n * @param {Address} params.to - The address that will receive the withdrawn assets.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeWithdraw(params: MoneyMarketEncodeWithdrawParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'withdraw',\n args: [params.asset, params.amount, params.to],\n }),\n };\n }\n\n /**\n * Encodes a borrow transaction from a pool.\n * @param {MoneyMarketEncodeBorrowParams} params - The parameters for the borrow transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeBorrow(params: MoneyMarketEncodeBorrowParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'borrow',\n args: [params.asset, params.amount, params.interestRateMode, params.referralCode, params.onBehalfOf],\n }),\n };\n }\n\n /**\n * Encodes a repay transaction for a pool.\n * @param {MoneyMarketEncodeRepayParams} params - The parameters for the repay transaction.\n * @param {Address} params.asset - The address of the borrowed asset to repay.\n * @param {bigint} params.amount - The amount to repay. Use type(uint256).max to repay the entire debt.\n * @param {number} params.interestRateMode - The interest rate mode (2 for Variable).\n * @param {Address} params.onBehalfOf - The address of the user who will get their debt reduced/removed.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeRepay(params: MoneyMarketEncodeRepayParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'repay',\n args: [params.asset, params.amount, params.interestRateMode, params.onBehalfOf],\n }),\n };\n }\n\n /**\n * Encodes a repayWithATokens transaction for a pool.\n * @param {MoneyMarketEncodeRepayWithATokensParams} params - The parameters for the repayWithATokens transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeRepayWithATokens(\n params: MoneyMarketEncodeRepayWithATokensParams,\n lendingPool: Address,\n ): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'repayWithATokens',\n args: [params.asset, params.amount, params.interestRateMode],\n }),\n };\n }\n\n /**\n * Encodes a setUserUseReserveAsCollateral transaction.\n * @param asset - The address of the underlying asset to be used as collateral.\n * @param useAsCollateral - True to enable the asset as collateral, false to disable.\n * @param lendingPool - The address of lending pool contract\n * @returns The encoded contract call.\n */\n public static encodeSetUserUseReserveAsCollateral(\n asset: Address,\n useAsCollateral: boolean,\n lendingPool: Address,\n ): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'setUserUseReserveAsCollateral',\n args: [asset, useAsCollateral],\n }),\n };\n }\n\n /**\n * Get the list of all supported money market tokens (supply / borrow tokens) for a given spoke chain ID\n * @param chainId The chain ID\n * @returns {readonly Token[]} - Array of supported tokens\n */\n public getSupportedTokens(chainId: SpokeChainId): readonly Token[] {\n return getSupportedMoneyMarketTokens(chainId);\n }\n\n /**\n * Get the list of all supported money market reserves (supply / borrow reserves)\n * NOTE: reserve addresses are on the hub chain and can be of type vault, erc20, etc.\n * @returns {readonly Address[]} - Array of supported reserves\n */\n public getSupportedReserves(): readonly Address[] {\n return [...moneyMarketReserveAssets];\n }\n}\n","import { type Address, encodeFunctionData } from 'viem';\nimport { erc20Abi, spokeAssetManagerAbi } from '../../abis/index.js';\nimport type { EvmHubProvider, EvmSpokeProvider } from '../../entities/index.js';\nimport { connectionAbi, getIntentRelayChainId } from '../../index.js';\nimport type { EvmReturnType, EvmTransferToHubParams, PromiseEvmTxReturnType, TxReturnType } from '../../types.js';\nimport type { Hex, HubAddress } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\n\nexport type EvmSpokeDepositParams = {\n from: Address; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: Hex; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport class EvmSpokeService {\n private constructor() {}\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {EvmSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async deposit<R extends boolean = false>(\n params: EvmSpokeDepositParams,\n spokeProvider: EvmSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return EvmSpokeService.transfer(\n {\n token: params.token,\n recipient: to,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {EvmSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: Address, spokeProvider: EvmSpokeProvider): Promise<bigint> {\n return spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [token],\n });\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: EvmSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): Promise<TxReturnType<EvmSpokeProvider, R>> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n const result = await EvmSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n\n return result satisfies TxReturnType<EvmSpokeProvider, R>;\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {EvmTransferToHubParams} params - The parameters for the transfer, including:\n * - {Address} token: The address of the token to transfer (use address(0) for native token).\n * - {Address} recipient: The recipient address on the hub chain.\n * - {bigint} amount: The amount to transfer.\n * - {Hex} [data=\"0x\"]: Additional data for the transfer.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: EvmTransferToHubParams,\n spokeProvider: EvmSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const txPayload = {\n address: spokeProvider.chainConfig.addresses.assetManager,\n abi: spokeAssetManagerAbi,\n functionName: 'transfer',\n args: [token, recipient, amount, data],\n value: token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase() ? amount : undefined,\n } as const;\n\n const from = await spokeProvider.walletProvider.getWalletAddress();\n const rawTx = {\n from,\n to: txPayload.address,\n value: txPayload.value ?? 0n,\n data: encodeFunctionData({\n abi: spokeAssetManagerAbi,\n functionName: 'transfer',\n args: [token, recipient, amount, data],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {Address} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: EvmSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const txPayload = {\n address: spokeProvider.chainConfig.addresses.connection,\n abi: connectionAbi,\n functionName: 'sendMessage',\n args: [dstChainId, dstAddress, payload],\n } as const;\n\n const from = await spokeProvider.walletProvider.getWalletAddress();\n const rawTx = {\n from,\n to: txPayload.address,\n value: 0n,\n data: encodeFunctionData({\n abi: connectionAbi,\n functionName: 'sendMessage',\n args: [dstChainId, dstAddress, payload],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n}\n","import { type Address, type Hex, toHex } from 'viem';\nimport { CWSpokeProvider } from '../../entities/cosmos/CWSpokeProvider.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { type HubAddress, type PromiseCWTxReturnType, getIntentRelayChainId } from '../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\n\nexport type CWSpokeDepositParams = {\n from: string; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type TransferToHubParams = {\n token: string;\n recipient: Address;\n amount: string;\n data: Hex;\n};\n\nexport class CWSpokeService {\n private constructor() {}\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {CWSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {CWSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseCWTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async deposit<R extends boolean = false>(\n params: CWSpokeDepositParams,\n spokeProvider: CWSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n toHex(Buffer.from(params.from, 'utf-8')),\n hubProvider,\n ));\n\n return CWSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount.toString(),\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {CWSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: String, spokeProvider: CWSpokeProvider): Promise<bigint> {\n const bal = await spokeProvider.getBalance(token);\n return BigInt(bal);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {CWSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {PromiseCWTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: CWSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return CWSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {TransferToHubParams} params - The parameters for the transfer, including:\n * - {string} token: The address of the token to transfer (use address(0) for native token).\n * - {Uint8Array} recipient: The recipient address on the hub chain.\n * - {string} amount: The amount to transfer.\n * - {Uint8Array} [data=new Uint8Array([])]: Additional data for the transfer.\n * @param {CWSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseCWTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: TransferToHubParams,\n spokeProvider: CWSpokeProvider,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const sender = await spokeProvider.walletProvider.getWalletAddress();\n return CWSpokeProvider.deposit(sender, token, recipient, amount, data, spokeProvider, raw);\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {Address} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {CWSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {PromiseCWTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: Hex,\n payload: Hex,\n spokeProvider: CWSpokeProvider,\n raw?: R,\n ): PromiseCWTxReturnType<R> {\n const sender = await spokeProvider.walletProvider.getWalletAddress();\n return spokeProvider.send_message(sender, dstChainId.toString(), dstAddress, payload, raw);\n }\n}\n","import * as IconSdkRaw from 'icon-sdk-js';\nconst IconSdk = (IconSdkRaw.default?.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nconst { Converter, CallTransactionBuilder, CallBuilder } = IconSdk;\nimport * as rlp from 'rlp';\nimport type { Address, Hex } from 'viem';\nimport type { IconSpokeProvider } from '../../entities/icon/IconSpokeProvider.js';\nimport { getIconAddressBytes } from '../../entities/icon/utils.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { BigIntToHex, getIntentRelayChainId, isNativeToken } from '../../index.js';\nimport type { IconAddress, IconReturnType, PromiseIconTxReturnType } from '../../types.js';\nimport type { HubAddress } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\n\nexport type IconSpokeDepositParams = {\n from: IconAddress; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type TransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class IconSpokeService {\n private constructor() {}\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {IconSpokeDepositParams} params - The parameters for the deposit\n * @param {IconWalletProvider} spokeProvider - The provider for the spoke chain\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {Promise<Result<string>>} A promise that resolves to the transaction hash\n */\n public static async deposit<R extends boolean = false>(\n params: IconSpokeDepositParams,\n spokeProvider: IconSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n getIconAddressBytes(params.from),\n hubProvider,\n ));\n\n return IconSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {string} token - The address of the token to get the balance of\n * @param {IconWalletProvider} spokeProvider - The spoke provider\n * @returns {Promise<bigint>} The balance of the token\n */\n public static async getDeposit(token: string, spokeProvider: IconSpokeProvider): Promise<bigint> {\n const transaction = new CallBuilder()\n .to(token)\n .method('balanceOf')\n .params({ _owner: spokeProvider.chainConfig.addresses.assetManager })\n .build();\n const result = await spokeProvider.iconService.call(transaction).execute();\n return BigInt(result.value);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain\n * @param {Hex} payload - The payload to send to the contract\n * @param {IconWalletProvider} spokeProvider - The provider for the spoke chain\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {Promise<Result<string>>} A promise that resolves to the transaction hash\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: IconSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return IconSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Transfers tokens to the hub chain.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data }: TransferToHubParams,\n spokeProvider: IconSpokeProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const rlpInput: rlp.Input = [data, recipient];\n const rlpEncodedData = rlp.encode(rlpInput);\n const hexData = `0x${Buffer.from(rlpEncodedData).toString('hex')}`;\n const params = {\n _to: spokeProvider.chainConfig.addresses.assetManager,\n _value: BigIntToHex(amount),\n _data: hexData,\n };\n\n const value: Hex = isNativeToken(spokeProvider.chainConfig.chain.id, token) ? BigIntToHex(amount) : '0x0';\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n const rawTransaction = Converter.toRawTransaction(\n new CallTransactionBuilder()\n .from(walletAddress)\n .to(token)\n .stepLimit(Converter.toBigNumber('2000000'))\n .nid(spokeProvider.chainConfig.nid)\n .version('0x3')\n .timestamp(new Date().getTime() * 1000)\n .value(value)\n .method('transfer')\n .params(params)\n .build(),\n );\n\n if (raw) {\n return rawTransaction satisfies IconReturnType<true> as IconReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction({\n from: walletAddress,\n to: isNativeToken(spokeProvider.chainConfig.chain.id, token)\n ? // wICX address\n 'cx3975b43d260fb8ec802cef6e60c2f4d07486f11d'\n : token,\n value: value,\n nid: spokeProvider.chainConfig.nid,\n method: 'transfer',\n params: params,\n }) satisfies PromiseIconTxReturnType<false> as PromiseIconTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: IconSpokeProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const params = {\n dstChainId: dstChainId.toString(),\n dstAddress: dstAddress,\n payload: payload,\n };\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n\n const transaction = new CallTransactionBuilder()\n .from(walletAddressBytes)\n .to(spokeProvider.chainConfig.addresses.connection)\n .stepLimit(Converter.toBigNumber('2000000'))\n .nid(spokeProvider.chainConfig.nid)\n .version('0x3')\n .timestamp(new Date().getTime() * 1000)\n .method('sendMessage')\n .params(params)\n .build();\n\n if (raw) {\n return Converter.toRawTransaction(transaction) as IconReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction({\n from: walletAddressBytes,\n to: spokeProvider.chainConfig.addresses.connection,\n nid: spokeProvider.chainConfig.nid,\n value: '0x0',\n method: 'sendMessage',\n params: params,\n }) satisfies PromiseIconTxReturnType<false> as PromiseIconTxReturnType<R>;\n }\n}\n","import * as anchor from '@coral-xyz/anchor';\nimport { Connection, type Keypair, PublicKey } from '@solana/web3.js';\nimport type { AssetManager } from './types/asset_manager.js';\nimport type { Connection as ConnectionContract } from './types/connection.js';\nexport async function getProvider(keypair: Keypair, rpcUrl: string, wsUrl: string): Promise<anchor.AnchorProvider> {\n const wallet = {\n publicKey: keypair.publicKey,\n signTransaction: () => Promise.reject(),\n signAllTransactions: () => Promise.reject(),\n };\n const connection = new Connection(rpcUrl, {\n wsEndpoint: wsUrl,\n });\n return new anchor.AnchorProvider(connection, wallet, { commitment: 'confirmed' });\n}\n\nexport async function getAssetManagerIdl(assetManager: string, provider: anchor.AnchorProvider) {\n try {\n const idl = await anchor.Program.fetchIdl(new PublicKey(assetManager), provider);\n if (!idl) {\n throw new Error('asset manager idl not available');\n }\n return idl;\n } catch (err) {\n console.log('Failed to fetch Program IDl:', err);\n throw err;\n }\n}\n\nexport async function getConnectionIdl(connection: string, provider: anchor.AnchorProvider) {\n try {\n const idl = await anchor.Program.fetchIdl(new PublicKey(connection), provider);\n if (!idl) {\n throw new Error('asset manager idl not available');\n }\n return idl;\n } catch (err) {\n console.log('Failed to fetch Program IDl:', err);\n throw err;\n }\n}\n\nexport async function getAssetManagerProgram(\n keypair: Keypair,\n rpcUrl: string,\n wsUrl: string,\n assetManager: string,\n): Promise<anchor.Program<AssetManager>> {\n const provider = await getProvider(keypair, rpcUrl, wsUrl);\n const idl = await getAssetManagerIdl(assetManager, provider);\n\n return new anchor.Program(idl as anchor.Idl, provider) as unknown as anchor.Program<AssetManager>;\n}\n\nexport async function getConnectionProgram(\n keypair: Keypair,\n rpcUrl: string,\n wsUrl: string,\n connection: string,\n): Promise<anchor.Program<ConnectionContract>> {\n const provider = await getProvider(keypair, rpcUrl, wsUrl);\n const idl = await getConnectionIdl(connection, provider);\n\n return new anchor.Program(idl as anchor.Idl, provider) as unknown as anchor.Program<ConnectionContract>;\n}\n","import { PublicKey } from '@solana/web3.js';\nimport type BN from 'bn.js';\n\nexport const RateLimitPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('rmconfig')], programId);\n return { bump, pda };\n },\n\n rateLimitAccount(programId: PublicKey, token: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('limit'), token.toBuffer()], programId);\n return { bump, pda };\n },\n};\n\nexport const ConnectionConfigPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('config')], programId);\n\n return { bump, pda };\n },\n\n receipt(programId: PublicKey, srcChainId: BN, connectionSn: BN) {\n const [pda, bump] = PublicKey.findProgramAddressSync(\n [Buffer.from('receipt'), srcChainId.toBuffer(), connectionSn.toBuffer()],\n programId,\n );\n\n return { bump, pda };\n },\n};\n\nexport const AssetManagerPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('config-seed')], programId);\n\n return { bump, pda };\n },\n\n vault_token(programId: PublicKey, mint: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('vault_seed'), mint.toBuffer()], programId);\n\n return { bump, pda };\n },\n\n vault_native(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('vault_native')], programId);\n\n return { bump, pda };\n },\n\n authority(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('dapp_authority')], programId);\n\n return { bump, pda };\n },\n\n ta_creation_fee_account_pda(programId: PublicKey, mint: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync(\n [Buffer.from('ta_creation_account_seed'), mint.toBuffer()],\n programId,\n );\n\n return { bump, pda };\n },\n};\n","import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { ComputeBudgetProgram, PublicKey, SystemProgram, type TransactionInstruction } from '@solana/web3.js';\nimport { type Address, type Hex, toHex } from 'viem';\nimport { getIntentRelayChainId } from '../../constants.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { getAssetManagerProgram, getConnectionProgram } from '../../entities/solana/Configs.js';\nimport type { SolanaSpokeProvider } from '../../entities/solana/SolanaSpokeProvider.js';\nimport { AssetManagerPDA, ConnectionConfigPDA } from '../../entities/solana/pda/pda.js';\nimport { isNative } from '../../entities/solana/utils/utils.js';\nimport type { PromiseSolanaTxReturnType, SolanaReturnType } from '../../types.js';\nimport type { HubAddress } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport BN from 'bn.js';\n\nexport type SolanaSpokeDepositParams = {\n from: PublicKey;\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: PublicKey;\n amount: bigint;\n data: Hex;\n};\n\nexport type TransferToHubParams = {\n token: PublicKey;\n recipient: string;\n amount: string;\n data: Hex;\n};\n\nexport class SolanaSpokeService {\n private constructor() {}\n\n public static async deposit<R extends boolean = false>(\n params: SolanaSpokeDepositParams,\n spokeProvider: SolanaSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n toHex(params.from.toBytes()),\n hubProvider,\n ));\n\n return SolanaSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount.toString(),\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n public static async getDeposit(token: string, spokeProvider: SolanaSpokeProvider): Promise<bigint> {\n const assetManagerProgram = await getAssetManagerProgram(\n spokeProvider.walletProvider.getWallet(),\n spokeProvider.chainConfig.rpcUrl,\n spokeProvider.chainConfig.wsUrl,\n spokeProvider.chainConfig.addresses.assetManager,\n );\n const solToken = new PublicKey(Buffer.from(token, 'hex'));\n if (isNative(new PublicKey(solToken))) {\n const vaultNative = AssetManagerPDA.vault_native(assetManagerProgram.programId);\n const balance = await spokeProvider.walletProvider.connection.getBalance(vaultNative.pda);\n return BigInt(balance);\n }\n const vaultToken = AssetManagerPDA.vault_token(assetManagerProgram.programId, new PublicKey(solToken));\n const tokenAccount = await spokeProvider.walletProvider.connection.getTokenAccountBalance(vaultToken.pda);\n return BigInt(tokenAccount.value.amount);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param from - The address of the user on the hub chain.\n * @param payload - The payload to send to the contract.\n * @param spokeProvider - The spoke provider.\n * @param hubProvider - The hub provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: SolanaSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return SolanaSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data }: TransferToHubParams,\n spokeProvider: SolanaSpokeProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n let depositInstruction: TransactionInstruction;\n const amountBN = new BN(amount);\n const { walletProvider, chainConfig } = spokeProvider;\n const { rpcUrl, wsUrl, addresses } = chainConfig;\n\n const assetManagerProgram = await getAssetManagerProgram(\n walletProvider.getWallet(),\n rpcUrl,\n wsUrl,\n addresses.assetManager,\n );\n const walletPublicKey = walletProvider.getAddress();\n const connectionProgram = await getConnectionProgram(\n walletProvider.getWallet(),\n rpcUrl,\n wsUrl,\n addresses.connection,\n );\n\n if (isNative(token)) {\n depositInstruction = await assetManagerProgram.methods\n .transfer(amountBN, Buffer.from(recipient.slice(2), 'hex'), Buffer.from(data.slice(2), 'hex'))\n .accountsStrict({\n signer: walletPublicKey,\n systemProgram: SystemProgram.programId,\n config: AssetManagerPDA.config(assetManagerProgram.programId).pda,\n nativeVaultAccount: AssetManagerPDA.vault_native(assetManagerProgram.programId).pda,\n tokenVaultAccount: null,\n signerTokenAccount: null,\n authority: AssetManagerPDA.authority(assetManagerProgram.programId).pda,\n mint: null,\n connection: connectionProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts([\n {\n pubkey: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n isSigner: false,\n isWritable: true,\n },\n ])\n .instruction();\n } else {\n const signerTokenAccount = await spokeProvider.walletProvider.getAssociatedTokenAddress(token);\n depositInstruction = await assetManagerProgram.methods\n .transfer(amountBN, Buffer.from(recipient.slice(2), 'hex'), Buffer.from(data.slice(2), 'hex'))\n .accountsStrict({\n signer: walletPublicKey,\n systemProgram: SystemProgram.programId,\n config: AssetManagerPDA.config(assetManagerProgram.programId).pda,\n nativeVaultAccount: null,\n tokenVaultAccount: AssetManagerPDA.vault_token(assetManagerProgram.programId, token).pda,\n signerTokenAccount: signerTokenAccount,\n authority: AssetManagerPDA.authority(assetManagerProgram.programId).pda,\n mint: token,\n connection: connectionProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts([\n {\n pubkey: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n isSigner: false,\n isWritable: true,\n },\n ])\n .instruction();\n }\n\n const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n units: 1_400_000,\n });\n\n const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 0,\n });\n\n const transaction = await spokeProvider.walletProvider.buildV0Txn(\n [modifyComputeUnits, addPriorityFee, depositInstruction],\n [spokeProvider.walletProvider.getWallet()],\n );\n if (raw) {\n const serializedTxn = transaction.serialize();\n const base64Txn = Buffer.from(serializedTxn).toString('base64');\n return {\n from: spokeProvider.walletProvider.getAddress(),\n to: assetManagerProgram.programId,\n value: BigInt(amountBN.toString()),\n data: base64Txn,\n } as SolanaReturnType<R>;\n }\n const tx = spokeProvider.walletProvider.sendTransaction(transaction);\n return tx as PromiseSolanaTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n * @param dstChainId - The chain ID of the hub chain.\n * @param dstAddress - The address on the hub chain.\n * @param payload - The payload to send.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: SolanaSpokeProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const { walletProvider, chainConfig } = spokeProvider;\n const { rpcUrl, wsUrl, addresses } = chainConfig;\n const connectionProgram = await getConnectionProgram(\n walletProvider.getWallet(),\n rpcUrl,\n wsUrl,\n addresses.connection,\n );\n const walletPublicKey = walletProvider.getAddress();\n const sendMessageInstruction = await connectionProgram.methods.sendMessage(\n new BN(dstChainId.toString()),\n Buffer.from(dstAddress.slice(2), 'hex'),\n Buffer.from(payload.slice(2), 'hex'),\n ).accountsStrict!({\n signer: walletPublicKey,\n dapp: null,\n config: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n systemProgram: SystemProgram.programId,\n }).instruction();\n\n const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n units: 1000000,\n });\n\n const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 0,\n });\n\n const transaction = await spokeProvider.walletProvider.buildV0Txn(\n [modifyComputeUnits, addPriorityFee, sendMessageInstruction],\n [spokeProvider.walletProvider.getWallet()],\n );\n if (raw) {\n const serializedTxn = transaction.serialize();\n const base64Txn = Buffer.from(serializedTxn).toString('base64');\n return {\n from: walletPublicKey,\n to: connectionProgram.programId,\n value: 0n,\n data: base64Txn,\n } as SolanaReturnType<R>;\n }\n return spokeProvider.walletProvider.sendTransaction(transaction) as PromiseSolanaTxReturnType<R>;\n }\n}\n","import { type Address, type Hex, fromHex } from 'viem';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport type { StellarSpokeProvider } from '../../entities/stellar/StellarSpokeProvider.js';\nimport { type HubAddress, type PromiseStellarTxReturnType, getIntentRelayChainId } from '../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\n\nexport type StellarSpokeDepositParams = {\n from: Hex; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type TransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class StellarSpokeService {\n private constructor() {}\n\n public static async deposit<R extends boolean = false>(\n params: StellarSpokeDepositParams,\n spokeProvider: StellarSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return StellarSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n public static async getDeposit(token: string, spokeProvider: StellarSpokeProvider): Promise<bigint> {\n return BigInt(await spokeProvider.getBalance(token));\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param from - The address of the user on the hub chain.\n * @param payload - The payload to send to the contract.\n * @param spokeProvider - The spoke provider.\n * @param hubProvider - The hub provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: StellarSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return StellarSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: TransferToHubParams,\n spokeProvider: StellarSpokeProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n return await spokeProvider.deposit(\n token,\n amount.toString(),\n fromHex(recipient, 'bytes'),\n fromHex(data, 'bytes'),\n raw,\n );\n }\n\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: StellarSpokeProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n return await spokeProvider.sendMessage(\n dstChainId.toString(),\n fromHex(dstAddress, 'bytes'),\n fromHex(payload, 'bytes'),\n raw,\n );\n }\n}\n","import { type Address, type Hex, fromHex } from 'viem';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport type { SuiSpokeProvider } from '../../entities/sui/SuiSpokeProvider.js';\nimport { type HubAddress, type PromiseSuiTxReturnType, getIntentRelayChainId } from '../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\n\nexport type SuiSpokeDepositParams = {\n from: Hex; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type TransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class SuiSpokeService {\n private constructor() {}\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {CWSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n public static async deposit<R extends boolean = false>(\n params: SuiSpokeDepositParams,\n spokeProvider: SuiSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return SuiSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SuiSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: string, spokeProvider: SuiSpokeProvider): Promise<bigint> {\n return spokeProvider.getBalance(token);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the spoke chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: SuiSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return SuiSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {TransferToHubParams} params - The parameters for the transfer, including:\n * - {string} token: The address of the token to transfer (use address(0) for native token).\n * - {Uint8Array} recipient: The recipient address on the hub chain.\n * - {string} amount: The amount to transfer.\n * - {Uint8Array} [data=new Uint8Array([])]: Additional data for the transfer.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: TransferToHubParams,\n spokeProvider: SuiSpokeProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n return spokeProvider.transfer(token, amount, fromHex(recipient, 'bytes'), fromHex(data, 'bytes'), raw);\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {HubAddress} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: SuiSpokeProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n return spokeProvider.sendMessage(dstChainId, fromHex(dstAddress, 'bytes'), fromHex(payload, 'bytes'), raw);\n }\n}\n","import { type Address, decodeAbiParameters, encodeFunctionData, erc20Abi } from 'viem';\nimport { sonicWalletFactoryAbi } from '../../abis/sonicWalletFactory.abi.js';\nimport { variableDebtTokenAbi } from '../../abis/variableDebtToken.abi.js';\nimport { wrappedSonicAbi } from '../../abis/wrappedSonic.abi.js';\nimport type { SonicSpokeProvider } from '../../entities/index.js';\nimport type { EvmContractCall, EvmReturnType, PromiseEvmTxReturnType, Result } from '../../types.js';\nimport { Erc20Service } from '../index.js';\nimport { MoneyMarketService } from '../moneyMarket/MoneyMarketService.js';\nimport { getHubAssetInfo } from '../../constants.js';\nimport { encodeContractCalls } from '../../utils/evm-utils.js';\nimport type { Hex, HubAddress, SpokeChainId } from '@sodax/types';\n\nexport type SonicSpokeDepositParams = {\n from: Address; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: Address; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit (encoded calls array)\n};\n\nexport type WithdrawInfo = {\n aTokenAddress: Address;\n aTokenAmount: bigint;\n token: Address;\n};\n\nexport type BorrowInfo = {\n variableDebtTokenAddress: Address;\n vaultAddress: Address;\n amount: bigint;\n};\n\nexport class SonicSpokeService {\n private constructor() {}\n\n /**\n * Get the derived address of a contract deployed with CREATE3.\n * @param address - User's address on the specified chain as hex\n * @param provider - Sonic Spoke provider\n * @returns {HubAddress} The computed contract address as a EVM address (hex) string\n */\n public static async getUserRouter(address: Address, provider: SonicSpokeProvider): Promise<HubAddress> {\n return provider.publicClient.readContract({\n address: provider.chainConfig.addresses.walletRouter,\n abi: sonicWalletFactoryAbi,\n functionName: 'getDeployedAddress',\n args: [address],\n });\n }\n\n /**\n * Deposit tokens to the spoke chain using the Sonic wallet abstraction.\n * @param {SonicSpokeDepositParams} params - The parameters for the deposit\n * @param {SonicSpokeProvider} spokeProvider - The provider for the spoke chain\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async deposit<R extends boolean = false>(\n params: SonicSpokeDepositParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const userHubAddress = params.to ?? (await SonicSpokeService.getUserRouter(params.from, spokeProvider));\n\n // Decode the data field which contains the encoded calls array\n const calls = Array.from(\n decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n params.data,\n )[0] satisfies readonly EvmContractCall[],\n );\n\n if (params.token === spokeProvider.chainConfig.nativeToken) {\n // Add a call to wrap the native token\n const wrapCall = {\n address: spokeProvider.chainConfig.addresses.wrappedSonic,\n value: params.amount,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'deposit',\n }),\n } satisfies EvmContractCall;\n calls.unshift(wrapCall);\n } else {\n const transferFromCall = Erc20Service.encodeTransferFrom(\n params.token,\n params.from,\n userHubAddress,\n params.amount,\n );\n calls.unshift(transferFromCall);\n }\n\n const txData = encodeFunctionData({\n abi: sonicWalletFactoryAbi,\n functionName: 'route',\n args: [\n calls.map(call => ({\n addr: call.address,\n value: call.value,\n data: call.data,\n })),\n ],\n });\n\n const rawTx = {\n from: params.from,\n to: spokeProvider.chainConfig.addresses.walletRouter,\n data: txData,\n value: params.token === spokeProvider.chainConfig.nativeToken ? params.amount : 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SonicSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: Address, spokeProvider: SonicSpokeProvider): Promise<bigint> {\n return spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [token],\n });\n }\n\n /**\n * Execute a batch of contract calls through the Sonic wallet contract.\n * @param {Hex} payload - The encoded payload containing the calls array\n * @param {SonicSpokeProvider} spokeProvider - The provider for the spoke chain\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async callWallet<R extends boolean = false>(\n payload: Hex,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n // Decode the payload which contains the encoded calls array\n const calls = decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n payload,\n )[0] satisfies readonly EvmContractCall[];\n\n const txData = encodeFunctionData({\n abi: sonicWalletFactoryAbi,\n functionName: 'route',\n args: [\n calls.map(call => ({\n addr: call.address,\n value: call.value,\n data: call.data,\n })),\n ],\n });\n\n const rawTx = {\n from: await spokeProvider.walletProvider.getWalletAddress(),\n to: spokeProvider.chainConfig.addresses.walletRouter,\n data: txData,\n value: 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Get withdraw information for a given token\n * @param token - The address of the underlying token\n * @param amount - The amount to withdraw\n * @param spokeProvider - The spoke provider\n * @param moneyMarketService - The money market service\n * @returns {WithdrawInfo} WithdrawInfo containing aToken address, amount and vault address\n */\n public static async getWithdrawInfo(\n token: Address,\n amount: bigint,\n spokeProvider: SonicSpokeProvider,\n moneyMarketService: MoneyMarketService,\n ): Promise<WithdrawInfo> {\n const assetConfig = getHubAssetInfo(spokeProvider.chainConfig.chain.id, token);\n\n if (!assetConfig) {\n throw new Error('[SonicSpokeService.getWithdrawInfo] Hub asset not found');\n }\n\n const vaultAddress = assetConfig.vault;\n\n const [normalizedIncome, reserveData] = await Promise.all([\n moneyMarketService.getReserveNormalizedIncome(moneyMarketService.config.lendingPool, vaultAddress),\n moneyMarketService.getReserveData(moneyMarketService.config.lendingPool, vaultAddress),\n ]);\n\n const aTokenAddress = reserveData.aTokenAddress;\n const aTokenAmount = MoneyMarketService.calculateATokenAmount(amount, normalizedIncome);\n\n return {\n aTokenAddress,\n aTokenAmount,\n token,\n };\n }\n\n /**\n * Get borrow information for a given token\n * @param token - The address of the underlying token\n * @param amount - The amount to borrow\n * @param chainId - The chain ID\n * @param moneyMarketService - The money market service\n * @returns BorrowInfo containing variable debt token address and vault address\n */\n public static async getBorrowInfo(\n token: Address,\n amount: bigint,\n chainId: SpokeChainId,\n moneyMarketService: MoneyMarketService,\n ): Promise<BorrowInfo> {\n const assetConfig = getHubAssetInfo(chainId, token);\n\n if (!assetConfig) {\n throw new Error('[SonicSpokeService.getBorrowInfo] Hub asset not found');\n }\n\n const vaultAddress = assetConfig.vault;\n const reserveData = await moneyMarketService.getReserveData(moneyMarketService.config.lendingPool, vaultAddress);\n const variableDebtTokenAddress = reserveData.variableDebtTokenAddress;\n\n return {\n variableDebtTokenAddress,\n vaultAddress,\n amount,\n };\n }\n\n /**\n * Check if the user has approved the withdrawal of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param withdrawInfo - The information about the withdrawal\n * @param spokeProvider - The spoke provider\n * @param spender - The address of the spender\n * @returns {Promise<Result<boolean>>} A promise that resolves to the result of the approval check\n */\n public static async isWithdrawApproved(\n from: Address,\n withdrawInfo: WithdrawInfo,\n spokeProvider: SonicSpokeProvider,\n spender?: HubAddress,\n ): Promise<Result<boolean>> {\n try {\n const spenderAddress = spender ?? (await SonicSpokeService.getUserRouter(from, spokeProvider));\n\n return Erc20Service.isAllowanceValid(\n withdrawInfo.token,\n withdrawInfo.aTokenAmount,\n from,\n spenderAddress,\n spokeProvider,\n );\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n\n /**\n * Approve the withdrawal of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param withdrawInfo - The information about the withdrawal\n * @param spokeProvider - The spoke provider\n * @param raw - Whether to return the raw transaction data\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async approveWithdraw<R extends boolean = false>(\n from: Address,\n withdrawInfo: WithdrawInfo,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const [userRouter, walletAddress] = await Promise.all([\n SonicSpokeService.getUserRouter(from, spokeProvider),\n spokeProvider.walletProvider.getWalletAddress(),\n ]);\n\n const txData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [userRouter, withdrawInfo.aTokenAmount],\n });\n\n const rawTx = {\n from: walletAddress,\n to: withdrawInfo.aTokenAddress,\n data: txData,\n value: 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Check if the user has approved the borrowing of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param borrowInfo - The information about the borrowing\n * @param spokeProvider - The spoke provider\n * @param spender - The address of the spender\n * @returns {Promise<Result<boolean>>} A promise that resolves to the result of the approval check\n */\n public static async isBorrowApproved(\n from: Address,\n borrowInfo: BorrowInfo,\n spokeProvider: SonicSpokeProvider,\n spender?: HubAddress,\n ): Promise<Result<boolean>> {\n try {\n const spenderAddress = spender ?? (await SonicSpokeService.getUserRouter(from, spokeProvider));\n\n const allowance: bigint = await spokeProvider.publicClient.readContract({\n address: borrowInfo.variableDebtTokenAddress,\n abi: variableDebtTokenAbi,\n functionName: 'borrowAllowance',\n args: [from, spenderAddress],\n });\n\n return {\n ok: true,\n value: allowance >= borrowInfo.amount,\n };\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n\n public static async approveBorrow<R extends boolean = false>(\n from: Address,\n borrowInfo: BorrowInfo,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const [userRouter, walletAddress] = await Promise.all([\n SonicSpokeService.getUserRouter(from, spokeProvider),\n spokeProvider.walletProvider.getWalletAddress(),\n ]);\n\n const txData = encodeFunctionData({\n abi: variableDebtTokenAbi,\n functionName: 'approveDelegation',\n args: [userRouter, borrowInfo.amount],\n });\n\n const rawTx = {\n from: walletAddress,\n to: borrowInfo.variableDebtTokenAddress,\n data: txData,\n value: 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n public static async withdrawData(\n from: Address,\n withdrawInfo: WithdrawInfo,\n amount: bigint,\n spokeProvider: SonicSpokeProvider,\n moneyMarketService: MoneyMarketService,\n ): Promise<Hex> {\n const userRouter = await SonicSpokeService.getUserRouter(from, spokeProvider);\n\n // Add withdraw call\n const withdrawCall = moneyMarketService.withdrawData(\n userRouter,\n from,\n withdrawInfo.token,\n amount,\n spokeProvider.chainConfig.chain.id,\n );\n const calls = decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n withdrawCall,\n )[0] as {\n address: Address;\n value: bigint;\n data: `0x${string}`;\n }[];\n\n const transferFromCall = Erc20Service.encodeTransferFrom(\n withdrawInfo.aTokenAddress,\n from,\n userRouter,\n withdrawInfo.aTokenAmount,\n );\n calls.unshift({\n address: transferFromCall.address,\n value: transferFromCall.value,\n data: transferFromCall.data,\n });\n\n return encodeContractCalls(calls);\n }\n}\n","import { SONIC_MAINNET_CHAIN_ID } from '@sodax/types';\nimport type {\n JsonRpcPayloadResponse,\n ResponseAddressType,\n ResponseSigningType,\n} from './entities/icon/HanaWalletConnector.js';\nimport {\n CWSpokeProvider,\n IconSpokeProvider,\n SolanaSpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n type EvmUninitializedConfig,\n type EvmInitializedConfig,\n type EvmUninitializedPrivateKeyConfig,\n type EvmUninitializedBrowserConfig,\n type SpokeProvider,\n EvmSpokeProvider,\n SonicSpokeProvider,\n} from './entities/index.js';\nimport {\n INTENT_RELAY_CHAIN_IDS,\n type EvmHubChainConfig,\n type EvmSpokeChainConfig,\n type HubChainConfig,\n type IconAddress,\n type IntentRelayChainId,\n type MoneyMarketConfig,\n type MoneyMarketConfigParams,\n type Optional,\n type PartnerFeeAmount,\n type PartnerFeeConfig,\n type PartnerFeePercentage,\n type Prettify,\n type SolverConfig,\n type SolverConfigParams,\n type SpokeChainConfig,\n} from './index.js';\n\nexport function isEvmHubChainConfig(value: HubChainConfig): value is EvmHubChainConfig {\n return typeof value === 'object' && value.chain.type === 'EVM';\n}\n\nexport function isEvmSpokeChainConfig(value: SpokeChainConfig): value is EvmSpokeChainConfig {\n return typeof value === 'object' && value.chain.type === 'EVM';\n}\n\nexport function isEvmUninitializedConfig(\n value: EvmUninitializedConfig | EvmInitializedConfig,\n): value is EvmUninitializedConfig {\n return typeof value === 'object' && 'chain' in value;\n}\n\nexport function isEvmInitializedConfig(\n value: EvmUninitializedConfig | EvmInitializedConfig,\n): value is EvmInitializedConfig {\n return typeof value === 'object' && 'walletClient' in value && 'publicClient' in value;\n}\n\nexport function isEvmUninitializedBrowserConfig(value: EvmUninitializedConfig): value is EvmUninitializedBrowserConfig {\n return typeof value === 'object' && 'userAddress' in value && 'chain' in value && 'provider' in value;\n}\n\nexport function isEvmUninitializedPrivateKeyConfig(\n value: EvmUninitializedConfig,\n): value is EvmUninitializedPrivateKeyConfig {\n return typeof value === 'object' && 'chain' in value && 'privateKey' in value;\n}\n\nexport function isIconAddress(value: unknown): value is IconAddress {\n return typeof value === 'string' && /^hx[a-f0-9]{40}$|^cx[a-f0-9]{40}$/.test(value);\n}\nexport function isResponseAddressType(value: unknown): value is ResponseAddressType {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'payload' in value &&\n value.type === 'RESPONSE_ADDRESS' &&\n isIconAddress(value.payload)\n );\n}\n\nexport function isResponseSigningType(value: unknown): value is ResponseSigningType {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'payload' in value &&\n value.type === 'RESPONSE_SIGNING' &&\n typeof value.payload === 'string'\n );\n}\n\nexport function isJsonRpcPayloadResponse(value: unknown): value is JsonRpcPayloadResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n 'result' in value &&\n typeof value.result === 'string'\n );\n}\n\nexport function isIntentRelayChainId(value: bigint): value is IntentRelayChainId {\n return (\n typeof value === 'bigint' &&\n value >= 0n &&\n Object.values(INTENT_RELAY_CHAIN_IDS).includes(value as IntentRelayChainId)\n );\n}\n\nexport function isPartnerFeeAmount(value: unknown): value is PartnerFeeAmount {\n return typeof value === 'object' && value !== null && 'address' in value && 'amount' in value;\n}\n\nexport function isPartnerFeePercentage(value: unknown): value is PartnerFeePercentage {\n return typeof value === 'object' && value !== null && 'address' in value && 'percentage' in value;\n}\n\nexport function isEvmSpokeProvider(value: SpokeProvider): value is EvmSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof EvmSpokeProvider &&\n value.chainConfig.chain.type === 'EVM'\n );\n}\n\nexport function isSonicSpokeProvider(value: SpokeProvider): value is SonicSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SonicSpokeProvider &&\n value.chainConfig.chain.type === 'EVM' &&\n value.chainConfig.chain.id === SONIC_MAINNET_CHAIN_ID\n );\n}\n\nexport function isSolanaSpokeProvider(value: SpokeProvider): value is SolanaSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SolanaSpokeProvider &&\n value.chainConfig.chain.type === 'SOLANA'\n );\n}\n\nexport function isStellarSpokeProvider(value: SpokeProvider): value is StellarSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof StellarSpokeProvider &&\n value.chainConfig.chain.type === 'STELLAR'\n );\n}\n\nexport function isCWSpokeProvider(value: SpokeProvider): value is CWSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof CWSpokeProvider &&\n value.chainConfig.chain.type === 'INJECTIVE'\n );\n}\n\nexport function isIconSpokeProvider(value: SpokeProvider): value is IconSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof IconSpokeProvider &&\n value.chainConfig.chain.type === 'ICON'\n );\n}\n\nexport function isSuiSpokeProvider(value: SpokeProvider): value is SuiSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SuiSpokeProvider &&\n value.chainConfig.chain.type === 'SUI'\n );\n}\n\nexport function isConfiguredSolverConfig(\n value: SolverConfigParams,\n): value is Prettify<SolverConfig & Optional<PartnerFeeConfig, 'partnerFee'>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'intentsContract' in value &&\n 'solverApiEndpoint' in value &&\n 'relayerApiEndpoint' in value\n );\n}\n\nexport function isConfiguredMoneyMarketConfig(\n value: MoneyMarketConfigParams,\n): value is Prettify<MoneyMarketConfig & Optional<PartnerFeeConfig, 'partnerFee'>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'lendingPool' in value &&\n 'uiPoolDataProvider' in value &&\n 'poolAddressesProvider' in value &&\n 'bnUSD' in value &&\n 'bnUSDVault' in value\n );\n}\n","import { CWSpokeProvider } from '../../entities/cosmos/CWSpokeProvider.js';\nimport { IconSpokeProvider } from '../../entities/icon/IconSpokeProvider.js';\nimport {\n type EvmHubProvider,\n EvmSpokeProvider,\n SolanaSpokeProvider,\n SonicSpokeProvider,\n type SpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n} from '../../entities/index.js';\nimport type { GetSpokeDepositParamsType, PromiseTxReturnType, TxReturnType } from '../../types.js';\nimport type { Address, Hex, HubAddress } from '@sodax/types';\nimport { CWSpokeService } from './CWSpokeService.js';\nimport { EvmSpokeService } from './EvmSpokeService.js';\nimport { IconSpokeService } from './IconSpokeService.js';\nimport { SolanaSpokeService } from './SolanaSpokeService.js';\nimport { StellarSpokeService } from './StellarSpokeService.js';\nimport { SuiSpokeService } from './SuiSpokeService.js';\nimport { SonicSpokeService } from './SonicSpokeService.js';\nimport {\n isCWSpokeProvider,\n isEvmSpokeProvider,\n isIconSpokeProvider,\n isSolanaSpokeProvider,\n isSonicSpokeProvider,\n isStellarSpokeProvider,\n isSuiSpokeProvider,\n} from '../../guards.js';\n\n/**\n * SpokeService is a main class that provides functionalities for dealing with spoke chains.\n * It uses command pattern to execute different spoke chain operations.\n */\n\nexport class SpokeService {\n private constructor() {}\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {GetSpokeDepositParamsType<T extends SpokeProvider>} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<Hash>} A promise that resolves to the transaction hash.\n */\n public static async deposit<T extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: GetSpokeDepositParamsType<T>,\n spokeProvider: T,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): Promise<PromiseTxReturnType<T, R>> {\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.deposit(\n params as GetSpokeDepositParamsType<SonicSpokeProvider>,\n spokeProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof EvmSpokeProvider) {\n return EvmSpokeService.deposit(\n params as GetSpokeDepositParamsType<EvmSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof CWSpokeProvider) {\n return CWSpokeService.deposit(\n params as GetSpokeDepositParamsType<CWSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n return IconSpokeService.deposit(\n params as GetSpokeDepositParamsType<IconSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n if (spokeProvider instanceof SuiSpokeProvider) {\n return SuiSpokeService.deposit(\n params as GetSpokeDepositParamsType<SuiSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n if (spokeProvider instanceof SolanaSpokeProvider) {\n return SolanaSpokeService.deposit(\n params as GetSpokeDepositParamsType<SolanaSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n return StellarSpokeService.deposit(\n params as GetSpokeDepositParamsType<StellarSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static getDeposit(token: Address, spokeProvider: SpokeProvider): Promise<bigint> {\n if (spokeProvider instanceof EvmSpokeProvider) {\n return EvmSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof CWSpokeProvider) {\n return CWSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n return StellarSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SuiSpokeProvider) {\n return SuiSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n return IconSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SolanaSpokeProvider) {\n return SolanaSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.getDeposit(token, spokeProvider);\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<Hash>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<T extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: T,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): Promise<TxReturnType<T, R>> {\n if (isSonicSpokeProvider(spokeProvider)) {\n return (await SonicSpokeService.callWallet(payload, spokeProvider, raw)) satisfies TxReturnType<\n SonicSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isEvmSpokeProvider(spokeProvider)) {\n return (await EvmSpokeService.callWallet(from, payload, spokeProvider, hubProvider)) satisfies TxReturnType<\n EvmSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isCWSpokeProvider(spokeProvider)) {\n return (await CWSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n CWSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isIconSpokeProvider(spokeProvider)) {\n return (await IconSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n IconSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isSuiSpokeProvider(spokeProvider)) {\n return (await SuiSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n SuiSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isSolanaSpokeProvider(spokeProvider)) {\n return (await SolanaSpokeService.callWallet(\n from,\n payload,\n spokeProvider,\n hubProvider,\n raw,\n )) satisfies TxReturnType<SolanaSpokeProvider, R> as TxReturnType<T, R>;\n }\n if (isStellarSpokeProvider(spokeProvider)) {\n return (await StellarSpokeService.callWallet(from, payload, spokeProvider, hubProvider)) satisfies TxReturnType<\n StellarSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n\n throw new Error('Invalid spoke provider');\n }\n}\n","import type { HttpUrl, Result } from '../../types.js';\nimport type { Hex } from '@sodax/types';\nimport invariant from 'tiny-invariant';\nimport { retry } from '../../utils/shared-utils.js';\nimport type { IntentSubmitError } from '../solver/SolverService.js';\nimport { DEFAULT_RELAY_TX_TIMEOUT, getIntentRelayChainId } from '../../constants.js';\nimport type { SpokeProvider } from '../../entities/Providers.js';\n\n/**\n * The action type for the intent relay service.\n * submit - submit a transaction to the intent relay service\n * get_transaction_packets - get transaction packets from the intent relay service\n * get_packet - get a packet from the intent relay service\n */\nexport type RelayAction = 'submit' | 'get_transaction_packets' | 'get_packet';\n\n/**\n * The status of the relay transaction.\n * pending - no signatures\n * validating - not enough signatures\n * executing - enough signatures,no confirmed txn-hash\n * executed - has confirmed transaction-hash\n */\nexport type RelayTxStatus = 'pending' | 'validating' | 'executing' | 'executed';\n\nexport type RelayErrorCode = 'UNKNOWN' | 'SUBMIT_TX_FAILED' | 'POST_EXECUTION_FAILED' | 'TIMEOUT';\n\nexport type RelayError = {\n code: RelayErrorCode;\n error: unknown;\n};\n\nexport type SubmitTxParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n};\n\nexport type GetTransactionPacketsParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n};\n\nexport type GetPacketParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n conn_sn: string; // The connection sequence number of the submitted transaction\n};\n\nexport type SubmitTxResponse = {\n success: boolean;\n message: string;\n};\n\nexport type PacketData = {\n src_chain_id: number;\n src_tx_hash: string;\n src_address: string;\n status: RelayTxStatus;\n dst_chain_id: number;\n conn_sn: number;\n dst_address: string;\n dst_tx_hash: string;\n signatures: string[];\n payload: string;\n};\n\nexport type GetTransactionPacketsResponse = {\n success: boolean;\n data: PacketData[];\n};\n\nexport type GetPacketResponse =\n | {\n success: true;\n data: PacketData;\n }\n | {\n success: false;\n message: string;\n };\n\nexport type GetRelayRequestParamType<T extends RelayAction> = T extends 'submit'\n ? SubmitTxParams\n : T extends 'get_transaction_packets'\n ? GetTransactionPacketsParams\n : T extends 'get_packet'\n ? GetPacketParams\n : never;\n\nexport type GetRelayResponse<T extends RelayAction> = T extends 'submit'\n ? SubmitTxResponse\n : T extends 'get_transaction_packets'\n ? GetTransactionPacketsResponse\n : T extends 'get_packet'\n ? GetPacketResponse\n : never;\n\nexport type IntentRelayRequestParams = SubmitTxParams | GetTransactionPacketsParams | GetPacketParams;\n\nexport type WaitUntilIntentExecutedPayload = {\n intentRelayChainId: string;\n spokeTxHash: string;\n timeout: number;\n apiUrl: HttpUrl;\n};\n\n/**\n * Represents the request payload for submitting a transaction to the intent relay service.\n * Contains the action type and parameters including chain ID and transaction hash.\n */\nexport type IntentRelayRequest<T extends RelayAction> = {\n action: T;\n params: GetRelayRequestParamType<T>;\n};\n\nasync function postRequest<T extends RelayAction>(\n payload: IntentRelayRequest<T>,\n apiUrl: string,\n): Promise<GetRelayResponse<T>> {\n const response = await retry(() =>\n fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n }),\n );\n\n return response.json();\n}\n\n/**\n * Submits a transaction to the intent relay service.\n * @param payload - The request payload containing the 'submit' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function submitTransaction(\n payload: IntentRelayRequest<'submit'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'submit'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n\n return postRequest(payload, apiUrl);\n}\n\n/**\n * Retrieves transaction packets from the intent relay service.\n * @param payload - The request payload containing the 'get_transaction_packets' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function getTransactionPackets(\n payload: IntentRelayRequest<'get_transaction_packets'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'get_transaction_packets'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n\n return postRequest(payload, apiUrl);\n}\n\n/**\n * Retrieves a packet from the intent relay service.\n * @param payload - The request payload containing the 'get_packet' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function getPacket(\n payload: IntentRelayRequest<'get_packet'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'get_packet'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n invariant(payload.params.conn_sn.length > 0, 'Invalid input parameters. conn_sn empty');\n\n return postRequest(payload, apiUrl);\n}\n\nexport async function waitUntilIntentExecuted(\n payload: WaitUntilIntentExecutedPayload,\n): Promise<Result<PacketData, IntentSubmitError<'TIMEOUT'>>> {\n try {\n const startTime = Date.now();\n\n while (Date.now() - startTime < payload.timeout) {\n try {\n const txPackets = await getTransactionPackets(\n {\n action: 'get_transaction_packets',\n params: {\n chain_id: payload.intentRelayChainId,\n tx_hash: payload.spokeTxHash,\n },\n },\n payload.apiUrl,\n );\n\n if (txPackets.success && txPackets.data.length > 0) {\n const packet = txPackets.data.find(\n packet => packet.src_tx_hash.toLowerCase() === payload.spokeTxHash.toLowerCase(),\n );\n\n if (txPackets.success && txPackets.data.length > 0 && packet && packet.status === 'executed') {\n return {\n ok: true,\n value: packet,\n };\n }\n }\n } catch (e) {\n console.error('Error getting transaction packets', e);\n }\n // wait one second before retrying\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n\n return {\n ok: false,\n error: {\n code: 'TIMEOUT',\n data: {\n payload: payload,\n error: {\n payload: payload,\n error: undefined,\n },\n },\n },\n };\n } catch (e) {\n return {\n ok: false,\n error: {\n code: 'TIMEOUT',\n data: {\n payload: payload,\n error: e,\n },\n },\n };\n }\n}\n\n/**\n * Submit the transaction to the Solver API and wait for it to be executed\n * @param spokeTxHash - The transaction hash to submit.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 20 seconds.\n * @returns The transaction hash.\n */\nexport async function relayTxAndWaitPacket<S extends SpokeProvider>(\n spokeTxHash: Hex,\n spokeProvider: S,\n relayerApiEndpoint: HttpUrl,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n): Promise<Result<PacketData, RelayError>> {\n try {\n const intentRelayChainId = getIntentRelayChainId(spokeProvider.chainConfig.chain.id).toString();\n\n const submitPayload: IntentRelayRequest<'submit'> = {\n action: 'submit',\n params: {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n },\n };\n\n const submitResult = await submitTransaction(submitPayload, relayerApiEndpoint);\n\n if (!submitResult.success) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n error: submitResult.message,\n },\n };\n }\n\n const packet = await waitUntilIntentExecuted({\n intentRelayChainId,\n spokeTxHash,\n timeout,\n apiUrl: relayerApiEndpoint,\n });\n\n if (!packet.ok) {\n return {\n ok: false,\n error: {\n code: 'TIMEOUT',\n error: packet.error,\n },\n };\n }\n\n return {\n ok: true,\n value: packet.value,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n error: error,\n },\n };\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n type Address,\n type GetLogsReturnType,\n encodeAbiParameters,\n encodeFunctionData,\n encodePacked,\n getAbiItem,\n keccak256,\n parseEventLogs,\n} from 'viem';\nimport {\n type EvmContractCall,\n type EvmHubProvider,\n FEE_PERCENTAGE_SCALE,\n type Hash,\n type Hex,\n IntentsAbi,\n type PartnerFee,\n type SolverConfig,\n calculatePercentageFeeAmount,\n encodeContractCalls,\n getHubAssetInfo,\n getIntentRelayChainId,\n isIntentRelayChainId,\n isPartnerFeeAmount,\n isPartnerFeePercentage,\n randomUint256,\n} from '../../index.js';\nimport {\n type CreateIntentParams,\n Erc20Service,\n type FeeData,\n type Intent,\n type IntentData,\n IntentDataType,\n} from '../index.js';\n\nexport const IntentCreatedEventAbi = getAbiItem({ abi: IntentsAbi, name: 'IntentCreated' });\nexport type IntentCreatedEventLog = GetLogsReturnType<typeof IntentCreatedEventAbi>[number];\n\nexport class EvmSolverService {\n private constructor() {}\n\n /**\n * Constructs the create intent data for EVM Hub chain\n * @param {CreateIntentParams} createIntentParams - The create intent parameters\n * @param {Address} creatorHubWalletAddress - The creator hub wallet address\n * @param {SolverConfig} solverConfig - The intent configuration\n * @param {PartnerFee} fee - The partner fee configuration\n * @returns {Promise<[Hex, Intent, bigint]>} The encoded contract call, intent and fee amount\n */\n public static constructCreateIntentData(\n createIntentParams: CreateIntentParams,\n creatorHubWalletAddress: Address,\n solverConfig: SolverConfig,\n fee: PartnerFee | undefined,\n ): [Hex, Intent, bigint] {\n const inputToken = getHubAssetInfo(createIntentParams.srcChain, createIntentParams.inputToken)?.asset;\n const outputToken = getHubAssetInfo(createIntentParams.dstChain, createIntentParams.outputToken)?.asset;\n\n invariant(\n inputToken,\n `hub asset not found for spoke chain token (intent.inputToken): ${createIntentParams.inputToken}`,\n );\n invariant(\n outputToken,\n `hub asset not found for spoke chain token (intent.outputToken): ${createIntentParams.outputToken}`,\n );\n\n const [feeData, feeAmount] = EvmSolverService.createIntentFeeData(fee, createIntentParams.inputAmount);\n\n const calls: EvmContractCall[] = [];\n const intentsContract = solverConfig.intentsContract;\n const intent = {\n ...createIntentParams,\n inputToken,\n outputToken,\n srcChain: getIntentRelayChainId(createIntentParams.srcChain),\n dstChain: getIntentRelayChainId(createIntentParams.dstChain),\n intentId: randomUint256(),\n creator: creatorHubWalletAddress,\n data: feeData,\n } satisfies Intent;\n\n // user has to send input amount + fee amount to the Hub intent contract\n const totalInputAmount = intent.inputAmount + feeAmount;\n calls.push(Erc20Service.encodeApprove(intent.inputToken, intentsContract, totalInputAmount));\n calls.push(EvmSolverService.encodeCreateIntent(intent, intentsContract));\n return [encodeContractCalls(calls), intent, feeAmount];\n }\n\n /**\n * Creates encoded fee data for an intent\n * @param fee The partner fee configuration\n * @param inputAmount The input amount to calculate percentage-based fee from\n * @returns A tuple containing [encoded fee data, fee amount]. Fee amount will be 0n if no fee.\n */\n public static createIntentFeeData(fee: PartnerFee | undefined, inputAmount: bigint): [Hex, bigint] {\n invariant(inputAmount > 0n, 'Input amount must be greater than 0');\n if (!fee) {\n return ['0x', 0n];\n }\n\n let feeAmount: bigint;\n if (isPartnerFeeAmount(fee)) {\n feeAmount = fee.amount;\n } else if (isPartnerFeePercentage(fee)) {\n invariant(\n fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,\n `Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`,\n );\n\n feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);\n } else {\n return ['0x', 0n];\n }\n\n // Create the fee data struct\n const feeData = {\n fee: feeAmount,\n receiver: fee.address,\n } satisfies FeeData;\n\n // Encode the fee data\n const encodedFeeData = encodeAbiParameters(\n [\n { name: 'fee', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n ],\n [feeData.fee, feeData.receiver],\n );\n\n // Create the intent data struct\n const intentData = {\n type: IntentDataType.FEE,\n data: encodedFeeData,\n } satisfies IntentData;\n\n // Encode the intent data\n return [encodePacked(['uint8', 'bytes'], [intentData.type, intentData.data]), feeAmount];\n }\n\n /**\n * Gets an intent from a transaction hash\n * @param {Hash} txHash - The transaction hash\n * @param {SolverConfig} solverConfig - The solver configuration\n * @param {EvmHubProvider} hubProvider - The EVM hub provider\n * @returns {Promise<Intent>} The intent\n */\n public static async getIntent(\n txHash: Hash,\n solverConfig: SolverConfig,\n hubProvider: EvmHubProvider,\n ): Promise<Intent> {\n const receipt = await hubProvider.publicClient.waitForTransactionReceipt({ hash: txHash });\n const logs: IntentCreatedEventLog[] = parseEventLogs({\n abi: IntentsAbi,\n eventName: 'IntentCreated',\n logs: receipt.logs,\n strict: true,\n });\n\n for (const log of logs) {\n if (log.address.toLowerCase() === solverConfig.intentsContract.toLowerCase()) {\n if (!log.args.intent) {\n continue;\n }\n\n if (!isIntentRelayChainId(log.args.intent.srcChain) || !isIntentRelayChainId(log.args.intent.dstChain)) {\n throw new Error(`Invalid intent relay chain id: ${log.args.intent.srcChain} or ${log.args.intent.dstChain}`);\n }\n\n return {\n intentId: log.args.intent.intentId,\n creator: log.args.intent.creator,\n inputToken: log.args.intent.inputToken,\n outputToken: log.args.intent.outputToken,\n inputAmount: log.args.intent.inputAmount,\n minOutputAmount: log.args.intent.minOutputAmount,\n deadline: log.args.intent.deadline,\n data: log.args.intent.data,\n allowPartialFill: log.args.intent.allowPartialFill,\n srcChain: log.args.intent.srcChain,\n dstChain: log.args.intent.dstChain,\n srcAddress: log.args.intent.srcAddress,\n dstAddress: log.args.intent.dstAddress,\n solver: log.args.intent.solver,\n } satisfies Intent;\n }\n }\n\n throw new Error(`No intent found for ${txHash}`);\n }\n\n /**\n * Gets the keccak256 hash of an intent. Hash serves as the intent id on Hub chain.\n * @param {Intent} intent - The intent\n * @returns {Hex} The keccak256 hash of the intent\n */\n public static getIntentHash(intent: Intent): Hex {\n return keccak256(encodeAbiParameters(getAbiItem({ abi: IntentsAbi, name: 'createIntent' }).inputs, [intent]));\n }\n\n /**\n * Encodes a createIntent transaction\n * @param {Intent} intent - The intent to create\n * @param {Address} intentsContract - The address of the intents contract\n * @returns {EvmContractCall} The encoded contract call\n */\n public static encodeCreateIntent(intent: Intent, intentsContract: Address): EvmContractCall {\n return {\n address: intentsContract,\n value: 0n,\n data: encodeFunctionData({\n abi: IntentsAbi,\n functionName: 'createIntent',\n args: [intent],\n }),\n };\n }\n\n /**\n * Encodes a cancelIntent transaction\n * @param {Intent} intent - The intent to cancel\n * @param {Address} intentsContract - The address of the intents contract\n * @returns {EvmContractCall} The encoded contract call\n */\n public static encodeCancelIntent(intent: Intent, intentsContract: Address): EvmContractCall {\n return {\n address: intentsContract,\n value: 0n,\n data: encodeFunctionData({\n abi: IntentsAbi,\n functionName: 'cancelIntent',\n args: [intent],\n }),\n };\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n getHubAssetInfo,\n IntentErrorCode,\n isValidOriginalAssetAddress,\n retry,\n type IntentErrorResponse,\n type IntentExecutionRequest,\n type IntentExecutionResponse,\n type IntentQuoteRequest,\n type IntentQuoteResponse,\n type IntentQuoteResponseRaw,\n type IntentStatusRequest,\n type IntentStatusResponse,\n type Result,\n type SolverConfig,\n} from '../../index.js';\n\nexport class SolverApiService {\n private constructor() {}\n\n /**\n * Request a quote from the solver API\n * @example\n * {\n * \"token_src\":\"0x13b70564b1ec12876b20fab5d1bb630311312f4f\", // Asset BSC\n * \"token_dst\":\"0xdcd9578b51ef55239b6e68629d822a8d97c95b86\", // Asset ETH Arbitrum\n * \"token_src_blockchain_id\":\"56\",\n * \"token_dst_blockchain_id\":\"42161\",\n * \"amount\":1000000000000000n,\n * \"quote_type\": \"exact_input\"\n * }\n */\n public static async getQuote(\n payload: IntentQuoteRequest,\n config: SolverConfig,\n ): Promise<Result<IntentQuoteResponse, IntentErrorResponse>> {\n invariant(payload.token_src.length > 0, 'Empty token_src');\n invariant(payload.token_src_blockchain_id.length > 0, 'Empty token_src_blockchain_id');\n invariant(payload.token_dst.length > 0, 'Empty token_dst');\n invariant(payload.token_dst_blockchain_id.length > 0, 'Empty token_dst_blockchain_id');\n invariant(payload.amount > 0n, 'amount must be greater than 0');\n invariant(\n isValidOriginalAssetAddress(payload.token_src_blockchain_id, payload.token_src),\n 'unsupported token_src for src chain',\n );\n invariant(\n isValidOriginalAssetAddress(payload.token_dst_blockchain_id, payload.token_dst),\n 'unsupported token_dst for dst chain',\n );\n\n const tokenSrc = getHubAssetInfo(payload.token_src_blockchain_id, payload.token_src)?.asset;\n const tokenDst = getHubAssetInfo(payload.token_dst_blockchain_id, payload.token_dst)?.asset;\n\n invariant(tokenSrc, 'hub asset not found for token_src');\n invariant(tokenDst, 'hub asset not found for token_dst');\n\n try {\n const response = await fetch(`${config.solverApiEndpoint}/quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token_src: tokenSrc,\n token_dst: tokenDst,\n amount: payload.amount.toString(),\n quote_type: payload.quote_type,\n }),\n });\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n const quoteResponse: IntentQuoteResponseRaw = await response.json();\n\n return {\n ok: true,\n value: {\n quoted_amount: BigInt(quoteResponse.quoted_amount),\n } satisfies IntentQuoteResponse,\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.getQuote] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: IntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n\n /**\n * Post execution of intent order to Solver API\n * @example\n * // request\n * {\n * \"intent_tx_hash\": \"0xba3dce19347264db32ced212ff1a2036f20d9d2c7493d06af15027970be061af\",\n * \"quote_uuid\": \"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\"\n * }\n *\n * // response\n * {\n * \"ok\": true,\n * \"value\": {\n * \"output\": {\n * \"answer\":\"OK\",\n * \"task_id\":\"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\"\n * }\n * }\n * }\n */\n public static async postExecution(\n intentExecutionRequest: IntentExecutionRequest,\n config: SolverConfig,\n ): Promise<Result<IntentExecutionResponse, IntentErrorResponse>> {\n try {\n const response = await retry(() =>\n fetch(`${config.solverApiEndpoint}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(intentExecutionRequest),\n }),\n );\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n return {\n ok: true,\n value: await response.json(),\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.postExecution] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: IntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n\n public static async getStatus(\n intentStatusRequest: IntentStatusRequest,\n config: SolverConfig,\n ): Promise<Result<IntentStatusResponse, IntentErrorResponse>> {\n invariant(intentStatusRequest.intent_tx_hash.length > 0, 'Empty intent_tx_hash');\n try {\n const response = await fetch(`${config.solverApiEndpoint}/status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(intentStatusRequest),\n });\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n return {\n ok: true,\n value: await response.json(),\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.getStatus] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: IntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n DEFAULT_RELAYER_API_ENDPOINT,\n DEFAULT_RELAY_TX_TIMEOUT,\n Erc20Service,\n type EvmHubProvider,\n EvmSpokeProvider,\n type IntentRelayRequest,\n type PacketData,\n type RelayErrorCode,\n SonicSpokeProvider,\n type SpokeProvider,\n SpokeService,\n type WaitUntilIntentExecutedPayload,\n WalletAbstractionService,\n calculateFeeAmount,\n encodeContractCalls,\n getIntentRelayChainId,\n getSolverConfig,\n isConfiguredSolverConfig,\n isValidIntentRelayChainId,\n isValidOriginalAssetAddress,\n isValidSpokeChainId,\n submitTransaction,\n waitUntilIntentExecuted,\n} from '../../index.js';\nimport type {\n EvmContractCall,\n FeeAmount,\n GetSpokeDepositParamsType,\n HttpUrl,\n IntentErrorResponse,\n IntentExecutionRequest,\n IntentExecutionResponse,\n IntentQuoteRequest,\n IntentQuoteResponse,\n IntentRelayChainId,\n IntentStatusRequest,\n IntentStatusResponse,\n PartnerFee,\n Result,\n SolverConfigParams,\n SolverServiceConfig,\n TxReturnType,\n} from '../../types.js';\nimport { EvmSolverService } from './EvmSolverService.js';\nimport { SolverApiService } from './SolverApiService.js';\nimport { SONIC_MAINNET_CHAIN_ID, type SpokeChainId, type Address, type Hex, type Hash } from '@sodax/types';\n\nexport type CreateIntentParams = {\n inputToken: string; // The address of the input token on spoke chain\n outputToken: string; // The address of the output token on spoke chain\n inputAmount: bigint; // The amount of input tokens\n minOutputAmount: bigint; // The minimum amount of output tokens to accept\n deadline: bigint; // Optional timestamp after which intent expires (0 = no deadline)\n allowPartialFill: boolean; // Whether the intent can be partially filled\n srcChain: SpokeChainId; // Chain ID where input tokens originate\n dstChain: SpokeChainId; // Chain ID where output tokens should be delivered\n srcAddress: Hex; // Source address in bytes (original address on spoke chain)\n dstAddress: Hex; // Destination address in bytes (original address on spoke chain)\n solver: Address; // Optional specific solver address (address(0) = any solver)\n data: Hex; // Additional arbitrary data\n};\n\nexport type Intent = {\n intentId: bigint; // Unique identifier for the intent\n creator: Address; // Address that created the intent (Wallet abstraction address on hub chain)\n inputToken: Address; // Token the user is providing (hub asset address on hub chain)\n outputToken: Address; // Token the user wants to receive (hub asset address on hub chain)\n inputAmount: bigint; // Amount of input tokens\n minOutputAmount: bigint; // Minimum amount of output tokens to accept\n deadline: bigint; // Optional timestamp after which intent expires (0 = no deadline)\n allowPartialFill: boolean; // Whether the intent can be partially filled\n srcChain: IntentRelayChainId; // Chain ID where input tokens originate\n dstChain: IntentRelayChainId; // Chain ID where output tokens should be delivered\n srcAddress: Hex; // Source address in bytes (original address on spoke chain)\n dstAddress: Hex; // Destination address in bytes (original address on spoke chain)\n solver: Address; // Optional specific solver address (address(0) = any solver)\n data: Hex; // Additional arbitrary data\n};\n\n// Data types for arbitrary data\nexport enum IntentDataType {\n FEE = 1,\n}\n\nexport type FeeData = {\n fee: bigint;\n receiver: Address;\n};\n\nexport type IntentData = {\n type: IntentDataType;\n data: Hex;\n};\n\nexport type IntentState = {\n exists: boolean;\n remainingInput: bigint;\n receivedOutput: bigint;\n pendingPayment: boolean;\n};\n\nexport type IntentCreationFailedErrorData = {\n payload: CreateIntentParams;\n error: unknown;\n};\n\nexport type IntentSubmitTxFailedErrorData = {\n payload: IntentRelayRequest<'submit'>;\n apiUrl: HttpUrl;\n};\n\nexport type IntentWaitUntilIntentExecutedFailedErrorData = {\n payload: WaitUntilIntentExecutedPayload;\n error: unknown;\n};\n\nexport type IntentSubmitErrorCode = RelayErrorCode | 'UNKNOWN' | 'CREATION_FAILED';\nexport type IntentSubmitErrorData<T extends IntentSubmitErrorCode> = T extends 'TIMEOUT'\n ? IntentWaitUntilIntentExecutedFailedErrorData\n : T extends 'CREATION_FAILED'\n ? IntentCreationFailedErrorData\n : T extends 'SUBMIT_TX_FAILED'\n ? IntentSubmitTxFailedErrorData\n : T extends 'POST_EXECUTION_FAILED'\n ? IntentErrorResponse\n : never;\n\nexport type IntentSubmitError<T extends IntentSubmitErrorCode> = {\n code: T;\n data: IntentSubmitErrorData<T>;\n};\n\nexport class SolverService {\n private readonly config: SolverServiceConfig;\n private readonly hubProvider: EvmHubProvider;\n\n public constructor(\n config: SolverConfigParams | undefined,\n hubProvider: EvmHubProvider,\n relayerApiEndpoint?: HttpUrl,\n ) {\n if (!config) {\n // default to mainnet config\n this.config = {\n ...getSolverConfig(SONIC_MAINNET_CHAIN_ID), // default to mainnet config\n partnerFee: undefined,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else if (isConfiguredSolverConfig(config)) {\n this.config = {\n ...config,\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else {\n this.config = {\n ...getSolverConfig(hubProvider.chainConfig.chain.id), // default to mainnet config\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n }\n this.hubProvider = hubProvider;\n }\n\n /**\n * Request a quote from the solver API\n * @param {IntentQuoteRequest} payload - The intent quote request\n * @returns {Promise<Result<IntentQuoteResponse, IntentErrorResponse>>} The intent quote response\n *\n * @example\n * const payload = {\n * \"token_src\":\"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"token_dst\":\"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"token_src_blockchain_id\":\"0x38.bsc\",\n * \"token_dst_blockchain_id\":\"0xa4b1.arbitrum\",\n * \"amount\":1000000000000000n,\n * \"quote_type\": \"exact_input\"\n * } satisfies IntentQuoteRequest\n *\n * const response = await solverService.getQuote(payload);\n *\n * if (response.ok) {\n * const quotedAmount = response.value.quoted_amount;\n * console.log('Quoted amount:', quotedAmount);\n * } else {\n * console.error('Quote failed:', response.error);\n * }\n */\n public async getQuote(payload: IntentQuoteRequest): Promise<Result<IntentQuoteResponse, IntentErrorResponse>> {\n return SolverApiService.getQuote(payload, this.config);\n }\n\n /**\n * Get the fee for a given input amount\n * @param {bigint} inputAmount - The amount of input tokens\n * @returns {Promise<bigint>} The fee amount (denominated in input tokens)\n *\n * @example\n * const fee: bigint = await solverService.getFee(1000000000000000n);\n * console.log('Fee:', fee);\n */\n public async getFee(inputAmount: bigint): Promise<bigint> {\n if (!this.config.partnerFee) {\n return 0n;\n }\n\n return calculateFeeAmount(inputAmount, this.config.partnerFee);\n }\n\n /**\n * Get the status of an intent from Solver API\n * @param {IntentStatusRequest} intentStatusRequest - The intent status request\n * @returns {Promise<Result<IntentStatusResponse, IntentErrorResponse>>} The intent status response\n *\n * @example\n * const intentStatusRequest = {\n * \"intentHash\": \"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\"\n * } satisfies IntentStatusRequest\n *\n * const response = await solverService.getStatus(intentStatusRequest);\n *\n * if (response.ok) {\n * const { status, intent_hash } = response.value;\n * console.log('Status:', status);\n * console.log('Intent hash:', intent_hash);\n * } else {\n * // handle error\n * }\n */\n public async getStatus(\n intentStatusRequest: IntentStatusRequest,\n ): Promise<Result<IntentStatusResponse, IntentErrorResponse>> {\n return SolverApiService.getStatus(intentStatusRequest, this.config);\n }\n\n /**\n * Post execution of intent order transaction executed on hub chain to Solver API\n * @param {IntentExecutionRequest} intentExecutionRequest - The intent execution request\n * @returns {Promise<Result<IntentExecutionResponse, IntentErrorResponse>>} The intent execution response\n *\n * @example\n * const intentExecutionRequest = {\n * \"intent_tx_hash\": \"0xba3dce19347264db32ced212ff1a2036f20d9d2c7493d06af15027970be061af\",\n * } satisfies IntentExecutionRequest\n *\n * const response = await solverService.postExecution(intentExecutionRequest);\n *\n * if (response.ok) {\n * const { answer, intent_hash } = response.value;\n * console.log('Answer:', answer);\n * console.log('Intent hash:', intent_hash);\n * } else {\n * // handle error\n * }\n */\n public async postExecution(\n intentExecutionRequest: IntentExecutionRequest,\n ): Promise<Result<IntentExecutionResponse, IntentErrorResponse>> {\n return SolverApiService.postExecution(intentExecutionRequest, this.config);\n }\n\n /**\n * Creates an intent and submits it to the Solver API and Relayer API\n * @param {CreateIntentParams} payload - The intent to create\n * @param {ISpokeProvider} spokeProvider - The spoke provider\n * @param {number} timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[IntentExecutionResponse, Intent, PacketData], IntentSubmitError<IntentSubmitErrorCode>>>} The intent execution response, intent, and packet data\n *\n * @example\n * const payload = {\n * \"inputToken\": \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"outputToken\": \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"inputAmount\": 1000000000000000n, // The amount of input tokens\n * \"minOutputAmount\": 900000000000000n, // min amount you are expecting to receive\n * \"deadline\": 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * \"allowPartialFill\": false, // Whether the intent can be partially filled\n * \"srcChain\": \"0x38.bsc\", // Chain ID where input tokens originate\n * \"dstChain\": \"0xa4b1.arbitrum\", // Chain ID where output tokens should be delivered\n * \"srcAddress\": \"0x..\", // Source address in bytes (original address on spoke chain)\n * \"dstAddress\": \"0x...\", // Destination address in bytes (original address on spoke chain)\n * \"solver\": \"0x..\", // Optional specific solver address (address(0) = any solver)\n * \"data\": \"0x..\", // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const createAndSubmitIntentResult = await solverService.createAndSubmitIntent(payload, spokeProvider);\n *\n * if (createAndSubmitIntentResult.ok) {\n * const [intentExecutionResponse, intent, packetData] = createAndSubmitIntentResult.value;\n * console.log('Intent execution response:', intentExecutionResponse);\n * console.log('Intent:', intent);\n * console.log('Packet data:', packetData);\n * } else {\n * // handle error\n * }\n */\n public async createAndSubmitIntent<S extends SpokeProvider>(\n payload: CreateIntentParams,\n spokeProvider: S,\n fee?: PartnerFee,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[IntentExecutionResponse, Intent, PacketData], IntentSubmitError<IntentSubmitErrorCode>>> {\n try {\n const createIntentResult = await this.createIntent(payload, spokeProvider, fee, false);\n\n if (!createIntentResult.ok) {\n return {\n ok: false,\n error: createIntentResult.error,\n };\n }\n\n const [spokeTxHash, intent] = createIntentResult.value;\n const intentRelayChainId = getIntentRelayChainId(payload.srcChain).toString();\n const submitPayload: IntentRelayRequest<'submit'> = {\n action: 'submit',\n params: {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n },\n };\n\n const submitResult = await submitTransaction(submitPayload, this.config.relayerApiEndpoint);\n\n if (!submitResult.success) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n data: {\n payload: submitPayload,\n apiUrl: this.config.relayerApiEndpoint,\n },\n },\n };\n }\n\n const packet = await waitUntilIntentExecuted({\n intentRelayChainId,\n spokeTxHash,\n timeout,\n apiUrl: this.config.relayerApiEndpoint,\n });\n\n if (!packet.ok) {\n return {\n ok: false,\n error: packet.error,\n };\n }\n\n const result = await this.postExecution({\n intent_tx_hash: packet.value.dst_tx_hash as `0x${string}`,\n });\n\n if (!result.ok) {\n return {\n ok: false,\n error: {\n code: 'POST_EXECUTION_FAILED',\n data: result.error,\n },\n };\n }\n\n return {\n ok: true,\n value: [result.value, intent, packet.value],\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n data: {\n payload: payload,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Check whether assetManager contract is allowed to move the given payload amount\n * @param {CreateIntentParams} params - The intent to create\n * @param {SpokeProvider} spokeProvider - The spoke provider\n * @return {Promise<Result<boolean>>} - valid = true, invalid = false\n *\n * @example\n * const payload = {\n * \"inputToken\": \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"outputToken\": \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"inputAmount\": 1000000000000000n, // The amount of input tokens\n * \"minOutputAmount\": 900000000000000n, // min amount you are expecting to receive\n * \"deadline\": 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * \"allowPartialFill\": false, // Whether the intent can be partially filled\n * \"srcChain\": \"0x38.bsc\", // Chain ID where input tokens originate\n * \"dstChain\": \"0xa4b1.arbitrum\", // Chain ID where output tokens should be delivered\n * \"srcAddress\": \"0x..\", // Source address in bytes (original address on spoke chain)\n * \"dstAddress\": \"0x...\", // Destination address in bytes (original address on spoke chain)\n * \"solver\": \"0x..\", // Optional specific solver address (address(0) = any solver)\n * \"data\": \"0x..\", // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const isAllowanceValid = await solverService.isAllowanceValid(payload, spokeProvider);\n *\n * if (!allowanceValid.ok) {\n * // Handle error\n * }\n *\n * if (!allowanceValid.value) {\n * // Need to approve\n * }\n */\n public async isAllowanceValid<S extends SpokeProvider>(\n params: CreateIntentParams,\n spokeProvider: S,\n ): Promise<Result<boolean>> {\n try {\n if (spokeProvider instanceof EvmSpokeProvider || spokeProvider instanceof SonicSpokeProvider) {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n return Erc20Service.isAllowanceValid(\n params.inputToken as Address,\n params.inputAmount,\n walletAddress,\n spokeProvider instanceof EvmSpokeProvider\n ? spokeProvider.chainConfig.addresses.assetManager\n : spokeProvider.chainConfig.addresses.walletRouter,\n spokeProvider,\n );\n }\n\n return {\n ok: true,\n value: true,\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Approve amount spending (currently required for EVM only)\n * @param token - ERC20 token address\n * @param amount - Amount to approve\n * @param spender - Spender address\n * @param spokeProvider - Spoke provider\n * @param raw - Whether to return the raw transaction hash instead of the transaction receipt\n * @returns {Promise<Result<TxReturnType<S, R>>>} - Returns the raw transaction payload or transaction hash\n *\n * @example\n * const approveResult = await approve(\n * '0x...', // ERC20 token address\n * 1000n, // Amount to approve (in token decimals)\n * '0x...', // Spender address (usually the asset manager contract: spokeProvider.chainConfig.addresses.assetManager)\n * spokeProvider,\n * true // if true, returns raw transaction hash instead of raw transaction\n * );\n *\n * if (!approveResult.ok) {\n * // Handle error\n * }\n *\n * const txReceipt = approveResult.value;\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>(\n token: Address,\n amount: bigint,\n address: Address,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>>> {\n try {\n if (spokeProvider instanceof EvmSpokeProvider || spokeProvider instanceof SonicSpokeProvider) {\n const result = await Erc20Service.approve(token, amount, address, spokeProvider, raw);\n\n return {\n ok: true,\n value: result satisfies TxReturnType<EvmSpokeProvider | SonicSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n return {\n ok: false,\n error: new Error('Approve only supported for EVM spoke chains'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Creates an intent by handling token approval and intent creation\n * NOTE: This method does not submit the intent to the Solver API\n * @param {CreateIntentParams} params - The intent to create\n * @param {SpokeProvider} spokeProvider - The spoke provider\n * @param {boolean} raw - Whether to return the raw transaction\n * @param {PartnerFee} fee - The fee to apply to the intent\n * @returns {Promise<Result<[TxReturnType<S, R>, Intent & FeeAmount], IntentSubmitError<'CREATION_FAILED'>>>} The encoded contract call\n *\n * @example\n * const payload = {\n * \"inputToken\": \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"outputToken\": \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"inputAmount\": 1000000000000000n, // The amount of input tokens\n * \"minOutputAmount\": 900000000000000n, // min amount you are expecting to receive\n * \"deadline\": 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * \"allowPartialFill\": false, // Whether the intent can be partially filled\n * \"srcChain\": \"0x38.bsc\", // Chain ID where input tokens originate\n * \"dstChain\": \"0xa4b1.arbitrum\", // Chain ID where output tokens should be delivered\n * \"srcAddress\": \"0x..\", // Source address in bytes (original address on spoke chain)\n * \"dstAddress\": \"0x...\", // Destination address in bytes (original address on spoke chain)\n * \"solver\": \"0x..\", // Optional specific solver address (address(0) = any solver)\n * \"data\": \"0x..\", // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const createIntentResult = await solverService.createIntent(payload, spokeProvider);\n *\n * if (createIntentResult.ok) {\n * const [txResult, intent] = createIntentResult.value;\n * console.log('Intent:', intent);\n *\n */\n public async createIntent<S extends SpokeProvider, R extends boolean = false>(\n params: CreateIntentParams,\n spokeProvider: S,\n fee?: PartnerFee,\n raw?: R,\n ): Promise<Result<[TxReturnType<S, R>, Intent & FeeAmount], IntentSubmitError<'CREATION_FAILED'>>> {\n invariant(\n isValidOriginalAssetAddress(params.srcChain, params.inputToken),\n `Unsupported spoke chain token (params.srcChain): ${params.srcChain}, params.inputToken): ${params.inputToken}`,\n );\n invariant(\n isValidOriginalAssetAddress(params.dstChain, params.outputToken),\n `Unsupported spoke chain token (params.dstChain): ${params.dstChain}, params.outputToken): ${params.outputToken}`,\n );\n invariant(isValidSpokeChainId(params.srcChain), `Invalid spoke chain (params.srcChain): ${params.srcChain}`);\n invariant(isValidSpokeChainId(params.dstChain), `Invalid spoke chain (params.dstChain): ${params.dstChain}`);\n\n try {\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n // derive users hub wallet address\n const creatorHubWalletAddress =\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id // on hub chain, use real user wallet address\n ? walletAddressBytes\n : await WalletAbstractionService.getUserHubWalletAddress(\n params.srcChain,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n\n // construct the intent data\n const [data, intent, feeAmount] = EvmSolverService.constructCreateIntentData(\n params,\n creatorHubWalletAddress,\n this.config,\n fee,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: creatorHubWalletAddress,\n token: params.inputToken,\n amount: params.inputAmount + feeAmount,\n data: data,\n } as GetSpokeDepositParamsType<S>,\n spokeProvider satisfies S,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: [txResult as TxReturnType<S, R>, { ...intent, feeAmount }] as [TxReturnType<S, R>, Intent & FeeAmount],\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Cancels an intent\n * @param {Intent} intent - The intent to cancel\n * @param {ISpokeProvider} spokeProvider - The spoke provider\n * @param {boolean} raw - Whether to return the raw transaction\n * @returns {Promise<TxReturnType<T, R>>} The encoded contract call\n */\n public async cancelIntent<T extends SpokeProvider, R extends boolean = false>(\n intent: Intent,\n spokeProvider: T,\n raw?: R,\n ): Promise<TxReturnType<T, R>> {\n invariant(isValidIntentRelayChainId(intent.srcChain), `Invalid intent.srcChain: ${intent.srcChain}`);\n invariant(isValidIntentRelayChainId(intent.dstChain), `Invalid intent.dstChain: ${intent.dstChain}`);\n\n const walletAddressBytes = await spokeProvider.walletProvider.getWalletAddressBytes();\n // derive users hub wallet address\n const creatorHubWalletAddress =\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id // on hub chain, use real user wallet address\n ? walletAddressBytes\n : await WalletAbstractionService.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n walletAddressBytes,\n this.hubProvider,\n spokeProvider,\n );\n\n const calls: EvmContractCall[] = [];\n const intentsContract = this.config.intentsContract;\n calls.push(EvmSolverService.encodeCancelIntent(intent, intentsContract));\n const data = encodeContractCalls(calls);\n return SpokeService.callWallet(creatorHubWalletAddress, data, spokeProvider, this.hubProvider, raw);\n }\n\n /**\n * Gets an intent from a transaction hash (on Hub chain)\n * @param {Hash} txHash - The transaction hash on Hub chain\n * @returns {Promise<Intent>} The intent\n */\n public getIntent(txHash: Hash): Promise<Intent> {\n return EvmSolverService.getIntent(txHash, this.config, this.hubProvider);\n }\n\n /**\n * Gets the keccak256 hash of an intent. Hash serves as the intent id on Hub chain.\n * @param {Intent} intent - The intent\n * @returns {Hex} The keccak256 hash of the intent\n */\n public getIntentHash(intent: Intent): Hex {\n return EvmSolverService.getIntentHash(intent);\n }\n}\n","import { DEFAULT_RELAYER_API_ENDPOINT } from '../constants.js';\nimport { MoneyMarketService, SolverService } from '../services/index.js';\nimport type { HttpUrl, SolverConfigParams, MoneyMarketConfigParams } from '../types.js';\nimport { EvmHubProvider, type EvmHubProviderConfig } from './Providers.js';\n\nexport type SodaxConfig = {\n solver?: SolverConfigParams; // optional Solver service enabling intent based swaps\n moneyMarket?: MoneyMarketConfigParams; // optional Money Market service enabling cross-chain lending and borrowing\n hubProviderConfig?: EvmHubProviderConfig; // hub provider for the hub chain (e.g. Sonic mainnet)\n relayerApiEndpoint?: HttpUrl; // relayer API endpoint used to relay intents/user actions to the hub and vice versa\n};\n\n/**\n * Sodax class is used to interact with the Sodax.\n *\n * @see https://docs.sodax.com\n */\nexport class Sodax {\n public readonly config?: SodaxConfig;\n\n public readonly solver: SolverService; // Solver service enabling intent based swaps\n public readonly moneyMarket: MoneyMarketService; // Money Market service enabling cross-chain lending and borrowing\n private readonly hubProvider: EvmHubProvider; // hub provider for the hub chain (e.g. Sonic mainnet)\n private readonly relayerApiEndpoint: HttpUrl; // relayer API endpoint used to relay intents/user actions to the hub and vice versa\n\n constructor(config?: SodaxConfig) {\n this.config = config;\n this.relayerApiEndpoint = config?.relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT;\n this.hubProvider = new EvmHubProvider(config?.hubProviderConfig); // default to Sonic mainnet\n\n this.solver =\n config && config.solver\n ? new SolverService(config.solver, this.hubProvider, this.relayerApiEndpoint)\n : new SolverService(undefined, this.hubProvider, this.relayerApiEndpoint); // default to mainnet config\n\n this.moneyMarket =\n config && config.moneyMarket\n ? new MoneyMarketService(config.moneyMarket, this.hubProvider, this.relayerApiEndpoint)\n : new MoneyMarketService(undefined, this.hubProvider, this.relayerApiEndpoint); // default to mainnet config\n }\n}\n","import type { PublicKey } from '@solana/web3.js';\nimport type { TransactionReceipt } from 'viem';\nimport type { CWSpokeProvider } from './entities/cosmos/CWSpokeProvider.js';\nimport type {\n EvmSpokeProvider,\n ISpokeProvider,\n IconSpokeProvider,\n SolanaSpokeProvider,\n SonicSpokeProvider,\n SpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n} from './entities/index.js';\nimport type { EVM_CHAIN_IDS, EVM_SPOKE_CHAIN_IDS, INTENT_RELAY_CHAIN_IDS, spokeChainConfig } from './index.js';\nimport type { EvmSpokeDepositParams, SonicSpokeDepositParams } from './services/index.js';\nimport type { CWSpokeDepositParams } from './services/spoke/CWSpokeService.js';\nimport type { IconSpokeDepositParams } from './services/spoke/IconSpokeService.js';\nimport type { SolanaSpokeDepositParams } from './services/spoke/SolanaSpokeService.js';\nimport type { StellarSpokeDepositParams } from './services/spoke/StellarSpokeService.js';\nimport type { SuiSpokeDepositParams } from './services/spoke/SuiSpokeService.js';\nimport type {\n ChainType,\n Token,\n HubChainId,\n SpokeChainId,\n Hex,\n Address,\n EvmRawTransaction,\n StellarRawTransaction,\n CWRawTransaction,\n CosmosNetworkEnv,\n} from '@sodax/types';\n\nexport type IntentRelayChainId = (typeof INTENT_RELAY_CHAIN_IDS)[keyof typeof INTENT_RELAY_CHAIN_IDS];\n\nexport type EvmChainId = (typeof EVM_CHAIN_IDS)[number];\nexport type EvmSpokeChainId = (typeof EVM_SPOKE_CHAIN_IDS)[number];\n\nexport type BaseSpokeChainInfo<T extends ChainType> = {\n name: string;\n id: GetSpokeChainIdType<T>;\n type: T;\n};\n\nexport type SpokeChainInfo<T extends ChainType> = BaseSpokeChainInfo<T>;\n\nexport type HubChainInfo<T extends ChainType> = {\n name: string;\n id: HubChainId;\n type: T;\n};\n\nexport type GetSpokeChainIdType<T extends ChainType> = T extends 'EVM' ? EvmSpokeChainId : SpokeChainId;\n\nexport type AssetInfo = {\n chainId: bigint;\n spokeAddress: `0x${string}`;\n};\n\nexport type HubAssetInfo = { asset: Address; decimal: number; vault: Address };\n\nexport type BaseSpokeChainConfig<T extends ChainType> = {\n chain: SpokeChainInfo<T>;\n addresses: { [key: string]: Address | string | Uint8Array };\n supportedTokens: Record<string, Token>;\n nativeToken: Address | string;\n bnUSD: Address | string;\n};\n\nexport type BaseHubChainConfig<T extends ChainType> = {\n chain: HubChainInfo<T>;\n addresses: { [key: string]: Address | string | Uint8Array };\n supportedTokens: Token[];\n nativeToken: Address | string;\n};\n\nexport type EvmHubChainConfig = BaseHubChainConfig<'EVM'> & {\n addresses: {\n assetManager: Address;\n hubWallet: Address;\n xTokenManager: Address;\n };\n\n nativeToken: Address;\n};\n\nexport type RelayerApiConfig = {\n relayerApiEndpoint: HttpUrl;\n};\n\nexport type MoneyMarketConfig = {\n uiPoolDataProvider: Address;\n lendingPool: Address;\n poolAddressesProvider: Address;\n bnUSD: Address;\n bnUSDVault: Address;\n};\n\nexport type MoneyMarketServiceConfig = Prettify<MoneyMarketConfig & PartnerFeeConfig & RelayerApiConfig>;\nexport type SolverServiceConfig = Prettify<SolverConfig & PartnerFeeConfig & RelayerApiConfig>;\n\nexport type MoneyMarketConfigParams =\n | Prettify<MoneyMarketConfig & Optional<PartnerFeeConfig, 'partnerFee'>>\n | Optional<PartnerFeeConfig, 'partnerFee'>;\n\nexport type Default = {\n default: boolean;\n};\n\nexport type EvmSpokeChainConfig = BaseSpokeChainConfig<'EVM'> & {\n addresses: {\n assetManager: Address;\n connection: Address;\n };\n nativeToken: Address | string;\n};\n\nexport type SonicSpokeChainConfig = BaseSpokeChainConfig<'EVM'> & {\n addresses: {\n walletRouter: Address;\n wrappedSonic: Address;\n };\n nativeToken: Address;\n};\n\nexport type SuiSpokeChainConfig = BaseSpokeChainConfig<'SUI'> & {\n addresses: {\n assetManager: string;\n connection: string;\n xTokenManager: string;\n rateLimit: string;\n testToken: string;\n };\n rpc_url: string;\n};\n\nexport type CosmosSpokeChainConfig = BaseSpokeChainConfig<'INJECTIVE'> & {\n rpcUrl: string;\n walletAddress: string;\n addresses: {\n assetManager: string;\n connection: string;\n xTokenManager: string;\n rateLimit: string;\n testToken: string;\n };\n nativeToken: string;\n prefix: string;\n gasPrice: string;\n isBrowser: boolean;\n networkId: string;\n network: CosmosNetworkEnv;\n};\n\nexport type StellarSpokeChainConfig = BaseSpokeChainConfig<'STELLAR'> & {\n addresses: {\n assetManager: string;\n connection: string;\n xTokenManager: string;\n rateLimit: string;\n testToken: string;\n };\n rpc_url: string;\n};\n\nexport type IconSpokeChainConfig = BaseSpokeChainConfig<'ICON'> & {\n addresses: {\n assetManager: IconAddress;\n connection: IconAddress;\n rateLimit: IconAddress;\n };\n nid: Hex;\n};\n\nexport type SolanaChainConfig = BaseSpokeChainConfig<'SOLANA'> & {\n addresses: {\n assetManager: string;\n connection: string;\n xTokenManager: string;\n rateLimit: string;\n testToken: string;\n };\n chain: SpokeChainInfo<'SOLANA'>;\n rpcUrl: string;\n wsUrl: string;\n walletAddress: string;\n nativeToken: string;\n gasPrice: string;\n};\n\nexport type HubChainConfig = EvmHubChainConfig;\n\nexport type SpokeChainConfig =\n | EvmSpokeChainConfig\n | SonicSpokeChainConfig\n | CosmosSpokeChainConfig\n | IconSpokeChainConfig\n | SuiSpokeChainConfig\n | StellarSpokeChainConfig\n | SolanaChainConfig;\n\nexport type EvmContractCall = {\n address: Address; // Target address of the call\n value: bigint; // Ether value to send (in wei as a string for precision)\n data: Hex; // Calldata for the call\n};\n\nexport type EvmTransferToHubParams = {\n token: Address;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport type EvmTransferParams = {\n fromToken: Address;\n dstChainId: SpokeChainId;\n toToken: Hex;\n to: Hex;\n amount: bigint;\n data: Hex;\n};\n\nexport type TokenInfo = {\n decimals: number;\n depositFee: bigint;\n withdrawalFee: bigint;\n maxDeposit: bigint;\n isSupported: boolean;\n};\n\nexport type VaultReserves = {\n tokens: readonly Address[];\n balances: readonly bigint[];\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property amount - Optional fixed fee amount in wei.\n */\nexport type PartnerFeeAmount = {\n address: Address;\n amount: bigint;\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property percentage - Optional fee percentage in basis points (e.g., 100 = 1%). Maximum allowed is 100 (1%).\n */\nexport type PartnerFeePercentage = {\n address: Address;\n percentage: number;\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property percentage - Optional fee percentage in basis points (e.g., 100 = 1%). Maximum allowed is 100 (1%).\n * @property amount - Optional fixed fee amount in wei. If both percentage and amount are provided, amount will be used.\n */\nexport type PartnerFee = PartnerFeeAmount | PartnerFeePercentage;\n\nexport type PartnerFeeConfig = {\n partnerFee: PartnerFee | undefined;\n};\n\nexport type FeeAmount = {\n feeAmount: bigint;\n};\n\nexport type EvmTxReturnType<T extends boolean> = T extends true ? TransactionReceipt : Hex;\n\nexport type IconAddress = `hx${string}` | `cx${string}`;\nexport type Result<T, E = Error | unknown> = { ok: true; value: T } | { ok: false; error: E };\nexport type HttpPrefixedUrl = `http${string}`;\n\nexport type SpokeDepositParams = EvmSpokeDepositParams | CWSpokeDepositParams | IconSpokeDepositParams;\n\nexport type GetSpokeDepositParamsType<T extends SpokeProvider> = T extends EvmSpokeProvider\n ? EvmSpokeDepositParams\n : T extends CWSpokeProvider\n ? CWSpokeDepositParams\n : T extends SuiSpokeProvider\n ? SuiSpokeDepositParams\n : T extends IconSpokeProvider\n ? IconSpokeDepositParams\n : T extends StellarSpokeProvider\n ? StellarSpokeDepositParams\n : T extends SolanaSpokeProvider\n ? SolanaSpokeDepositParams\n : T extends SonicSpokeProvider\n ? SonicSpokeDepositParams\n : never;\n\nexport type GetAddressType<T extends SpokeProvider> = T extends EvmSpokeProvider\n ? Address\n : T extends CWSpokeProvider\n ? string\n : T extends StellarSpokeProvider\n ? Hex\n : T extends IconSpokeProvider\n ? IconAddress\n : T extends SuiSpokeProvider\n ? Hex\n : T extends SolanaSpokeProvider\n ? Hex\n : T extends SonicSpokeProvider\n ? Address\n : never;\n\nexport type HttpUrl = `http://${string}` | `https://${string}`;\n\nexport type SolverConfig = {\n intentsContract: Address; // Intents Contract (Hub)\n solverApiEndpoint: HttpUrl;\n};\n\nexport type SolverConfigParams =\n | Prettify<SolverConfig & Optional<PartnerFeeConfig, 'partnerFee'>>\n | Optional<PartnerFeeConfig, 'partnerFee'>;\n\nexport type QuoteType = 'exact_input' | 'exact_output';\n\nexport type IntentQuoteRequest = {\n token_src: string; // Token address on the source chain\n token_src_blockchain_id: SpokeChainId; // Source chain id\n token_dst: string; // Token address on the destination chain\n token_dst_blockchain_id: SpokeChainId; // Destination chain id\n amount: bigint; // Amount to swap\n quote_type: QuoteType; // Quote type\n};\n\nexport type IntentQuoteResponseRaw = {\n quoted_amount: string;\n};\n\nexport type IntentQuoteResponse = {\n quoted_amount: bigint;\n};\n\nexport type IntentErrorResponse = {\n detail: {\n code: IntentErrorCode;\n message: string;\n };\n};\n\nexport type IntentExecutionRequest = {\n intent_tx_hash: Hex; // Intent hash of the execution on Sonic (hub chain)\n};\n\nexport type IntentExecutionResponse = {\n answer: 'OK';\n intent_hash: Hex; // Here, the solver returns the intent_hash, might be helpful for front-end\n};\n\nexport type IntentStatusRequest = {\n intent_tx_hash: Hex;\n};\n\nexport type IntentStatusResponse = {\n status: IntentStatusCode;\n fill_tx_hash?: string; // defined only if status is 3\n};\n\nexport enum IntentStatusCode {\n NOT_FOUND = -1,\n NOT_STARTED_YET = 1, // It's in the task pool, but not started yet\n STARTED_NOT_FINISHED = 2,\n SOLVED = 3,\n FAILED = 4,\n}\n\nexport enum IntentErrorCode {\n NO_PATH_FOUND = -4, // No path to swap Token X to Token Y\n NO_PRIVATE_LIQUIDITY = -5, // Path found, but we have no private liquidity on the dest chain\n NOT_ENOUGH_PRIVATE_LIQUIDITY = -8, // Path found, but not enough private liquidity on the dst chain\n NO_EXECUTION_MODULE_FOUND = -7, // Path found, private liquidity, but execution modules unavailable\n QUOTE_NOT_FOUND = -8, // When executing, given quote_uuid does not exist\n QUOTE_NOT_MATCH = -9, // When executing, given quote_uuid does not match the quote\n INTENT_DATA_NOT_MATCH_QUOTE = -10,\n NO_GAS_HANDLER_FOR_BLOCKCHAIN = -11,\n INTENT_NOT_FOUND = -12,\n QUOTE_EXPIRED = -13,\n MAX_INPUT_AMOUNT = -14,\n MAX_DIFF_OUTPUT = -15,\n STOPPED = -16,\n NO_ORACLE_MODULE_FOUND = -17,\n NEGATIVE_INPUT_AMOUNT = -18,\n INTENT_ALREADY_IN_ORDERBOOK = -19,\n CREATE_INTENT_ORDER_FAILED = -998,\n UNKNOWN = -999,\n}\n\ntype Base64String = string;\n\nexport type SolanaRawTransaction = {\n from: PublicKey;\n to: PublicKey;\n value: bigint;\n data: Base64String;\n};\n\nexport type IconRawTransaction = {\n [key: string]: string | object;\n};\n\nexport type IcxRawTransaction = {\n to: string;\n from: string;\n value: Hex;\n stepLimit: Hex;\n nid: Hex;\n nonce: Hex;\n version: Hex;\n timestamp: Hex;\n data: Hex;\n};\n\nexport type SuiRawTransaction = {\n from: Hex;\n to: string;\n value: bigint;\n data: Base64String;\n};\n\nexport type EvmReturnType<Raw extends boolean> = Raw extends true ? EvmRawTransaction : Hex;\nexport type SolanaReturnType<Raw extends boolean> = Raw extends true ? SolanaRawTransaction : Hex;\nexport type StellarReturnType<Raw extends boolean> = Raw extends true ? StellarRawTransaction : Hex;\nexport type IconReturnType<Raw extends boolean> = Raw extends true ? IconRawTransaction : Hex;\nexport type SuiReturnType<Raw extends boolean> = Raw extends true ? SuiRawTransaction : Hex;\nexport type CWReturnType<Raw extends boolean> = Raw extends true ? CWRawTransaction : Hex;\nexport type TxReturnType<T extends SpokeProvider, Raw extends boolean> = T['chainConfig']['chain']['type'] extends 'EVM'\n ? EvmReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SOLANA'\n ? SolanaReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'STELLAR'\n ? StellarReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'ICON'\n ? IconReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SUI'\n ? SuiReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'INJECTIVE'\n ? CWReturnType<Raw>\n : never; // TODO extend for each chain implementation\nexport type PromiseEvmTxReturnType<Raw extends boolean> = Promise<TxReturnType<EvmSpokeProvider, Raw>>;\nexport type PromiseSolanaTxReturnType<Raw extends boolean> = Promise<TxReturnType<SolanaSpokeProvider, Raw>>;\nexport type PromiseStellarTxReturnType<Raw extends boolean> = Promise<TxReturnType<StellarSpokeProvider, Raw>>;\nexport type PromiseIconTxReturnType<Raw extends boolean> = Promise<TxReturnType<IconSpokeProvider, Raw>>;\nexport type PromiseSuiTxReturnType<Raw extends boolean> = Promise<TxReturnType<SuiSpokeProvider, Raw>>;\nexport type PromiseCWTxReturnType<Raw extends boolean> = Promise<TxReturnType<CWSpokeProvider, Raw>>;\n\nexport type RawTxReturnType =\n | EvmRawTransaction\n | SolanaRawTransaction\n | CWRawTransaction\n | IconRawTransaction\n | SuiRawTransaction; // TODO extend for other chains (Icon, Cosmos, Sui)\nexport type GetRawTxReturnType<T extends ChainType> = T extends 'EVM' ? PromiseEvmTxReturnType<boolean> : never;\n\nexport type PromiseTxReturnType<\n T extends ISpokeProvider,\n Raw extends boolean,\n> = T['chainConfig']['chain']['type'] extends 'EVM'\n ? PromiseEvmTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SOLANA'\n ? PromiseSolanaTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'STELLAR'\n ? PromiseStellarTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'ICON'\n ? PromiseIconTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SUI'\n ? PromiseSuiTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'INJECTIVE'\n ? PromiseCWTxReturnType<Raw>\n : never;\n\nexport type VaultType = {\n address: Address; // vault address\n reserves: Address[]; // hub asset addresses contained in the vault\n};\n\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype ExtractKeys<T> = T extends unknown ? keyof T : never;\n\nexport type SpokeTokenSymbols = ExtractKeys<(typeof spokeChainConfig)[SpokeChainId]['supportedTokens']>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/abis/asset-manager.abi.ts","../src/shared/abis/balnSwap.abi.ts","../src/shared/abis/connection.abi.ts","../src/shared/abis/erc20.abi.ts","../src/shared/abis/pool.abi.ts","../src/shared/abis/spokeAssetManager.abi.ts","../src/shared/abis/uiPoolData.abi.ts","../src/shared/abis/vaultToken.abi.ts","../src/shared/abis/walletFactory.abi.ts","../src/shared/abis/intents.abi.ts","../src/shared/abis/sonicWalletFactory.abi.ts","../src/shared/abis/wrappedSonic.abi.ts","../src/shared/abis/variableDebtToken.abi.ts","../src/shared/abis/stakedSoda.abi.ts","../src/shared/abis/stakingRouter.abi.ts","../src/shared/constants.ts","../src/shared/config/ConfigService.ts","../src/shared/config/ConfigMapper.ts","../src/shared/utils/evm-utils.ts","../src/shared/entities/icon/IconSpokeProvider.ts","../src/shared/entities/icon/utils.ts","../src/shared/entities/icon/HanaWalletConnector.ts","../src/shared/entities/injective/InjectiveSpokeProvider.ts","../src/shared/entities/injective/Injective20Token.ts","../src/shared/entities/solana/SolanaSpokeProvider.ts","../src/shared/entities/solana/utils/utils.ts","../src/shared/entities/stellar/CustomSorobanServer.ts","../src/shared/entities/stellar/StellarSpokeProvider.ts","../src/shared/services/hub/EvmVaultTokenService.ts","../src/shared/services/erc-20/Erc20Service.ts","../src/shared/services/hub/EvmAssetManagerService.ts","../src/shared/services/hub/EvmWalletAbstraction.ts","../src/shared/services/spoke/SuiSpokeService.ts","../src/shared/entities/sui/SuiSpokeProvider.ts","../src/moneyMarket/math-utils/bignumber.ts","../src/moneyMarket/math-utils/constants.ts","../src/moneyMarket/math-utils/ray.math.ts","../src/moneyMarket/math-utils/pool-math.ts","../src/moneyMarket/math-utils/formatters/compounded-interest/calculate-compounded-interest.ts","../src/moneyMarket/math-utils/formatters/emode/index.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-accrued-incentives.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-user-reserve-incentives.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-all-user-incentives.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-incentive-apr.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-reserve-incentives.ts","../src/moneyMarket/math-utils/formatters/incentive/calculate-all-reserve-incentives.ts","../src/moneyMarket/math-utils/formatters/usd/native-to-usd.ts","../src/moneyMarket/math-utils/formatters/usd/normalized-to-usd.ts","../src/moneyMarket/math-utils/formatters/reserve/calculate-reserve-debt.ts","../src/moneyMarket/math-utils/formatters/reserve/index.ts","../src/moneyMarket/math-utils/formatters/user/format-user-reserve.ts","../src/moneyMarket/math-utils/formatters/user/calculate-user-reserve-totals.ts","../src/moneyMarket/math-utils/formatters/user/generate-raw-user-summary.ts","../src/moneyMarket/math-utils/formatters/user/generate-user-reserve-summary.ts","../src/moneyMarket/math-utils/formatters/user/index.ts","../src/moneyMarket/UiPoolDataProviderService.ts","../src/moneyMarket/LendingPoolService.ts","../src/moneyMarket/MoneyMarketDataService.ts","../src/shared/services/spoke/StellarSpokeService.ts","../src/swap/EvmSolverService.ts","../src/swap/SolverApiService.ts","../src/shared/entities/Providers.ts","../src/swap/SwapService.ts","../src/shared/services/spoke/SonicSpokeService.ts","../src/moneyMarket/MoneyMarketService.ts","../src/shared/entities/Sodax.ts","../src/shared/services/hub/WalletAbstractionService.ts","../src/shared/utils/shared-utils.ts","../src/shared/services/spoke/EvmSpokeService.ts","../src/shared/services/spoke/InjectiveSpokeService.ts","../src/shared/utils/icon-utils.ts","../src/shared/services/spoke/IconSpokeService.ts","../src/shared/entities/solana/Configs.ts","../src/shared/entities/solana/pda/pda.ts","../src/shared/services/spoke/SolanaSpokeService.ts","../src/shared/guards.ts","../src/shared/services/spoke/SpokeService.ts","../src/shared/services/intentRelay/IntentRelayApiService.ts","../src/shared/types.ts","../src/backendApi/BackendApiService.ts","../src/bridge/BridgeService.ts","../src/staking/StakingLogic.ts","../src/staking/StakingService.ts","../src/shared/abis/icxSwap.abi.ts","../src/migration/IcxMigrationService.ts","../src/migration/MigrationService.ts","../src/migration/BnUSDMigrationService.ts","../src/migration/BalnSwapService.ts"],"names":["spokeChainConfig","getNetworkEndpoints","Network","ChainGrpcWasmApi","toBase64","StellarRpc","SorobanRpc","erc20Abi","encodeFunctionData","toHex","getIntentRelayChainId","fromHex","Transaction","isNative","coin","base","BigNumber","reserve","userReserve","reserveIncentive","getMoneyMarketConfig","STELLAR_MAINNET_CHAIN_ID","balance","TransactionBuilder","BASE_FEE","Operation","SONIC_MAINNET_CHAIN_ID","invariant","encodeAbiParameters","IntentDataType","SOLANA_MAINNET_CHAIN_ID","bcs","PublicKey","StellarAddress","IconSdk","IconSdkRaw2","IconSdkRaw","Connection","keccak256","rlp2","packet","SolverIntentStatusCode","SolverIntentErrorCode","isAddress","fromTokenIndex","fromTokenDepositedAmount","availableDeposit","tokenIndex","assetManagerBalance","ICON_MAINNET_CHAIN_ID","LockupPeriod","LockupMultiplier"],"mappings":"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","file":"index.mjs","sourcesContent":["export const assetManagerAbi = [\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assetImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assetInfo',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'spokeAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'assets',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'configureAssetManager',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'connection',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IConnection',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deployAsset',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: '_connection',\n type: 'address',\n internalType: 'contract IConnection',\n },\n {\n name: '_walletFactory',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n {\n name: '_assetImplementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'overrideToken',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'asset',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'receiveMessage',\n inputs: [\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signatures',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signedMessages',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'spokeAssetManager',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'upgradeToken',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'addr',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'impl',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'walletFactory',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'HookFailed',\n inputs: [\n {\n name: 'wallet',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'reason',\n type: 'bytes',\n indexed: false,\n internalType: 'bytes',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const;\n","import type { Abi } from 'viem';\n\nexport const balnSwapAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'BASIS_POINTS',\n inputs: [],\n\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'EIGHTEEN_MONTHS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'EIGHTEEN_MONTHS_MULTIPLIER',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'NO_LOCKUP',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'NO_LOCKUP_MULTIPLIER',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'SIX_MONTHS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'SIX_MONTHS_MULTIPLIER',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'TWELVE_MONTHS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'TWELVE_MONTHS_MULTIPLIER',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'TWENTY_FOUR_MONTHS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'TWENTY_FOUR_MONTHS_MULTIPLIER',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'acceptOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'baln',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC20',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'calculateSodaAmount',\n inputs: [\n {\n name: 'balnAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'lockupPeriod',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'cancelUnstake',\n inputs: [\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'claim',\n inputs: [\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'claimUnstaked',\n inputs: [\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'configure',\n inputs: [\n {\n name: '_baln',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_soda',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_sodaVault',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_stakedSoda',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_xSoda',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getLock',\n inputs: [\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple',\n internalType: 'struct BalnSwap.Lock',\n components: [\n {\n name: 'balnAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unlockTime',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unstakingId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getMultiplierForPeriod',\n inputs: [\n {\n name: 'lockupPeriod',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'getUserLocks',\n inputs: [\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct BalnSwap.Lock[]',\n components: [\n {\n name: 'balnAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unlockTime',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unstakingId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getDetailedUserLocks',\n inputs: [\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct BalnSwap.DetailedLock[]',\n components: [\n {\n name: 'balnAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unlockTime',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unstakingId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unstakeRequest',\n type: 'tuple',\n internalType: 'struct IStakedSoda.UnstakeRequest',\n components: [\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'startTime',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n name: 'stakedSodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'isValidLockupPeriod',\n inputs: [\n {\n name: 'lockupPeriod',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingOwner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'soda',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC20',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'sodaVault',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'stake',\n inputs: [\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'stakedSoda',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IStakedSoda',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'swap',\n inputs: [\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'lockupPeriod',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'stakeSoda',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'totalAmount',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'unstake',\n inputs: [\n {\n name: 'lockId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'userLockCount',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'userLocks',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'balnAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unlockTime',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'unstakingId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'xSoda',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC4626',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'Claimed',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'asXSoda',\n type: 'bool',\n indexed: false,\n internalType: 'bool',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Staked',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Swap',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'balnAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'sodaAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Unstaked',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'xSodaAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ReentrancyGuardReentrantCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const satisfies Abi;\n\nexport type BalnSwapAbi = typeof balnSwapAbi;\n","export const connectionAbi = [\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'dstChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'dstAddress',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n ],\n name: 'sendMessage',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'srcChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'srcAddress',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'connSn',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n {\n internalType: 'bytes[]',\n name: 'signedMessages',\n type: 'bytes[]',\n },\n ],\n name: 'verifyMessage',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signedMessages',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n] as const;\n","export const erc20Abi = [\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalSupply',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'ERC20InsufficientAllowance',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientBalance',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'balance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidApprover',\n inputs: [\n {\n name: 'approver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidReceiver',\n inputs: [\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSender',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSpender',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n] as const;\n","export const poolAbi = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'mintUnbacked',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'backUnbacked',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'supply',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n ],\n name: 'borrow',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n ],\n name: 'repay',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'deadline',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'permitV',\n type: 'uint8',\n },\n {\n internalType: 'bytes32',\n name: 'permitR',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'permitS',\n type: 'bytes32',\n },\n ],\n name: 'repayWithPermit',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'interestRateMode',\n type: 'uint256',\n },\n ],\n name: 'repayWithATokens',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'bool',\n name: 'useAsCollateral',\n type: 'bool',\n },\n ],\n name: 'setUserUseReserveAsCollateral',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'collateralAsset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'debtAsset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'debtToCover',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'receiveAToken',\n type: 'bool',\n },\n ],\n name: 'liquidationCall',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address[]',\n name: 'assets',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'amounts',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'interestRateModes',\n type: 'uint256[]',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoan',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoanSimple',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserAccountData',\n outputs: [\n {\n internalType: 'uint256',\n name: 'totalCollateralBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'totalDebtBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'availableBorrowsBase',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'currentLiquidationThreshold',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'ltv',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'healthFactor',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'aTokenAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'variableDebtAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'interestRateStrategyAddress',\n type: 'address',\n },\n ],\n name: 'initReserve',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'dropReserve',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'rateStrategyAddress',\n type: 'address',\n },\n ],\n name: 'setReserveInterestRateStrategyAddress',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'syncIndexesState',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'syncRatesState',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'struct DataTypes.ReserveConfigurationMap',\n name: 'configuration',\n type: 'tuple',\n },\n ],\n name: 'setConfiguration',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getConfiguration',\n outputs: [\n {\n internalType: 'struct DataTypes.ReserveConfigurationMap',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUserConfiguration',\n outputs: [\n {\n internalType: 'struct DataTypes.UserConfigurationMap',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveNormalizedIncome',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveNormalizedVariableDebt',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getReserveData',\n outputs: [\n {\n components: [\n { name: 'configuration', type: 'uint256' },\n { name: 'liquidityIndex', type: 'uint128' },\n { name: 'currentLiquidityRate', type: 'uint128' },\n { name: 'variableBorrowIndex', type: 'uint128' },\n { name: 'currentVariableBorrowRate', type: 'uint128' },\n { name: 'currentStableBorrowRate', type: 'uint128' },\n { name: 'lastUpdateTimestamp', type: 'uint40' },\n { name: 'id', type: 'uint16' },\n { name: 'aTokenAddress', type: 'address' },\n { name: 'stableDebtTokenAddress', type: 'address' },\n { name: 'variableDebtTokenAddress', type: 'address' },\n { name: 'interestRateStrategyAddress', type: 'address' },\n { name: 'accruedToTreasury', type: 'uint128' },\n { name: 'unbacked', type: 'uint128' },\n { name: 'isolationModeTotalDebt', type: 'uint128' },\n ],\n internalType: 'struct DataTypes.ReserveDataLegacy',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n ],\n name: 'getVirtualUnderlyingBalance',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'rescueTokens',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiverAddress',\n type: 'address',\n },\n {\n internalType: 'address[]',\n name: 'assets',\n type: 'address[]',\n },\n {\n internalType: 'uint256[]',\n name: 'amounts',\n type: 'uint256[]',\n },\n {\n internalType: 'uint256[]',\n name: 'interestRateModes',\n type: 'uint256[]',\n },\n {\n internalType: 'address',\n name: 'onBehalfOf',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'params',\n type: 'bytes',\n },\n {\n internalType: 'uint16',\n name: 'referralCode',\n type: 'uint16',\n },\n ],\n name: 'flashLoan',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'ADDRESSES_PROVIDER',\n outputs: [\n {\n internalType: 'contract IPoolAddressesProvider',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'FLASHLOAN_PREMIUM_TOTAL',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'BRIDGE_PROTOCOL_FEE',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'FLASHLOAN_PREMIUM_TO_PROTOCOL',\n outputs: [\n {\n internalType: 'uint128',\n name: '',\n type: 'uint128',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MAX_NUMBER_RESERVES',\n outputs: [\n {\n internalType: 'uint16',\n name: '',\n type: 'uint16',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getReservesList',\n outputs: [\n {\n internalType: 'address[]',\n name: '',\n type: 'address[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getReservesCount',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","export const spokeAssetManagerAbi = [\n {\n inputs: [],\n name: 'InsufficientValue',\n type: 'error',\n },\n {\n inputs: [],\n name: 'TransferFailed',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'oldRateLimit',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newRateLimit',\n type: 'address',\n },\n ],\n name: 'RateLimitUpdated',\n type: 'event',\n },\n {\n inputs: [],\n name: 'connection',\n outputs: [\n {\n internalType: 'contract IConnection',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getImplementation',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'hubAssetManager',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'hubChainId',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract IConnection',\n name: '_connection',\n type: 'address',\n },\n {\n internalType: 'contract RateLimit',\n name: '_rateLimit',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: '_hubAssetManager',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: '_hubChainId',\n type: 'uint256',\n },\n ],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rateLimit',\n outputs: [\n {\n internalType: 'contract RateLimit',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'nonce',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'srcChainId',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'srcAddress',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'payload',\n type: 'bytes',\n },\n {\n internalType: 'bytes[]',\n name: 'signatures',\n type: 'bytes[]',\n },\n ],\n name: 'recvMessage',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'contract RateLimit',\n name: '_rateLimit',\n type: 'address',\n },\n ],\n name: 'setRateLimit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'to',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'transfer',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newImplementation',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'data',\n type: 'bytes',\n },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n] as const;\n","export const uiPoolDataAbi = [\n {\n type: 'constructor',\n inputs: [\n {\n name: '_networkBaseTokenPriceInUsdProxyAggregator',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n {\n name: '_marketReferenceCurrencyPriceInUsdProxyAggregator',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'ETH_CURRENCY_UNIT',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'MKR_ADDRESS',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'bytes32ToString',\n inputs: [\n {\n name: '_bytes32',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'pure',\n },\n {\n type: 'function',\n name: 'getEModes',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.Emode[]',\n components: [\n {\n name: 'id',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'eMode',\n type: 'tuple',\n internalType: 'struct DataTypes.EModeCategory',\n components: [\n {\n name: 'ltv',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'liquidationThreshold',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'liquidationBonus',\n type: 'uint16',\n internalType: 'uint16',\n },\n {\n name: 'collateralBitmap',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'label',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'borrowableBitmap',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getReservesData',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.AggregatedReserveData[]',\n components: [\n {\n name: 'underlyingAsset',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'symbol',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'decimals',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'baseLTVasCollateral',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveLiquidationThreshold',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveLiquidationBonus',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'reserveFactor',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'usageAsCollateralEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'borrowingEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isActive',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isFrozen',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'liquidityIndex',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'variableBorrowIndex',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'liquidityRate',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'variableBorrowRate',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'lastUpdateTimestamp',\n type: 'uint40',\n internalType: 'uint40',\n },\n {\n name: 'aTokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'variableDebtTokenAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'interestRateStrategyAddress',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'availableLiquidity',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'totalScaledVariableDebt',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'priceInMarketReferenceCurrency',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'priceOracle',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'variableRateSlope1',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'variableRateSlope2',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'baseVariableBorrowRate',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'optimalUsageRatio',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isPaused',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'isSiloedBorrowing',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'accruedToTreasury',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'unbacked',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'isolationModeTotalDebt',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'flashLoanEnabled',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'debtCeiling',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'debtCeilingDecimals',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'borrowCap',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'supplyCap',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'borrowableInIsolation',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'virtualAccActive',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'virtualUnderlyingBalance',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n {\n name: '',\n type: 'tuple',\n internalType: 'struct IUiPoolDataProviderV3.BaseCurrencyInfo',\n components: [\n {\n name: 'marketReferenceCurrencyUnit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'marketReferenceCurrencyPriceInUsd',\n type: 'int256',\n internalType: 'int256',\n },\n {\n name: 'networkBaseTokenPriceInUsd',\n type: 'int256',\n internalType: 'int256',\n },\n {\n name: 'networkBaseTokenPriceDecimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getReservesList',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getUserReservesData',\n inputs: [\n {\n name: 'provider',\n type: 'address',\n internalType: 'contract IPoolAddressesProvider',\n },\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct IUiPoolDataProviderV3.UserReserveData[]',\n components: [\n {\n name: 'underlyingAsset',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'scaledATokenBalance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'usageAsCollateralEnabledOnUser',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'scaledVariableDebt',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'marketReferenceCurrencyPriceInUsdProxyAggregator',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'networkBaseTokenPriceInUsdProxyAggregator',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IEACAggregatorProxy',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","export const vaultTokenAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'FEE_DENOMINATOR',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'addSupportedToken',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'allowance',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'approve',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'credit',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcToken',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'currentDebit',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'debit',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstToken',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint8',\n internalType: 'uint8',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'deposit',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'depositAndBurn',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'feeRecipient',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getAllTokenInfo',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n {\n name: '',\n type: 'tuple[]',\n internalType: 'struct VaultToken.TokenInfo[]',\n components: [\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isSupported',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n },\n {\n name: '',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getVaultReserves',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address[]',\n internalType: 'address[]',\n },\n {\n name: '',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'symbol',\n type: 'string',\n internalType: 'string',\n },\n {\n name: '_feeRecipient',\n type: 'address',\n internalType: 'address',\n },\n {\n name: '_rateLimits',\n type: 'address',\n internalType: 'contract IRateLimits',\n },\n {\n name: '_xTokenManager',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'maxDebit',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'name',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'rateLimits',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IRateLimits',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setDebit',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'token',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setFeeRecipient',\n inputs: [\n {\n name: '_feeRecipient',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setMaxDebit',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'token',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'limit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setMaxDeposit',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setXTokenManager',\n inputs: [\n {\n name: '_xTokenManager',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'supportedTokens',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'symbol',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'tokenInfo',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'decimals',\n type: 'uint8',\n internalType: 'uint8',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'isSupported',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'totalSupply',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transfer',\n inputs: [\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferFrom',\n inputs: [\n {\n name: 'from',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'updateToken',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'depositFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'withdrawalFee',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'maxDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'withdraw',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'xTokenManager',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'Approval',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'spender',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n {\n name: 'from',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'value',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientAllowance',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'allowance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InsufficientBalance',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'balance',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'needed',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidApprover',\n inputs: [\n {\n name: 'approver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidReceiver',\n inputs: [\n {\n name: 'receiver',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSender',\n inputs: [\n {\n name: 'sender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC20InvalidSpender',\n inputs: [\n {\n name: 'spender',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const;\n","export const walletFactoryAbi = [\n {\n type: 'function',\n name: 'getDeployedAddress',\n inputs: [\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'user',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [\n {\n name: 'computedAddress',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","export const IntentsAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'HUB_CHAIN_ID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'addSpoke',\n inputs: [\n {\n name: 'chainID',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'spokeAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'assetManager',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IAssetManager',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'cancelIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'connection',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IConnection',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'createIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'externalFills',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'fillIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n {\n name: '_inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_externalFillId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [\n {\n name: '_walletFactory',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n {\n name: '_assetManager',\n type: 'address',\n internalType: 'contract IAssetManager',\n },\n {\n name: '_connection',\n type: 'address',\n internalType: 'contract IConnection',\n },\n {\n name: '_HUB_CHAIN_ID',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'intentStates',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: 'exists',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'remainingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receivedOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingPayment',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingIntentStates',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: 'pendingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingPayouts',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'preFillIntent',\n inputs: [\n {\n name: 'intent',\n type: 'tuple',\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n {\n name: '_inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: '_externalFillId',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'proxiableUUID',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'recvMessage',\n inputs: [\n {\n name: 'srcChainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'connSn',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'payload',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'signatures',\n type: 'bytes[]',\n internalType: 'bytes[]',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'renounceOwnership',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'setWhitelistedSolver',\n inputs: [\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'whitelisted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'spokes',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'transferOwnership',\n inputs: [\n {\n name: 'newOwner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'upgradeToAndCall',\n inputs: [\n {\n name: 'newImplementation',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'payable',\n },\n {\n type: 'function',\n name: 'walletFactory',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IWalletFactory',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'whitelistedSolvers',\n inputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'event',\n name: 'ExternalFillFailed',\n inputs: [\n {\n name: 'fillId',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'fill',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.ExternalFill',\n components: [\n {\n name: 'intentHash',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'outputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentCancelled',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentCreated',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n {\n name: 'intent',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.Intent',\n components: [\n {\n name: 'intentId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'creator',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'outputToken',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'inputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'minOutputAmount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'deadline',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'allowPartialFill',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'srcChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'dstChain',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'srcAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'dstAddress',\n type: 'bytes',\n internalType: 'bytes',\n },\n {\n name: 'solver',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'data',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'IntentFilled',\n inputs: [\n {\n name: 'intentHash',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n {\n name: 'intentState',\n type: 'tuple',\n indexed: false,\n internalType: 'struct Intents.IntentState',\n components: [\n {\n name: 'exists',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'remainingInput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'receivedOutput',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'pendingPayment',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FillAlreadyExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'IntentAlreadyExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'IntentNotFound',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidAmount',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidOutputToken',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidSolver',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'PartialFillNotAllowed',\n inputs: [],\n },\n {\n type: 'error',\n name: 'PendingFillExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'SpokeNotConfigured',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n {\n type: 'error',\n name: 'Unauthorized',\n inputs: [],\n },\n] as const;\n","export const sonicWalletFactoryAbi = [\n { inputs: [{ internalType: 'address', name: 'target', type: 'address' }], name: 'AddressEmptyCode', type: 'error' },\n {\n inputs: [{ internalType: 'address', name: 'implementation', type: 'address' }],\n name: 'ERC1967InvalidImplementation',\n type: 'error',\n },\n { inputs: [], name: 'ERC1967NonPayable', type: 'error' },\n { inputs: [], name: 'FailedCall', type: 'error' },\n { inputs: [], name: 'InvalidInitialization', type: 'error' },\n { inputs: [], name: 'NotInitializing', type: 'error' },\n { inputs: [{ internalType: 'address', name: 'owner', type: 'address' }], name: 'OwnableInvalidOwner', type: 'error' },\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'OwnableUnauthorizedAccount',\n type: 'error',\n },\n { inputs: [], name: 'UUPSUnauthorizedCallContext', type: 'error' },\n {\n inputs: [{ internalType: 'bytes32', name: 'slot', type: 'bytes32' }],\n name: 'UUPSUnsupportedProxiableUUID',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [{ indexed: false, internalType: 'uint64', name: 'version', type: 'uint64' }],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },\n { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },\n ],\n name: 'OwnershipTransferStarted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'previousOwner', type: 'address' },\n { indexed: true, internalType: 'address', name: 'newOwner', type: 'address' },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [{ indexed: true, internalType: 'address', name: 'implementation', type: 'address' }],\n name: 'Upgraded',\n type: 'event',\n },\n {\n inputs: [],\n name: 'UPGRADE_INTERFACE_VERSION',\n outputs: [{ internalType: 'string', name: '', type: 'string' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'acceptOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [{ internalType: 'bytes32', name: 'salt', type: 'bytes32' }],\n name: 'deploy',\n outputs: [{ internalType: 'address', name: 'deployedAddress', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'user', type: 'address' }],\n name: 'getDeployedAddress',\n outputs: [{ internalType: 'address', name: 'computedAddress', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getImplementation',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'implementation',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'initialize', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingOwner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'proxiableUUID',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n { inputs: [], name: 'registerMe', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n { inputs: [], name: 'renounceOwnership', outputs: [], stateMutability: 'nonpayable', type: 'function' },\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'addr', type: 'address' },\n { internalType: 'uint256', name: 'value', type: 'uint256' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n internalType: 'struct ISonicRouterWallet.ContractCall[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'route',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newOwner', type: 'address' }],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: '_newWalletImplementation', type: 'address' }],\n name: 'updateWalletImplementation',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'newImplementation', type: 'address' },\n { internalType: 'bytes', name: 'data', type: 'bytes' },\n ],\n name: 'upgradeToAndCall',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n] as const;\n","export const wrappedSonicAbi = [\n {\n inputs: [],\n name: 'ERC20InvalidZeroDeposit',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'recipient',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'ERC20WithdrawFailed',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Deposit',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'Withdrawal',\n type: 'event',\n },\n {\n stateMutability: 'payable',\n type: 'fallback',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'depositFor',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'deposit',\n outputs: [],\n stateMutability: 'payable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'withdraw',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'withdrawTo',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","export const variableDebtTokenAbi = [\n {\n inputs: [\n {\n name: 'delegatee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n name: 'approveDelegation',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n type: 'function',\n name: 'borrowAllowance',\n inputs: [\n {\n name: 'fromUser',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'toUser',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n","// packages/sdk/src/abis/stakedSoda.abi.ts\nexport const stakedSodaAbi = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'user',\n type: 'address',\n },\n ],\n name: 'getUnstakeRequests',\n outputs: [\n {\n components: [\n {\n internalType: 'uint256',\n name: 'id',\n type: 'uint256',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'startTime',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n ],\n internalType: 'struct IStakedSoda.UnstakeRequest',\n name: 'request',\n type: 'tuple',\n },\n ],\n internalType: 'struct IStakedSoda.UserUnstakeInfo[]',\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'depositFor',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'withdrawTo',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'unstake',\n outputs: [\n {\n internalType: 'uint256',\n name: 'requestId',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'requestId',\n type: 'uint256',\n },\n ],\n name: 'cancelUnstakeRequest',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'requestId',\n type: 'uint256',\n },\n ],\n name: 'claim',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n // ERC4626 functions\n {\n inputs: [],\n name: 'asset',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalAssets',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'convertToShares',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'convertToAssets',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'maxDeposit',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewDeposit',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'assets',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'deposit',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'maxMint',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewMint',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'shares',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n ],\n name: 'mint',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxWithdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'assets',\n type: 'uint256',\n },\n ],\n name: 'previewWithdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'assets',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'withdraw',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'maxRedeem',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'shares',\n type: 'uint256',\n },\n ],\n name: 'previewRedeem',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'shares',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'receiver',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'owner',\n type: 'address',\n },\n ],\n name: 'redeem',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n // Configuration functions\n {\n inputs: [],\n name: 'unstakingPeriod',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'minUnstakingPeriod',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'maxPenalty',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'getParameters',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","// packages/sdk/src/abis/stakingRouter.abi.ts\nexport const stakingRouterAbi = [\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n internalType: 'uint128',\n name: 'minReceive',\n type: 'uint128',\n },\n ],\n name: 'stake',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minAmount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'asset',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'chainID',\n type: 'uint256',\n },\n {\n internalType: 'bytes',\n name: 'to',\n type: 'bytes',\n },\n ],\n name: 'unstake',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'estimateXSodaAmount',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'estimateInstantUnstake',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n","import { defineChain, type Chain } from 'viem';\nimport { arbitrum, avalanche, base, bsc, nibiru, optimism, polygon, sonic, lightlinkPhoenix } from 'viem/chains';\nimport type { LegacybnUSDChainId, LegacybnUSDToken, NewbnUSDChainId } from '../index.js';\nimport {\n type Token,\n type SpokeChainId,\n AVALANCHE_MAINNET_CHAIN_ID,\n ARBITRUM_MAINNET_CHAIN_ID,\n BASE_MAINNET_CHAIN_ID,\n BSC_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n OPTIMISM_MAINNET_CHAIN_ID,\n POLYGON_MAINNET_CHAIN_ID,\n NIBIRU_MAINNET_CHAIN_ID,\n SUI_MAINNET_CHAIN_ID,\n STELLAR_MAINNET_CHAIN_ID,\n ICON_MAINNET_CHAIN_ID,\n CHAIN_IDS,\n HYPEREVM_MAINNET_CHAIN_ID,\n LIGHTLINK_MAINNET_CHAIN_ID,\n spokeChainConfig,\n type EvmChainId,\n} from '@sodax/types';\n\nexport const DEFAULT_MAX_RETRY = 3;\nexport const DEFAULT_RELAY_TX_TIMEOUT = 120000; // 120 seconds\nexport const DEFAULT_RETRY_DELAY_MS = 2000;\nexport const ICON_TX_RESULT_WAIT_MAX_RETRY = 10;\nexport const MAX_UINT256 = (1n << 256n) - 1n;\nexport const FEE_PERCENTAGE_SCALE = 10000n; // 100% = 10000\nexport const STELLAR_PRIORITY_FEE = '10000';\nexport const STELLAR_DEFAULT_TX_TIMEOUT_SECONDS = 100;\nexport const DEFAULT_DEADLINE_OFFSET = 300n; // 5 minutes in seconds\nexport const DEFAULT_BACKEND_API_ENDPOINT = 'https://api.sodax.com/v1/be';\nexport const DEFAULT_BACKEND_API_TIMEOUT = 30000; // 30 seconds\nexport const DEFAULT_BACKEND_API_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n};\nexport const DEFAULT_RELAYER_API_ENDPOINT = 'https://xcall-relay.nw.iconblockchain.xyz';\nexport const VAULT_TOKEN_DECIMALS = 18;\n\n// HyperEVM chain is not supported by viem, so we need to define it manually\nexport const hyper = /*#__PURE__*/ defineChain({\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: {\n decimals: 18,\n name: 'HYPE',\n symbol: 'HYPE',\n },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n blockExplorers: {\n default: {\n name: 'HyperEVMScan',\n url: 'https://hyperevmscan.io/',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 13051,\n },\n },\n});\n\nexport function getEvmViemChain(id: EvmChainId): Chain {\n switch (id) {\n case SONIC_MAINNET_CHAIN_ID:\n return sonic;\n case AVALANCHE_MAINNET_CHAIN_ID:\n return avalanche;\n case ARBITRUM_MAINNET_CHAIN_ID:\n return arbitrum;\n case BASE_MAINNET_CHAIN_ID:\n return base;\n case OPTIMISM_MAINNET_CHAIN_ID:\n return optimism;\n case BSC_MAINNET_CHAIN_ID:\n return bsc;\n case POLYGON_MAINNET_CHAIN_ID:\n return polygon;\n case NIBIRU_MAINNET_CHAIN_ID:\n return nibiru;\n case HYPEREVM_MAINNET_CHAIN_ID:\n return hyper;\n case LIGHTLINK_MAINNET_CHAIN_ID:\n return lightlinkPhoenix;\n default:\n throw new Error(`Unsupported EVM chain ID: ${id}`);\n }\n}\n\n// bnUSD Migration configs\nexport const bnUSDLegacySpokeChainIds = [\n ICON_MAINNET_CHAIN_ID,\n SUI_MAINNET_CHAIN_ID,\n STELLAR_MAINNET_CHAIN_ID,\n] as const;\nexport const newbnUSDSpokeChainIds = CHAIN_IDS.filter(chainId => chainId !== ICON_MAINNET_CHAIN_ID);\nexport const bnUSDLegacyTokens = [\n spokeChainConfig[ICON_MAINNET_CHAIN_ID].supportedTokens.bnUSD,\n spokeChainConfig[SUI_MAINNET_CHAIN_ID].supportedTokens.legacybnUSD,\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.legacybnUSD,\n] as const;\nexport const bnUSDNewTokens = newbnUSDSpokeChainIds.map(chainId => spokeChainConfig[chainId].supportedTokens.bnUSD);\n\nexport const isLegacybnUSDChainId = (chainId: SpokeChainId): boolean => {\n return bnUSDLegacySpokeChainIds.includes(chainId as LegacybnUSDChainId);\n};\n\nexport const isNewbnUSDChainId = (chainId: SpokeChainId): boolean => {\n return newbnUSDSpokeChainIds.includes(chainId as NewbnUSDChainId);\n};\n\nexport const isLegacybnUSDToken = (token: Token | string): boolean => {\n if (typeof token === 'string') {\n return bnUSDLegacyTokens.some(t => t.address.toLowerCase() === token.toLowerCase());\n }\n\n return bnUSDLegacyTokens.some(t => t.address.toLowerCase() === token.address.toLowerCase());\n};\n\nexport const isNewbnUSDToken = (token: Token | string): boolean => {\n if (typeof token === 'string') {\n return newbnUSDSpokeChainIds\n .map(chainId => spokeChainConfig[chainId].supportedTokens.bnUSD)\n .some(t => t.address.toLowerCase() === token.toLowerCase());\n }\n return newbnUSDSpokeChainIds\n .map(chainId => spokeChainConfig[chainId].supportedTokens.bnUSD)\n .some(t => t.address.toLowerCase() === token.address.toLowerCase());\n};\n\nexport const getAllLegacybnUSDTokens = (): { token: LegacybnUSDToken; chainId: LegacybnUSDChainId }[] => {\n return bnUSDLegacySpokeChainIds.map(chainId => ({\n token: spokeChainConfig[chainId].supportedTokens.legacybnUSD,\n chainId,\n }));\n};\n\n// export const hubVaultsAddressSet = new Set<Address>(\n// Object.values(hubVaults).map(vault => vault.address.toLowerCase() as Address),\n// );\n\n// all hub assets contained in the money market reserves (supply / borrow assets)\n// export const moneyMarketReserveHubAssetsSet = new Set<Address>(\n// Object.values(hubVaults).flatMap(vault => vault.reserves.map(reserve => reserve.toLowerCase() as Address)),\n// );\n\n// export const isMoneyMarketReserveHubAsset = (hubAsset: Address): boolean =>\n// moneyMarketReserveHubAssetsSet.has(hubAsset.toLowerCase() as Address);\n\n// export const originalAssetTohubAssetMap: Map<SpokeChainId, Map<OriginalAssetAddress, HubAssetInfo>> = new Map(\n// Object.entries(hubAssets).map(([chainId, assets]) => [\n// chainId as SpokeChainId,\n// new Map(Object.entries(assets).map(([asset, info]) => [asset.toLowerCase(), info])),\n// ]),\n// );\n// export const hubAssetToOriginalAssetMap: Map<SpokeChainId, Map<Address, OriginalAssetAddress>> = new Map(\n// Object.entries(hubAssets).map(([chainId, assets]) => [\n// chainId as SpokeChainId,\n// new Map(Object.entries(assets).map(([asset, info]) => [info.asset.toLowerCase() as Address, asset])),\n// ]),\n// );\n// export const chainIdToHubAssetsMap: Map<SpokeChainId, Map<Address, HubAssetInfo>> = new Map(\n// Object.entries(hubAssets).map(([chainId, assets]) => [\n// chainId as SpokeChainId,\n// new Map(Object.entries(assets).map(([, info]) => [info.asset.toLowerCase() as Address, info])),\n// ]),\n// );\n// export const supportedHubAssets: Set<Address> = new Set(\n// Object.values(hubAssets).flatMap(assets => Object.values(assets).map(info => info.asset.toLowerCase() as Address)),\n// );\n// export const supportedSodaAssets: Set<Address> = new Set(\n// Object.values(hubAssets).flatMap(assets => Object.values(assets).map(info => info.vault.toLowerCase() as Address)),\n// );\n// export const spokeChainIdsSet = new Set(CHAIN_IDS);\n\n// Returns the first hub asset info for a given chainId whose vault address matches the provided vault address (case-insensitive)\n// export const getOriginalAssetInfoFromVault = (chainId: SpokeChainId, vault: Address): OriginalAssetAddress[] => {\n// const assets = hubAssets[chainId];\n// if (!assets) {\n// return [];\n// }\n// const vaultAddress = vault.toLowerCase();\n// const result: OriginalAssetAddress[] = [];\n// for (const [spokeToken, info] of Object.entries(assets)) {\n// if (info.vault.toLowerCase() === vaultAddress) {\n// result.push(spokeToken);\n// }\n// }\n// return result;\n// };\n// export const getHubAssetInfo = (chainId: SpokeChainId, asset: OriginalAssetAddress): HubAssetInfo | undefined =>\n// originalAssetTohubAssetMap.get(chainId)?.get(asset.toLowerCase());\n// export const isValidOriginalAssetAddress = (chainId: SpokeChainId, asset: OriginalAssetAddress): boolean =>\n// originalAssetTohubAssetMap.get(chainId)?.has(asset.toLowerCase()) ?? false;\n// export const getOriginalAssetAddress = (chainId: SpokeChainId, hubAsset: Address): OriginalAssetAddress | undefined =>\n// hubAssetToOriginalAssetMap.get(chainId)?.get(hubAsset.toLowerCase() as Address);\n// export const getOriginalTokenFromOriginalAssetAddress = (\n// chainId: SpokeChainId,\n// asset: OriginalAssetAddress,\n// ): XToken | undefined =>\n// Object.values(spokeChainConfig[chainId].supportedTokens).find(t => t.address.toLowerCase() === asset.toLowerCase()) ??\n// undefined;\n// export const isValidHubAsset = (hubAsset: Address): boolean =>\n// supportedHubAssets.has(hubAsset.toLowerCase() as Address);\n// export const isValidVault = (vault: Address): boolean => supportedSodaAssets.has(vault.toLowerCase() as Address);\n// export const isValidChainHubAsset = (chainId: SpokeChainId, hubAsset: Address): boolean =>\n// chainIdToHubAssetsMap.get(chainId)?.has(hubAsset.toLowerCase() as Address) ?? false;\n// export const isValidSpokeChainId = (chainId: SpokeChainId): boolean => spokeChainIdsSet.has(chainId);\n// export const isValidIntentRelayChainId = (chainId: bigint): boolean =>\n// Object.values(ChainIdToIntentRelayChainId).some(id => id === chainId);\n// export const supportedHubChains: HubChainId[] = Object.keys(hubChainConfig) as HubChainId[];\n// export const intentRelayChainIdToSpokeChainIdMap: Map<IntentRelayChainId, SpokeChainId> = new Map(\n// Object.entries(ChainIdToIntentRelayChainId).map(([chainId, intentRelayChainId]) => [\n// intentRelayChainId,\n// chainId as SpokeChainId,\n// ]),\n// );\n// export const supportedTokensPerChain: Map<SpokeChainId, readonly XToken[]> = new Map(\n// Object.entries(spokeChainConfig).map(([chainId, config]) => [\n// chainId as SpokeChainId,\n// Object.values(config.supportedTokens),\n// ]),\n// );\n\n// export const getSpokeChainIdFromIntentRelayChainId = (intentRelayChainId: IntentRelayChainId): SpokeChainId => {\n// const spokeChainId = intentRelayChainIdToSpokeChainIdMap.get(intentRelayChainId);\n// if (!spokeChainId) {\n// throw new Error(`Invalid intent relay chain id: ${intentRelayChainId}`);\n// }\n// return spokeChainId;\n// };\n// export const isNativeToken = (chainId: SpokeChainId, token: Token | string): boolean => {\n// if (typeof token === 'string') {\n// return token.toLowerCase() === spokeChainConfig[chainId].nativeToken.toLowerCase();\n// }\n\n// return token.address.toLowerCase() === spokeChainConfig[chainId].nativeToken.toLowerCase();\n// };\n\n// export const findSupportedTokenBySymbol = (chainId: SpokeChainId, symbol: string): XToken | undefined => {\n// const supportedTokens = Object.values(spokeChainConfig[chainId].supportedTokens);\n// return supportedTokens.find(token => token.symbol.toLowerCase() === symbol.toLowerCase());\n// };\n","import {\n type Address,\n type GetChainsApiResponse,\n type GetHubAssetsApiResponse,\n type GetMoneyMarketReserveAssetsApiResponse,\n type GetRelayChainIdMapApiResponse,\n type GetSpokeChainConfigApiResponse,\n type HttpUrl,\n type HubAssetInfo,\n type HubChainId,\n type IntentRelayChainId,\n type OriginalAssetAddress,\n type SpokeChainId,\n type Token,\n type XToken,\n type GetHubVaultsApiResponse,\n type EvmHubChainConfig,\n type GetAllConfigApiResponse,\n defaultSodaxConfig,\n hubChainConfig,\n type GetMoneyMarketTokensApiResponse,\n type GetSwapTokensByChainIdApiResponse,\n type GetSwapTokensApiResponse,\n} from '@sodax/types';\nimport type { BackendApiService } from '../../backendApi/BackendApiService.js';\nimport { DEFAULT_BACKEND_API_ENDPOINT, DEFAULT_BACKEND_API_TIMEOUT } from '../constants.js';\nimport type { Result } from '../types.js';\n\nexport type ConfigServiceConfig = {\n backendApiUrl: HttpUrl | undefined;\n timeout: number | undefined; // in milliseconds\n};\n\nexport type ConfigServiceConstructorParams = {\n backendApiService: BackendApiService;\n config?: ConfigServiceConfig;\n};\n\n/**\n * ConfigApiService - Service for fetching configuration data from the backend API or fallbacking to default values\n */\nexport class ConfigService {\n readonly serviceConfig: ConfigServiceConfig;\n readonly backendApiService: BackendApiService;\n private initialized = false;\n\n private sodaxConfig: GetAllConfigApiResponse;\n\n // data structures for quick lookup\n private originalAssetTohubAssetMap!: Map<SpokeChainId, Map<OriginalAssetAddress, HubAssetInfo>>;\n private hubAssetToOriginalAssetMap!: Map<SpokeChainId, Map<Address, OriginalAssetAddress>>;\n private chainIdToHubAssetsMap!: Map<SpokeChainId, Map<Address, HubAssetInfo>>;\n private supportedHubAssetsSet!: Set<Address>;\n private supportedSodaVaultAssetsSet!: Set<Address>;\n private intentRelayChainIdToSpokeChainIdMap!: Map<IntentRelayChainId, SpokeChainId>;\n private supportedTokensPerChain!: Map<SpokeChainId, readonly XToken[]>;\n private hubVaultsAddressSet!: Set<Address>;\n private moneyMarketReserveAssetsSet!: Set<Address>;\n private spokeChainIdsSet!: Set<SpokeChainId>;\n\n constructor({ backendApiService, config }: ConfigServiceConstructorParams) {\n this.serviceConfig = {\n backendApiUrl: config?.backendApiUrl ?? DEFAULT_BACKEND_API_ENDPOINT,\n timeout: config?.timeout ?? DEFAULT_BACKEND_API_TIMEOUT,\n } satisfies ConfigServiceConfig;\n this.backendApiService = backendApiService;\n this.sodaxConfig = defaultSodaxConfig;\n this.loadSodaxConfigDataStructures(this.sodaxConfig);\n }\n\n public async initialize(): Promise<Result<void>> {\n try {\n this.sodaxConfig = await this.backendApiService.getAllConfig();\n this.loadSodaxConfigDataStructures(this.sodaxConfig);\n this.initialized = true;\n\n return {\n ok: true,\n value: undefined,\n };\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n\n public getChains(): GetChainsApiResponse {\n return this.sodaxConfig.supportedChains;\n }\n\n public getSwapTokens(): GetSwapTokensApiResponse {\n return this.sodaxConfig.supportedSwapTokens;\n }\n\n public getSwapTokensByChainId(chainId: SpokeChainId): GetSwapTokensByChainIdApiResponse {\n return this.sodaxConfig.supportedSwapTokens[chainId];\n }\n\n public getHubAssets(): GetHubAssetsApiResponse {\n return this.sodaxConfig.supportedHubAssets;\n }\n\n public getHubVaults(): GetHubVaultsApiResponse {\n return this.sodaxConfig.supportedHubVaults;\n }\n\n public getRelayChainIdMap(): GetRelayChainIdMapApiResponse {\n return this.sodaxConfig.relayChainIdMap;\n }\n\n public getMoneyMarketTokens(): GetMoneyMarketTokensApiResponse {\n return this.sodaxConfig.supportedMoneyMarketTokens;\n }\n\n public getMoneyMarketReserveAssets(): GetMoneyMarketReserveAssetsApiResponse {\n return this.sodaxConfig.supportedMoneyMarketReserveAssets;\n }\n\n public getHubAssetInfo(chainId: SpokeChainId, asset: OriginalAssetAddress): HubAssetInfo | undefined {\n return this.originalAssetTohubAssetMap.get(chainId)?.get(asset.toLowerCase());\n }\n\n public isValidOriginalAssetAddress(chainId: SpokeChainId, asset: OriginalAssetAddress): boolean {\n return this.originalAssetTohubAssetMap.get(chainId)?.has(asset.toLowerCase()) ?? false;\n }\n\n public getOriginalAssetAddress(chainId: SpokeChainId, hubAsset: Address): OriginalAssetAddress | undefined {\n return this.hubAssetToOriginalAssetMap.get(chainId)?.get(hubAsset.toLowerCase() as Address);\n }\n\n public isValidHubAsset(hubAsset: Address): boolean {\n return this.supportedHubAssetsSet.has(hubAsset.toLowerCase() as Address);\n }\n\n public isValidSodaVaultAsset(vault: Address): boolean {\n return this.supportedSodaVaultAssetsSet.has(vault.toLowerCase() as Address);\n }\n\n public isValidVault(vault: Address): boolean {\n return this.isValidSodaVaultAsset(vault);\n }\n\n public isValidChainHubAsset(chainId: SpokeChainId, hubAsset: Address): boolean {\n return this.chainIdToHubAssetsMap.get(chainId)?.has(hubAsset.toLowerCase() as Address) ?? false;\n }\n\n public isValidSpokeChainId(chainId: SpokeChainId): boolean {\n return this.spokeChainIdsSet.has(chainId);\n }\n\n public isValidIntentRelayChainId(chainId: bigint): boolean {\n return Object.values(this.sodaxConfig.relayChainIdMap).some(id => id === chainId);\n }\n\n public getSupportedHubChains(): HubChainId[] {\n return Object.keys(hubChainConfig) as HubChainId[];\n }\n\n public getHubChainConfig(): EvmHubChainConfig {\n return hubChainConfig;\n }\n\n public getSupportedSpokeChains(): SpokeChainId[] {\n return Object.keys(this.sodaxConfig.spokeChainConfig) as SpokeChainId[];\n }\n\n public getSpokeChainIdFromIntentRelayChainId(intentRelayChainId: IntentRelayChainId): SpokeChainId {\n const spokeChainId = this.intentRelayChainIdToSpokeChainIdMap.get(intentRelayChainId);\n\n if (!spokeChainId) {\n throw new Error(`Invalid intent relay chain id: ${intentRelayChainId}`);\n }\n\n return spokeChainId;\n }\n\n public getSupportedTokensPerChain(): Map<SpokeChainId, readonly XToken[]> {\n return this.supportedTokensPerChain;\n }\n\n public getSupportedMoneyMarketTokensByChainId(chainId: SpokeChainId): readonly Token[] {\n return this.sodaxConfig.supportedMoneyMarketTokens[chainId];\n }\n\n public getSupportedMoneyMarketTokens(): GetMoneyMarketTokensApiResponse {\n return this.sodaxConfig.supportedMoneyMarketTokens;\n }\n\n public getSupportedSwapTokensByChainId(chainId: SpokeChainId): readonly Token[] {\n return this.sodaxConfig.supportedSwapTokens[chainId];\n }\n\n public getSupportedSwapTokens(): GetSwapTokensApiResponse {\n return this.sodaxConfig.supportedSwapTokens;\n }\n\n public isNativeToken(chainId: SpokeChainId, token: Token | string): boolean {\n if (typeof token === 'string') {\n return token.toLowerCase() === this.sodaxConfig.spokeChainConfig[chainId].nativeToken.toLowerCase();\n }\n\n return token.address.toLowerCase() === this.sodaxConfig.spokeChainConfig[chainId].nativeToken.toLowerCase();\n }\n\n public findSupportedTokenBySymbol(chainId: SpokeChainId, symbol: string): XToken | undefined {\n const supportedTokens = Object.values(this.sodaxConfig.spokeChainConfig[chainId].supportedTokens);\n return supportedTokens.find(token => token.symbol.toLowerCase() === symbol.toLowerCase());\n }\n\n public getOriginalAssetInfoFromVault(chainId: SpokeChainId, vault: Address): OriginalAssetAddress[] {\n const hubAssets = this.sodaxConfig.supportedHubAssets;\n const assets = hubAssets[chainId];\n if (!assets) {\n return [];\n }\n const vaultAddress = vault.toLowerCase();\n const result: OriginalAssetAddress[] = [];\n for (const [spokeToken, info] of Object.entries(assets)) {\n if (info.vault.toLowerCase() === vaultAddress) {\n result.push(spokeToken);\n }\n }\n return result;\n }\n\n public isMoneyMarketSupportedToken(chainId: SpokeChainId, token: string): boolean {\n return this.sodaxConfig.supportedMoneyMarketTokens[chainId].some(\n t => t.address.toLowerCase() === token.toLowerCase(),\n );\n }\n\n public isMoneyMarketReserveAsset(asset: Address): boolean {\n return this.sodaxConfig.supportedMoneyMarketReserveAssets.map(a => a.toLowerCase()).includes(asset.toLowerCase());\n }\n\n public isMoneyMarketReserveHubAsset(hubAsset: Address): boolean {\n return this.moneyMarketReserveAssetsSet.has(hubAsset.toLowerCase() as Address);\n }\n\n public getHubVaultsAddressSet(): Set<Address> {\n return this.hubVaultsAddressSet;\n }\n\n private loadSodaxConfigDataStructures(sodaxConfig: GetAllConfigApiResponse): void {\n this.loadHubAssetDataStructures(sodaxConfig.supportedHubAssets);\n this.loadHubVaultsDataStructures(sodaxConfig.supportedHubVaults);\n this.loadSpokeChainDataStructures(sodaxConfig.supportedChains);\n this.loadRelayChainIdMapDataStructures(sodaxConfig.relayChainIdMap);\n this.loadSpokeChainConfigDataStructures(sodaxConfig.spokeChainConfig);\n this.loadMoneyMarketReserveAssetsDataStructures(sodaxConfig.supportedMoneyMarketReserveAssets);\n }\n\n private loadHubAssetDataStructures(hubAssets: GetHubAssetsApiResponse): void {\n this.originalAssetTohubAssetMap = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([asset, info]) => [asset.toLowerCase(), info])),\n ]),\n );\n\n this.hubAssetToOriginalAssetMap = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([asset, info]) => [info.asset.toLowerCase() as Address, asset])),\n ]),\n );\n\n this.chainIdToHubAssetsMap = new Map(\n Object.entries(hubAssets).map(([chainId, assets]) => [\n chainId as SpokeChainId,\n new Map(Object.entries(assets).map(([, info]) => [info.asset.toLowerCase() as Address, info])),\n ]),\n );\n\n this.supportedHubAssetsSet = new Set(\n Object.values(hubAssets).flatMap(assets =>\n Object.values(assets).map(info => info.asset.toLowerCase() as Address),\n ),\n );\n\n this.supportedSodaVaultAssetsSet = new Set(\n Object.values(hubAssets).flatMap(assets =>\n Object.values(assets).map(info => info.vault.toLowerCase() as Address),\n ),\n );\n }\n\n private loadHubVaultsDataStructures(hubVaults: GetHubVaultsApiResponse): void {\n this.hubVaultsAddressSet = new Set(Object.values(hubVaults).map(vault => vault.address.toLowerCase() as Address));\n }\n\n private loadSpokeChainDataStructures(chains: GetChainsApiResponse): void {\n this.spokeChainIdsSet = new Set(chains);\n }\n\n private loadRelayChainIdMapDataStructures(relayChainIdMap: GetRelayChainIdMapApiResponse): void {\n this.intentRelayChainIdToSpokeChainIdMap = new Map(\n Object.entries(relayChainIdMap).map(([chainId, intentRelayChainId]) => [\n intentRelayChainId as IntentRelayChainId,\n chainId as SpokeChainId,\n ]),\n );\n }\n\n private loadSpokeChainConfigDataStructures(spokeChainConfig: GetSpokeChainConfigApiResponse): void {\n this.supportedTokensPerChain = new Map(\n Object.entries(spokeChainConfig).map(([chainId, config]) => [\n chainId as SpokeChainId,\n Object.values(config.supportedTokens),\n ]),\n );\n }\n\n private loadMoneyMarketReserveAssetsDataStructures(\n moneyMarketReserveAssets: GetMoneyMarketReserveAssetsApiResponse,\n ): void {\n this.moneyMarketReserveAssetsSet = new Set(moneyMarketReserveAssets);\n }\n\n public isInitialized(): boolean {\n return this.sodaxConfig !== undefined && this.initialized;\n }\n\n get spokeChainConfig(): GetSpokeChainConfigApiResponse {\n return this.sodaxConfig.spokeChainConfig;\n }\n}\n\n/**\n * static configs that should never change\n */\n\nexport function getHubChainConfig(): EvmHubChainConfig {\n return hubChainConfig;\n}\n","// Utility to parse a plain JSON object into a readonly Token[] type\n// Ensures object array matches minimum Token property requirements\n\nimport type { Token } from '@sodax/types';\n\n/**\n * Safely parse a JSON value presumed to be an array of Token-like objects\n * Returns a readonly Token[] if successfully parsed, throws otherwise\n * @param input the JSON value to parse\n */\nexport function parseTokenArrayFromJson(input: unknown): readonly Token[] {\n if (!Array.isArray(input)) {\n throw new TypeError('Input must be an array');\n }\n\n // Validate and collect Token entries using a for loop,\n // ensuring the minimum required Token properties are present\n const tokens: Token[] = [];\n for (let idx = 0; idx < input.length; idx++) {\n const item = input[idx];\n if (\n typeof item !== 'object' ||\n item === null ||\n typeof (item as Record<string, unknown>).symbol !== 'string' ||\n typeof (item as Record<string, unknown>).name !== 'string' ||\n typeof (item as Record<string, unknown>).address !== 'string' ||\n typeof (item as Record<string, unknown>).decimals !== 'number'\n ) {\n throw new TypeError(`Item at index ${idx} is not a valid Token`);\n }\n // Safe cast due to prior validation\n tokens.push(item as Token);\n }\n\n return tokens;\n}\n","import { encodeAbiParameters, parseAbiParameters } from 'viem';\nimport type { EvmContractCall } from '../types.js';\nimport type { IEvmWalletProvider, EvmRawTransactionReceipt, Hex } from '@sodax/types';\n\n/**\n * ABI-encode an array of ContractCall objects.\n * @param calls An array of ContractCall objects.\n * @returns ABI-encoded bytes representing the array of ContractCall objects.\n */\nexport function encodeContractCalls(calls: EvmContractCall[]): Hex {\n return encodeAbiParameters(parseAbiParameters('(address,uint256,bytes)[]'), [\n calls.map(v => [v.address, v.value, v.data] as const),\n ]);\n}\n\nexport async function waitForTransactionReceipt(\n hash: Hex,\n provider: IEvmWalletProvider,\n): Promise<EvmRawTransactionReceipt> {\n return provider.waitForTransactionReceipt(hash);\n}\n","import type { HttpUrl, IconSpokeChainConfig } from '@sodax/types';\nimport * as IconSdkRaw from 'icon-sdk-js';\nconst IconSdk = ('default' in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nimport type { IconService } from 'icon-sdk-js';\nimport type { IIconWalletProvider } from '@sodax/types';\n\nexport class IconSpokeProvider {\n public readonly walletProvider: IIconWalletProvider;\n public readonly chainConfig: IconSpokeChainConfig;\n public readonly iconService: IconService;\n public readonly debugRpcUrl: HttpUrl;\n\n constructor(\n walletProvider: IIconWalletProvider,\n chainConfig: IconSpokeChainConfig,\n rpcUrl: HttpUrl = 'https://ctz.solidwallet.io/api/v3', // default to mainnet\n debugRpcUrl: HttpUrl = 'https://ctz.solidwallet.io/api/v3d', // default to mainnet\n ) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n this.iconService = new IconSdk.IconService(new IconSdk.IconService.HttpProvider(rpcUrl));\n this.debugRpcUrl = debugRpcUrl;\n }\n}\n","import type { Hex } from 'viem';\n\nexport function getIconAddressBytes(address: string): Hex {\n return `0x${Buffer.from(address.replace('cx', '01').replace('hx', '00') ?? 'f8', 'hex').toString('hex')}`;\n}\n","import { isJsonRpcPayloadResponse, isResponseAddressType, isResponseSigningType, type Result } from '../../../index.js';\nimport type { IconAddress } from '@sodax/types';\n\nexport type IconJsonRpcVersion = '2.0';\n\nexport type HanaWalletRequestEvent =\n | 'REQUEST_HAS_ACCOUNT'\n | 'REQUEST_HAS_ADDRESS'\n | 'REQUEST_ADDRESS'\n | 'REQUEST_JSON'\n | 'REQUEST_SIGNING'\n | 'REQUEST_JSON-RPC';\nexport type HanaWalletResponseEvent =\n | 'RESPONSE_HAS_ACCOUNT'\n | 'RESPONSE_HAS_ADDRESS'\n | 'RESPONSE_ADDRESS'\n | 'RESPONSE_JSON-RPC'\n | 'RESPONSE_SIGNING'\n | 'CANCEL_SIGNING'\n | 'CANCEL_JSON-RPC';\n\nexport type ResponseAddressType = {\n type: 'RESPONSE_ADDRESS';\n payload: IconAddress;\n};\n\nexport type ResponseSigningType = {\n type: 'RESPONSE_SIGNING';\n payload: string;\n};\n\nexport type RelayRequestDetail = {\n type: HanaWalletRequestEvent;\n payload?: {\n jsonrpc: IconJsonRpcVersion;\n method: string;\n params: unknown;\n id: number | undefined;\n };\n};\n\nexport type RelayRequestSigning = {\n type: 'REQUEST_SIGNING';\n payload: {\n from: IconAddress;\n hash: string;\n };\n};\n\nexport type JsonRpcPayloadResponse = {\n id: number;\n result: string; // txHash\n};\n\ninterface RelayResponseEventDetail {\n type: HanaWalletResponseEvent;\n payload: unknown;\n}\n\nexport function requestAddress(): Promise<Result<IconAddress>> {\n return new Promise(resolve => {\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const response = customEvent.detail;\n if (isResponseAddressType(response)) {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n resolve({\n ok: true,\n value: response.payload,\n });\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler, false);\n window.dispatchEvent(\n new CustomEvent<RelayRequestDetail>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_ADDRESS',\n },\n }),\n );\n });\n}\n\nexport function requestSigning(from: IconAddress, hash: string): Promise<Result<string>> {\n return new Promise((resolve, reject) => {\n const signRequest = new CustomEvent<RelayRequestSigning>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_SIGNING',\n payload: {\n from,\n hash,\n },\n },\n });\n\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const response = customEvent.detail;\n if (isResponseSigningType(response)) {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n\n // resolve signature\n resolve({\n ok: true,\n value: response.payload,\n });\n } else if (response.type === 'CANCEL_SIGNING') {\n reject(new Error('CANCEL_SIGNING'));\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.dispatchEvent(signRequest);\n });\n}\n\nexport function requestJsonRpc(rawTransaction: unknown, id = 99999): Promise<Result<JsonRpcPayloadResponse>> {\n return new Promise((resolve, reject) => {\n const eventHandler = (event: Event) => {\n const customEvent = event as CustomEvent<RelayResponseEventDetail>;\n const { type, payload } = customEvent.detail;\n if (type === 'RESPONSE_JSON-RPC') {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n\n if (isJsonRpcPayloadResponse(payload)) {\n resolve({\n ok: true,\n value: payload,\n });\n } else {\n reject(new Error('Invalid payload response type (expected JsonRpcPayloadResponse)'));\n }\n } else if (type === 'CANCEL_JSON-RPC') {\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n reject(new Error('CANCEL_JSON-RPC'));\n }\n };\n\n window.removeEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.addEventListener('ICONEX_RELAY_RESPONSE', eventHandler as EventListener, false);\n window.dispatchEvent(\n new CustomEvent<RelayRequestDetail>('ICONEX_RELAY_REQUEST', {\n detail: {\n type: 'REQUEST_JSON-RPC',\n payload: {\n jsonrpc: '2.0',\n method: 'icx_sendTransaction',\n params: rawTransaction,\n id: id,\n },\n },\n }),\n );\n });\n}\n","import { type Address, type Hex, fromHex } from 'viem';\nimport type { InjectiveReturnType, PromiseInjectiveTxReturnType } from '../../types.js';\nimport type { ISpokeProvider } from '../Providers.js';\nimport type { IInjectiveWalletProvider, InjectiveExecuteResponse, InjectiveSpokeChainConfig } from '@sodax/types';\nimport { toBase64, ChainGrpcWasmApi, TxGrpcApi, fromBase64 } from '@injectivelabs/sdk-ts';\nimport { Network, getNetworkEndpoints } from '@injectivelabs/networks';\n\nexport interface InstantiateMsg {\n connection: string;\n rate_limit: string;\n hub_chain_id: string; // u128 as string\n hub_asset_manager: Uint8Array;\n}\n\nexport interface ConnMsg {\n send_message?: {\n dst_chain_id: number;\n dst_address: Array<number>;\n payload: Array<number>;\n };\n}\n\nexport interface ExecuteMsg {\n transfer?: {\n token: string;\n to: Array<number>;\n amount: string; // should be string for u128 , but in injective it fails in type conversion.\n data: Array<number>;\n };\n recv_message?: {\n src_chain_id: string; // u128 as string\n src_address: Uint8Array;\n conn_sn: string; // u128 as string\n payload: Uint8Array;\n signatures: Uint8Array[];\n };\n set_rate_limit?: {\n rate_limit: string;\n };\n set_connection?: {\n connection: string;\n };\n set_owner?: {\n owner: string;\n };\n}\n\nexport interface QueryMsg {\n get_state: {};\n}\n\nexport interface State {\n connection: string;\n rate_limit: string;\n hub_asset_manager: Uint8Array;\n hub_chain_id: string; // u128 as string\n owner: string;\n}\n\nexport class InjectiveSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: IInjectiveWalletProvider;\n public readonly chainConfig: InjectiveSpokeChainConfig;\n private chainGrpcWasmApi: ChainGrpcWasmApi;\n public readonly txClient: TxGrpcApi;\n\n constructor(conf: InjectiveSpokeChainConfig, walletProvider: IInjectiveWalletProvider) {\n this.chainConfig = conf;\n this.walletProvider = walletProvider;\n const endpoints = getNetworkEndpoints(Network.Mainnet);\n this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);\n this.txClient = new TxGrpcApi(endpoints.grpc);\n }\n\n // Query Methods\n async getState(): Promise<State> {\n return this.chainGrpcWasmApi.fetchSmartContractState(\n this.chainConfig.addresses.assetManager,\n toBase64({\n get_state: {},\n }),\n ) as unknown as Promise<State>;\n }\n\n async getBalance(token: String): Promise<number> {\n const response = await this.chainGrpcWasmApi.fetchSmartContractState(\n this.chainConfig.addresses.assetManager,\n toBase64({\n get_balance: { denom: token },\n }),\n );\n\n return fromBase64(response.data as unknown as string) as unknown as number;\n }\n\n // Execute Methods (requires SigningCosmWasmClient)\n\n /**\n * Deposit tokens including native token to Injective Asset Manager.\n **/\n static async deposit<R extends boolean = false>(\n sender: string,\n token_address: string,\n to: Address,\n amount: string,\n data: Hex = '0x',\n spokeProvider: InjectiveSpokeProvider,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const toBytes = fromHex(to, 'bytes');\n const dataBytes = fromHex(data, 'bytes');\n\n const msg: ExecuteMsg = {\n transfer: {\n token: token_address,\n to: Array.from(toBytes),\n amount: amount,\n data: Array.from(dataBytes),\n },\n };\n\n const funds = [{ amount, denom: token_address }];\n\n if (raw) {\n return (await spokeProvider.walletProvider.getRawTransaction(\n spokeProvider.chainConfig.networkId,\n spokeProvider.chainConfig.prefix,\n sender,\n spokeProvider.chainConfig.addresses.assetManager,\n msg,\n )) as InjectiveReturnType<R>;\n }\n\n const res = await spokeProvider.walletProvider.execute(\n sender as `inj${string}`,\n spokeProvider.chainConfig.addresses.assetManager,\n msg,\n funds,\n );\n return res.transactionHash as InjectiveReturnType<R>;\n }\n\n async receiveMessage(\n senderAddress: string,\n srcChainId: string,\n srcAddress: Uint8Array,\n connSn: string,\n payload: Uint8Array,\n signatures: Uint8Array[],\n ): Promise<InjectiveExecuteResponse> {\n const msg: ExecuteMsg = {\n recv_message: {\n src_chain_id: srcChainId,\n src_address: srcAddress,\n conn_sn: connSn,\n payload,\n signatures,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);\n }\n\n async setRateLimit(senderAddress: string, rateLimit: string): Promise<InjectiveExecuteResponse> {\n const msg: ExecuteMsg = {\n set_rate_limit: {\n rate_limit: rateLimit,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);\n }\n\n async setConnection(senderAddress: string, connection: string): Promise<InjectiveExecuteResponse> {\n const msg: ExecuteMsg = {\n set_connection: {\n connection,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);\n }\n\n async setOwner(senderAddress: string, owner: string): Promise<InjectiveExecuteResponse> {\n const msg: ExecuteMsg = {\n set_owner: {\n owner,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.chainConfig.addresses.assetManager, msg);\n }\n\n async send_message<R extends boolean = false>(\n sender: string,\n dst_chain_id: string,\n dst_address: Hex,\n payload: Hex,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const msg: ConnMsg = {\n send_message: {\n dst_chain_id: Number.parseInt(dst_chain_id),\n dst_address: Array.from(fromHex(dst_address, 'bytes')),\n payload: Array.from(fromHex(payload, 'bytes')),\n },\n };\n if (raw) {\n return (await this.walletProvider.getRawTransaction(\n this.chainConfig.networkId,\n this.chainConfig.prefix,\n sender,\n this.chainConfig.addresses.connection,\n msg,\n )) as InjectiveReturnType<R>;\n }\n const res = await this.walletProvider.execute(sender, this.chainConfig.addresses.connection, msg);\n return res.transactionHash as InjectiveReturnType<R>;\n }\n\n // Helper Methods\n static stringToUint8Array(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n }\n\n static uint8ArrayToString(arr: Uint8Array): string {\n return new TextDecoder().decode(arr);\n }\n\n static toBigIntString(num: number | bigint): string {\n return num.toString();\n }\n}\n","import type { IInjectiveWalletProvider, InjectiveExecuteResponse } from '@sodax/types';\nimport { ChainGrpcWasmApi, toBase64 } from '@injectivelabs/sdk-ts';\nimport { getNetworkEndpoints, Network } from '@injectivelabs/networks';\n\nexport interface InjTokenInfo {\n name: string;\n symbol: string;\n decimals: number;\n total_supply: string;\n}\n\nexport interface Balance {\n balance: string;\n}\n\nexport interface AllowanceResponse {\n allowance: string;\n expires: {\n never?: {};\n at_height?: number;\n at_time?: string;\n };\n}\n\nexport class Injective20Token {\n private walletProvider: IInjectiveWalletProvider;\n private chainGrpcWasmApi: ChainGrpcWasmApi;\n private contractAddress: string;\n\n constructor(walletProvider: IInjectiveWalletProvider, contractAddress: string) {\n this.walletProvider = walletProvider;\n this.contractAddress = contractAddress;\n const endpoints = getNetworkEndpoints(Network.Mainnet);\n this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);\n }\n\n async getTokenInfo(): Promise<InjTokenInfo> {\n return this.chainGrpcWasmApi.fetchSmartContractState(\n this.contractAddress,\n toBase64({\n token_info: {},\n }),\n ) as unknown as Promise<InjTokenInfo>;\n }\n\n async getBalance(address: string): Promise<Balance> {\n return this.chainGrpcWasmApi.fetchSmartContractState(\n this.contractAddress,\n toBase64({\n balance: { address },\n }),\n ) as unknown as Promise<Balance>;\n }\n\n async getAllowance(owner: string, spender: string): Promise<AllowanceResponse> {\n return this.chainGrpcWasmApi.fetchSmartContractState(\n this.contractAddress,\n toBase64({\n allowance: { owner, spender },\n }),\n ) as unknown as Promise<AllowanceResponse>;\n }\n\n // Execute Methods (requires SigningCosmWasmClient)\n async transfer(senderAddress: string, recipientAddress: string, amount: string): Promise<InjectiveExecuteResponse> {\n const msg = {\n transfer: {\n recipient: recipientAddress,\n amount: amount,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.contractAddress, msg);\n }\n\n async increaseAllowance(\n senderAddress: string,\n spenderAddress: string,\n amount: string,\n expires?: { at_height?: number; at_time?: string; never?: {} },\n ): Promise<InjectiveExecuteResponse> {\n const msg = {\n increase_allowance: {\n spender: spenderAddress,\n amount: amount,\n expires,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.contractAddress, msg);\n }\n\n async decreaseAllowance(\n senderAddress: string,\n spenderAddress: string,\n amount: string,\n expires?: { at_height?: number; at_time?: string; never?: {} },\n ): Promise<InjectiveExecuteResponse> {\n const msg = {\n decrease_allowance: {\n spender: spenderAddress,\n amount: amount,\n expires,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.contractAddress, msg);\n }\n\n async transferFrom(\n senderAddress: string,\n ownerAddress: string,\n recipientAddress: string,\n amount: string,\n ): Promise<InjectiveExecuteResponse> {\n const msg = {\n transfer_from: {\n owner: ownerAddress,\n recipient: recipientAddress,\n amount: amount,\n },\n };\n\n return await this.walletProvider.execute(senderAddress, this.contractAddress, msg);\n }\n}\n","import type { ISolanaWalletProvider, SolanaChainConfig } from '@sodax/types';\nimport type { ISpokeProvider } from '../index.js';\n\nexport class SolanaSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: ISolanaWalletProvider;\n public readonly chainConfig: SolanaChainConfig;\n\n constructor(walletProvider: ISolanaWalletProvider, chainConfig: SolanaChainConfig) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n }\n}\n","import { PublicKey, type TransactionInstruction } from '@solana/web3.js';\nimport type { Hex } from 'viem';\nimport {\n SOLANA_MAINNET_CHAIN_ID,\n spokeChainConfig,\n type SolanaChainConfig,\n type SolanaRawTransactionInstruction,\n} from '@sodax/types';\nconst solanaSpokeChainConfig = spokeChainConfig[SOLANA_MAINNET_CHAIN_ID] as SolanaChainConfig;\n\nexport function getSolanaAddressBytes(address: PublicKey): Hex {\n return `0x${Buffer.from(address.toBytes()).toString('hex')}` as Hex;\n}\n\nexport function hexToSolanaAddress(hex: Hex): PublicKey {\n const hexWithoutPrefix = hex.startsWith('0x') ? hex.slice(2) : hex;\n return new PublicKey(Buffer.from(hexWithoutPrefix, 'hex'));\n}\n\nexport function isNative(address: PublicKey): boolean {\n if (address.equals(new PublicKey(solanaSpokeChainConfig.nativeToken))) {\n return true;\n }\n return false;\n}\n\nexport function convertTransactionInstructionToRaw(\n instruction: TransactionInstruction,\n): SolanaRawTransactionInstruction {\n return {\n keys: instruction.keys.map(key => ({\n pubkey: key.pubkey.toBase58(),\n isSigner: key.isSigner,\n isWritable: key.isWritable,\n })),\n programId: instruction.programId.toBase58(),\n data: instruction.data,\n };\n}\n","import {\n type rpc as StellarRpc,\n type FeeBumpTransaction,\n type Memo,\n type MemoType,\n type Operation,\n SorobanRpc,\n type Transaction,\n} from '@stellar/stellar-sdk';\n\nexport class CustomSorobanServer extends SorobanRpc.Server {\n private customHeaders: Record<string, string>;\n\n constructor(serverUrl: string, customHeaders: Record<string, string>) {\n super(serverUrl, {\n allowHttp: true,\n });\n this.customHeaders = customHeaders;\n }\n\n override async getNetwork(): Promise<StellarRpc.Api.GetNetworkResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'getNetwork',\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error getting network! status: ${response.status}`);\n }\n\n return response.json().then(json => json.result);\n }\n\n override async simulateTransaction(\n tx: Transaction<Memo<MemoType>, Operation[]>,\n ): Promise<SorobanRpc.Api.SimulateTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'simulateTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error simulating TX! status: ${response.status}`);\n }\n\n return response.json().then(json => json.result);\n }\n\n override async sendTransaction(\n tx: Transaction | FeeBumpTransaction,\n ): Promise<SorobanRpc.Api.SendTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'sendTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error submitting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n\n override async getTransaction(hash: string): Promise<SorobanRpc.Api.GetTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'getTransaction',\n params: { hash },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error getting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n}\n","import {\n Contract,\n TransactionBuilder,\n BASE_FEE,\n Address,\n rpc as StellarRpc,\n nativeToScVal,\n TimeoutInfinite,\n scValToBigInt,\n Horizon,\n Account,\n type FeeBumpTransaction,\n Operation,\n SorobanRpc,\n type xdr,\n type Transaction,\n} from '@stellar/stellar-sdk';\nimport type { PromiseStellarTxReturnType, StellarReturnType } from '../../types.js';\nimport { toHex, type Hex } from 'viem';\nimport type { ISpokeProvider } from '../Providers.js';\nimport type { IStellarWalletProvider, StellarRpcConfig, StellarSpokeChainConfig } from '@sodax/types';\nimport { STELLAR_DEFAULT_TX_TIMEOUT_SECONDS, STELLAR_PRIORITY_FEE } from '../../constants.js';\nimport { CustomSorobanServer } from './CustomSorobanServer.js';\n\nexport class CustomStellarAccount {\n private readonly accountId: string;\n private sequenceNumber: bigint;\n private readonly startingSequenceNumber: bigint;\n\n constructor({ account_id, sequence }: { account_id: string; sequence: string }) {\n this.accountId = account_id;\n this.sequenceNumber = BigInt(sequence);\n this.startingSequenceNumber = BigInt(sequence);\n }\n\n getSequenceNumber(): bigint {\n return this.sequenceNumber;\n }\n\n getStartingSequenceNumber(): bigint {\n return this.startingSequenceNumber;\n }\n\n getAccountId(): string {\n return this.accountId;\n }\n\n getAccountClone(): Account {\n return new Account(this.accountId, this.sequenceNumber.toString());\n }\n\n incrementSequenceNumber(): void {\n this.sequenceNumber++;\n }\n\n decrementSequenceNumber(): void {\n if (this.sequenceNumber > this.startingSequenceNumber) {\n this.sequenceNumber--;\n }\n\n throw new Error(\n `Sequence number cannot be decremented below the starting sequence number: ${this.startingSequenceNumber}`,\n );\n }\n\n resetSequenceNumber(): void {\n this.sequenceNumber = this.startingSequenceNumber;\n }\n}\n\nexport class StellarSpokeProvider implements ISpokeProvider {\n public readonly server: Horizon.Server;\n public readonly sorobanServer: CustomSorobanServer;\n private readonly contract: Contract;\n public readonly chainConfig: StellarSpokeChainConfig;\n public readonly walletProvider: IStellarWalletProvider;\n\n constructor(walletProvider: IStellarWalletProvider, config: StellarSpokeChainConfig, rpcConfig?: StellarRpcConfig) {\n this.server = new Horizon.Server(\n rpcConfig && rpcConfig.horizonRpcUrl ? rpcConfig.horizonRpcUrl : config.horizonRpcUrl,\n { allowHttp: true },\n );\n this.sorobanServer = new CustomSorobanServer(\n rpcConfig && rpcConfig.sorobanRpcUrl ? rpcConfig.sorobanRpcUrl : config.sorobanRpcUrl,\n {},\n );\n this.walletProvider = walletProvider;\n this.contract = new Contract(config.addresses.assetManager);\n this.chainConfig = config;\n }\n\n async getBalance(tokenAddress: string): Promise<number> {\n const [network, walletAddress] = await Promise.all([\n this.sorobanServer.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n const sourceAccount = await this.sorobanServer.getAccount(walletAddress);\n\n const tx = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(this.contract.call('get_token_balance', nativeToScVal(tokenAddress, { type: 'address' })))\n .setTimeout(TimeoutInfinite)\n .build();\n\n const result = await this.sorobanServer.simulateTransaction(tx);\n\n if (StellarRpc.Api.isSimulationError(result)) {\n throw new Error('Failed to simulate transaction');\n }\n\n const resultValue = result.result;\n\n if (resultValue) {\n return Number(scValToBigInt(resultValue.retval));\n }\n\n throw new Error('result undefined');\n }\n\n public async buildPriorityStellarTransaction(\n account: CustomStellarAccount,\n network: StellarRpc.Api.GetNetworkResponse,\n operation: xdr.Operation<Operation.InvokeHostFunction>,\n ): Promise<[Transaction, StellarRpc.Api.SimulateTransactionResponse]> {\n const simulationForFee = await this.sorobanServer.simulateTransaction(\n new TransactionBuilder(account.getAccountClone(), {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(operation)\n .setTimeout(STELLAR_DEFAULT_TX_TIMEOUT_SECONDS)\n .build(),\n );\n\n if (!StellarRpc.Api.isSimulationSuccess(simulationForFee)) {\n throw new Error(`Simulation error: ${JSON.stringify(simulationForFee)}`);\n }\n\n // note new account info must be loaded because local account sequence increments for every created tx\n const priorityTransaction = new TransactionBuilder(account.getAccountClone(), {\n fee: (\n BigInt(simulationForFee.minResourceFee) +\n BigInt(STELLAR_PRIORITY_FEE) +\n BigInt(BASE_FEE.toString())\n ).toString(),\n networkPassphrase: network.passphrase,\n })\n .addOperation(operation)\n .setTimeout(STELLAR_DEFAULT_TX_TIMEOUT_SECONDS)\n .build();\n\n const simulation = await this.sorobanServer.simulateTransaction(priorityTransaction);\n\n return [priorityTransaction, simulation];\n }\n\n private handleSendTransactionError(\n response: SorobanRpc.Api.SendTransactionResponse,\n ): SorobanRpc.Api.SendTransactionResponse {\n if (response.status === 'ERROR') {\n console.error(JSON.stringify(response, null, 2));\n throw new Error(JSON.stringify(response, null, 2));\n }\n\n return response;\n }\n\n public async signAndSendTransaction(\n tx: Transaction | FeeBumpTransaction,\n waitForTransaction = true,\n ): Promise<string> {\n const signedTransaction = await this.walletProvider.signTransaction(tx.toXDR());\n const signedTx = TransactionBuilder.fromXDR(signedTransaction, tx.networkPassphrase) as Transaction;\n\n const response = this.handleSendTransactionError(await this.sorobanServer.sendTransaction(signedTx));\n\n if (waitForTransaction) {\n return await this.waitForTransaction(response.hash);\n }\n\n return response.hash;\n }\n\n private async waitForTransaction(hash: string, attempts = 60): Promise<string> {\n if (attempts === 0) {\n throw new Error(\n '[StellarSpokeProvider.waitForTransaction] Timeout error. Transaction not found after 5 attempts',\n );\n }\n\n const response = await this.sorobanServer.getTransaction(hash);\n\n if (response.status === StellarRpc.Api.GetTransactionStatus.SUCCESS) {\n return hash;\n }\n if (response.status === StellarRpc.Api.GetTransactionStatus.FAILED) {\n throw response;\n }\n\n // sleep for 1000ms\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n return this.waitForTransaction(hash, attempts - 1);\n }\n\n public async submitOrRestoreAndRetry(\n account: CustomStellarAccount,\n network: StellarRpc.Api.GetNetworkResponse,\n tx: Transaction,\n operation: xdr.Operation<Operation.InvokeHostFunction>,\n simulation?: StellarRpc.Api.SimulateTransactionResponse,\n ): Promise<string> {\n const initialSimulation = simulation ?? (await this.sorobanServer.simulateTransaction(tx));\n\n if (!StellarRpc.Api.isSimulationSuccess(initialSimulation)) {\n throw new Error(\n `[StellarSpokeProvider.submitOrRestoreAndRetry] Simulation Failed: ${JSON.stringify(initialSimulation)}`,\n );\n }\n\n // check if restore is needed\n let restored = false;\n if (StellarRpc.Api.isSimulationRestore(initialSimulation)) {\n try {\n await this.handleSimulationRestore(\n initialSimulation.restorePreamble.minResourceFee,\n initialSimulation.restorePreamble.transactionData.build(),\n account,\n network,\n );\n restored = true;\n } catch (error) {\n throw new Error(\n `[StellarSpokeProvider.submitOrRestoreAndRetry] Simulation Restore Failed: ${JSON.stringify(error)}`,\n );\n }\n }\n\n // if restore is not needed, submit the tx and return the response\n if (!restored) {\n return await this.signAndSendTransaction(tx);\n }\n\n // increment sequence number because restore tx used current sequence number\n const newAccount = account.getAccountClone();\n newAccount.incrementSequenceNumber();\n\n return await this.signAndSendTransaction(\n new TransactionBuilder(newAccount, {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(operation)\n .setTimeout(STELLAR_DEFAULT_TX_TIMEOUT_SECONDS)\n .build(),\n );\n }\n\n private async handleSimulationRestore(\n minResourceFee: string,\n transactionData: xdr.SorobanTransactionData,\n account: CustomStellarAccount,\n network: StellarRpc.Api.GetNetworkResponse,\n ): Promise<string> {\n // Build the restoration operation using the RPC server's hints.\n const totalFee = (BigInt(BASE_FEE) + BigInt(STELLAR_PRIORITY_FEE) + BigInt(minResourceFee)).toString();\n\n return this.signAndSendTransaction(\n new TransactionBuilder(account.getAccountClone(), { fee: totalFee })\n .setNetworkPassphrase(network.passphrase)\n .setSorobanData(transactionData)\n .addOperation(Operation.restoreFootprint({}))\n .setTimeout(STELLAR_DEFAULT_TX_TIMEOUT_SECONDS)\n .build(),\n );\n }\n\n async deposit<R extends boolean = false>(\n token: string,\n amount: string,\n recipient: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n try {\n const [network, walletAddress] = await Promise.all([\n this.sorobanServer.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n\n const accountResponse = await this.server.loadAccount(walletAddress);\n const stellarAccount = new CustomStellarAccount(accountResponse);\n\n const depositCall = this.buildDepositCall(walletAddress, token, amount, recipient, data);\n const [rawPriorityTx, simulation] = await this.buildPriorityStellarTransaction(\n stellarAccount,\n network,\n depositCall,\n );\n const assembledPriorityTx = SorobanRpc.assembleTransaction(rawPriorityTx, simulation).build();\n if (raw) {\n const transactionXdr = rawPriorityTx.toXDR();\n\n return {\n from: walletAddress,\n to: this.chainConfig.addresses.assetManager,\n value: BigInt(amount),\n data: transactionXdr,\n } satisfies StellarReturnType<true> as StellarReturnType<R>;\n }\n\n const hash = await this.submitOrRestoreAndRetry(\n stellarAccount,\n network,\n assembledPriorityTx,\n depositCall,\n simulation,\n );\n\n return `${hash}` as StellarReturnType<R>;\n } catch (error) {\n console.error('Error during deposit:', error);\n throw error;\n }\n }\n\n async sendMessage<R extends boolean = false>(\n dst_chain_id: string,\n dst_address: Uint8Array,\n payload: Uint8Array,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n try {\n const [network, walletAddress] = await Promise.all([\n this.sorobanServer.getNetwork(),\n this.walletProvider.getWalletAddress(),\n ]);\n const accountResponse = await this.server.loadAccount(walletAddress);\n const stellarAccount = new CustomStellarAccount(accountResponse);\n\n const sendMessageCall = this.buildSendMessageCall(walletAddress, dst_chain_id, dst_address, payload);\n\n const [rawPriorityTx, simulation] = await this.buildPriorityStellarTransaction(\n stellarAccount,\n network,\n sendMessageCall,\n );\n\n const assembledPriorityTx = SorobanRpc.assembleTransaction(rawPriorityTx, simulation).build();\n\n if (raw) {\n const transactionXdr = rawPriorityTx.toXDR();\n\n return {\n from: walletAddress,\n to: this.chainConfig.addresses.assetManager,\n value: 0n,\n data: transactionXdr,\n } satisfies StellarReturnType<true> as StellarReturnType<R>;\n }\n\n const hash = await this.submitOrRestoreAndRetry(\n stellarAccount,\n network,\n assembledPriorityTx,\n sendMessageCall,\n simulation,\n );\n\n return `${hash}` as StellarReturnType<R>;\n } catch (error) {\n console.error('Error during sendMessage:', error);\n throw error;\n }\n }\n\n private buildDepositCall(\n walletAddress: string,\n token: string,\n amount: string,\n recipient: Uint8Array,\n data: Uint8Array,\n ): xdr.Operation<Operation.InvokeHostFunction> {\n return this.contract.call(\n 'transfer',\n nativeToScVal(Address.fromString(walletAddress), { type: 'address' }),\n nativeToScVal(Address.fromString(token), {\n type: 'address',\n }),\n nativeToScVal(BigInt(amount), { type: 'u128' }),\n nativeToScVal(Buffer.from(recipient), { type: 'bytes' }),\n nativeToScVal(Buffer.from(data), { type: 'bytes' }),\n );\n }\n\n private buildSendMessageCall(\n walletAddress: string,\n dst_chain_id: string,\n dst_address: Uint8Array,\n payload: Uint8Array,\n ): xdr.Operation<Operation.InvokeHostFunction> {\n const connection = new Contract(this.chainConfig.addresses.connection);\n\n return connection.call(\n 'send_message',\n nativeToScVal(Address.fromString(walletAddress), { type: 'address' }),\n nativeToScVal(dst_chain_id, { type: 'u128' }),\n nativeToScVal(Buffer.from(dst_address), { type: 'bytes' }),\n nativeToScVal(Buffer.from(payload), { type: 'bytes' }),\n );\n }\n\n static getAddressBCSBytes(stellaraddress: string): Hex {\n return `0x${Address.fromString(stellaraddress).toScVal().toXDR('hex')}`;\n }\n\n static getTsWalletBytes(stellaraddress: string): Hex {\n return toHex(Buffer.from(stellaraddress, 'hex'));\n }\n}\n","import { type Address, type Hash, type HttpTransport, type PublicClient, encodeFunctionData } from 'viem';\nimport { vaultTokenAbi } from '../../abis/index.js';\nimport type { EvmContractCall, VaultReserves } from '../../types.js';\nimport type { IEvmWalletProvider, TokenInfo } from '@sodax/types';\n\nexport class EvmVaultTokenService {\n private constructor() {}\n\n /**\n * Fetches token information for a specific token in the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns Token information as a TokenInfo object.\n */\n public static async getTokenInfo(\n vault: Address,\n token: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<TokenInfo> {\n const [decimals, depositFee, withdrawalFee, maxDeposit, isSupported] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'tokenInfo',\n args: [token],\n });\n\n return { decimals, depositFee, withdrawalFee, maxDeposit, isSupported };\n }\n\n /**\n * Retrieves the reserves of the vault.\n * @param vault - The address of the vault.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns An object containing tokens and their balances.\n */\n public static async getVaultReserves(\n vault: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<VaultReserves> {\n const [tokens, balances] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'getVaultReserves',\n args: [],\n });\n\n return {\n tokens,\n balances,\n };\n }\n\n /**\n * Retrieves all token information for the vault.\n * @param vault - The address of the vault.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns A promise that resolves to an object containing tokens, their infos, and reserves.\n */\n async getAllTokenInfo(\n vault: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<{\n tokens: readonly Address[];\n infos: readonly TokenInfo[];\n reserves: readonly bigint[];\n }> {\n const [tokens, infos, reserves] = await publicClient.readContract({\n address: vault,\n abi: vaultTokenAbi,\n functionName: 'getAllTokenInfo',\n args: [],\n });\n\n return {\n tokens,\n infos,\n reserves,\n };\n }\n\n /**\n * Deposits a specified amount of a token into the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to deposit.\n * @param amount - The amount of the token to deposit.\n * @param walletProvider - IEvmWalletProvider\n * @returns Transaction hash\n */\n public static async deposit(\n vault: Address,\n token: Address,\n amount: bigint,\n walletProvider: IEvmWalletProvider,\n ): Promise<Hash> {\n const from = (await walletProvider.getWalletAddress()) as `0x${string}`;\n return walletProvider.sendTransaction({\n from,\n to: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'deposit',\n args: [token, amount],\n }),\n });\n }\n\n /**\n * Withdraws a specified amount of a token from the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to withdraw.\n * @param amount - The amount of the token to withdraw.\n * @param provider - EvmWalletProvider\n * @returns Transaction hash\n */\n public static async withdraw(\n vault: Address,\n token: Address,\n amount: bigint,\n provider: IEvmWalletProvider,\n ): Promise<Hash> {\n const from = (await provider.getWalletAddress()) as `0x${string}`;\n return provider.sendTransaction({\n from,\n to: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'withdraw',\n args: [token, amount],\n }),\n });\n }\n\n /**\n * Encodes the deposit transaction data for the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to deposit.\n * @param amount - The amount of the token to deposit.\n * @returns The encoded contract call data.\n */\n static encodeDeposit(vault: Address, token: Address, amount: bigint): EvmContractCall {\n return {\n address: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'deposit',\n args: [token, amount],\n }),\n };\n }\n\n /**\n * Encodes the withdraw transaction data for the vault.\n * @param vault - The address of the vault.\n * @param token - The address of the token to withdraw.\n * @param amount - The amount of the token to withdraw.\n * @returns The encoded contract call data.\n */\n static encodeWithdraw(vault: Address, token: Address, amount: bigint): EvmContractCall {\n return {\n address: vault,\n value: 0n,\n data: encodeFunctionData({\n abi: vaultTokenAbi,\n functionName: 'withdraw',\n args: [token, amount],\n }),\n };\n }\n\n /**\n * Translates token amounts from their native decimals to 18 decimals\n * @param decimals - The number of decimals of the token\n * @param amount - The amount to translate\n * @returns The translated amount\n */\n public static translateIncomingDecimals(decimals: number, amount: bigint): bigint {\n if (decimals <= 18) {\n return amount * BigInt(10 ** (18 - decimals));\n }\n return amount / BigInt(10 ** (decimals - 18));\n }\n\n /**\n * Translates token amounts from 18 decimals back to their native decimals\n * @param decimals - The number of decimals of the token\n * @param amount - The amount to translate\n * @returns The translated amount\n */\n public static translateOutgoingDecimals(decimals: number, amount: bigint): bigint {\n if (decimals <= 18) {\n return amount / BigInt(10 ** (18 - decimals));\n }\n return amount * BigInt(10 ** (decimals - 18));\n }\n}\n","import { encodeFunctionData, erc20Abi, type Address } from 'viem';\nimport type { EvmContractCall, EvmReturnType, PromiseEvmTxReturnType, Result } from '../../types.js';\nimport type { EvmSpokeProvider, SonicSpokeProvider } from '../../entities/Providers.js';\n\nexport class Erc20Service {\n private constructor() {}\n\n /**\n * Check if spender has enough ERC20 allowance for given amount\n * @param token - ERC20 token address\n * @param amount - Amount to check allowance for\n * @param owner - User wallet address\n * @param spender - Spender address\n * @param spokeProvider - EVM Spoke provider\n * @return - True if spender is allowed to spend amount on behalf of owner\n */\n static async isAllowanceValid(\n token: Address,\n amount: bigint,\n owner: Address,\n spender: Address,\n spokeProvider: EvmSpokeProvider | SonicSpokeProvider,\n ): Promise<Result<boolean>> {\n try {\n if (token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase()) {\n return {\n ok: true,\n value: true,\n };\n }\n\n const allowedAmount = await spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n return {\n ok: true,\n value: allowedAmount >= amount,\n };\n } catch (e) {\n return {\n ok: false,\n error: e,\n };\n }\n }\n\n /**\n * Approve ERC20 amount spending\n * @param token - ERC20 token address\n * @param amount - Amount to approve\n * @param spender - Spender address\n * @param provider - EVM Provider\n */\n static async approve<R extends boolean = false>(\n token: Address,\n amount: bigint,\n spender: Address,\n spokeProvider: EvmSpokeProvider | SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n const rawTx = {\n from: walletAddress,\n to: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spender, amount],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Encodes a transfer transaction for a token.\n * @param token - The address of the token.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @returns The encoded contract call.\n */\n public static encodeTransfer(token: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'transfer',\n args: [to, amount],\n }),\n };\n }\n\n /**\n * Encodes a transferFrom transaction for a token.\n * @param token - The address of the token.\n * @param from - The address to transfer the token from.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @returns The encoded contract call.\n */\n public static encodeTransferFrom(token: Address, from: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'transferFrom',\n args: [from, to, amount],\n }),\n };\n }\n\n /**\n * Encodes an approval transaction for a token.\n * @param token - The address of the token.\n * @param to - The address to approve the token to.\n * @param amount - The amount of the token to approve.\n * @returns The encoded contract call.\n */\n public static encodeApprove(token: Address, to: Address, amount: bigint): EvmContractCall {\n return {\n address: token,\n value: 0n,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [to, amount],\n }),\n };\n }\n}\n","import { type Address, type Hex, type PublicClient, encodeFunctionData } from 'viem';\nimport { assetManagerAbi } from '../../abis/index.js';\nimport type { EvmHubProvider } from '../../entities/Providers.js';\nimport type { EvmContractCall } from '../../types.js';\nimport { encodeContractCalls } from '../../utils/evm-utils.js';\nimport { EvmVaultTokenService } from './EvmVaultTokenService.js';\nimport type { SpokeChainId, AssetInfo } from '@sodax/types';\nimport type { ConfigService } from '../../config/ConfigService.js';\nimport { Erc20Service } from '../erc-20/index.js';\n\nexport type EvmDepositToDataParams = {\n token: Hex | string;\n to: Address;\n amount: bigint;\n};\n\nexport type EvmWithdrawAssetDataParams = {\n token: Hex | string;\n to: Hex; // since spoke chain can be non-evm as well\n amount: bigint;\n};\n\nexport class EvmAssetManagerService {\n private constructor() {}\n\n /**\n * Get asset information for a given asset address\n * @param asset - The address of the asset contract\n * @param assetManager - The address of the asset manager contract\n * @param client - The Viem public client\n * @returns Object containing chainID and spoke address for the asset\n */\n public static async getAssetInfo(asset: Address, assetManager: Address, client: PublicClient): Promise<AssetInfo> {\n const [chainId, spokeAddress] = await client.readContract({\n address: assetManager,\n abi: assetManagerAbi,\n functionName: 'assetInfo',\n args: [asset],\n });\n\n return {\n chainId,\n spokeAddress,\n };\n }\n\n /**\n * Encodes a transfer transaction for an asset.\n * @param token - The address of the token.\n * @param to - The address to transfer the token to.\n * @param amount - The amount of the token to transfer.\n * @param assetManager\n * @returns The encoded contract call.\n */\n public static encodeTransfer(token: Address, to: Address, amount: bigint, assetManager: Address): EvmContractCall {\n return {\n address: assetManager,\n value: 0n,\n data: encodeFunctionData({\n abi: assetManagerAbi,\n functionName: 'transfer',\n args: [token, to, amount, '0x'],\n }),\n };\n }\n\n /**\n * Constructs the data for depositing tokens to the spoke chain.\n * @param {EvmDepositToDataParams} params - The address of the token to deposit.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Hex} Encoded contract calls for the deposit transaction.\n * @throws Will throw an error if the asset or vault address is not found.\n */\n public static depositToData(\n params: EvmDepositToDataParams,\n spokeChainId: SpokeChainId,\n configService: ConfigService,\n ): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = configService.getHubAssetInfo(spokeChainId, params.token);\n\n if (!assetConfig) {\n throw new Error('[depositToData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, params.amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, params.amount);\n calls.push(Erc20Service.encodeTransfer(vaultAddress, params.to, translatedAmount));\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Withdraw tokens from the spoke chain.\n * @param {EvmWithdrawAssetDataParams} params - Parameters for the withdrawal.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Hex} Encoded contract calls for the withdrawal transaction.\n * @throws Will throw an error if the asset address is not found.\n */\n public static withdrawAssetData(\n params: EvmWithdrawAssetDataParams,\n hubProvider: EvmHubProvider,\n spokeChainId: SpokeChainId,\n ): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = hubProvider.configService.getHubAssetInfo(spokeChainId, params.token);\n\n if (!assetConfig) {\n throw new Error('[withdrawAssetData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n params.to,\n params.amount,\n hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Get asset address for a given chain ID and spoke address\n * @param chainId Chain ID where the asset exists\n * @param spokeAddress Address of the asset on the spoke chain\n * @param assetManager Address of the asset manager contract\n * @param client The Viem public client\n * @returns The asset's address on the hub chain\n */\n async getAssetAddress(\n chainId: bigint,\n spokeAddress: Address,\n assetManager: Address,\n client: PublicClient,\n ): Promise<Address> {\n return client.readContract({\n address: assetManager,\n abi: assetManagerAbi,\n functionName: 'assets',\n args: [chainId, spokeAddress],\n });\n }\n}\n","import type { Address } from 'viem';\nimport { walletFactoryAbi } from '../../abis/index.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { type SpokeChainId, getIntentRelayChainId, type Hex } from '@sodax/types';\n\nexport class EvmWalletAbstraction {\n private constructor() {}\n\n /**\n * Get the hub wallet address for a given spoke chain and address.\n * @param chainId - The spoke chain ID.\n * @param address - The address on the spoke chain.\n * @param hubProvider - The hub provider.\n * @returns The hub wallet address.\n */\n public static async getUserHubWalletAddress(\n chainId: SpokeChainId,\n address: Hex,\n hubProvider: EvmHubProvider,\n ): Promise<Address> {\n return hubProvider.publicClient.readContract({\n address: hubProvider.chainConfig.addresses.hubWallet,\n abi: walletFactoryAbi,\n functionName: 'getDeployedAddress',\n args: [BigInt(getIntentRelayChainId(chainId)), address],\n });\n }\n}\n","import { type Address, type Hex, fromHex, toHex } from 'viem';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport type { SuiSpokeProvider } from '../../entities/sui/SuiSpokeProvider.js';\nimport {\n type DepositSimulationParams,\n type PromiseSuiTxReturnType,\n type SuiGasEstimate,\n encodeAddress,\n type SuiRawTransaction,\n} from '../../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { getIntentRelayChainId, type HubAddress } from '@sodax/types';\n\nexport type SuiSpokeDepositParams = {\n from: Hex; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type SuiTransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class SuiSpokeService {\n private constructor() {}\n\n /**\n * Estimate the gas for a transaction.\n * @param {SuiRawTransaction} rawTx - The raw transaction to estimate the gas for.\n * @param {SuiSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The estimated computation cost.\n */\n public static async estimateGas(rawTx: SuiRawTransaction, spokeProvider: SuiSpokeProvider): Promise<SuiGasEstimate> {\n const txb = Transaction.fromKind(rawTx.data);\n const result = await spokeProvider.publicClient.devInspectTransactionBlock({\n sender: rawTx.from,\n transactionBlock: txb,\n });\n\n return result.effects.gasUsed;\n }\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {InjectiveSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n public static async deposit<R extends boolean = false>(\n params: SuiSpokeDepositParams,\n spokeProvider: SuiSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return SuiSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SuiSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: string, spokeProvider: SuiSpokeProvider): Promise<bigint> {\n return spokeProvider.getBalance(token);\n }\n\n /**\n * Generate simulation parameters for deposit from SuiSpokeDepositParams.\n * @param {SuiSpokeDepositParams} params - The deposit parameters.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: SuiSpokeDepositParams,\n spokeProvider: SuiSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n const encoder = new TextEncoder();\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: toHex(encoder.encode(params.token)),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: toHex(encoder.encode(spokeProvider.chainConfig.addresses.originalAssetManager)),\n };\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the spoke chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: SuiSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return SuiSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Fetch the asset manager config from the spoke chain.\n * @param {SuiSpokeProvider} suiSpokeProvider - The spoke provider.\n * @returns {Promise<string>} The asset manager config.\n */\n public static async fetchAssetManagerAddress(suiSpokeProvider: SuiSpokeProvider): Promise<string> {\n const latestPackageId = await SuiSpokeService.fetchLatestAssetManagerPackageId(suiSpokeProvider);\n\n return `${latestPackageId}::asset_manager::${suiSpokeProvider.chainConfig.addresses.assetManagerConfigId}`;\n }\n\n /**\n * Fetch the latest asset manager package id from the spoke chain.\n * @param {SuiSpokeProvider} suiSpokeProvider - The spoke provider.\n * @returns {Promise<string>} The latest asset manager package id.\n */\n public static async fetchLatestAssetManagerPackageId(suiSpokeProvider: SuiSpokeProvider): Promise<string> {\n const configData = await suiSpokeProvider.publicClient.getObject({\n id: suiSpokeProvider.chainConfig.addresses.assetManagerConfigId,\n options: {\n showContent: true,\n },\n });\n\n if (configData.error) {\n throw new Error(`Failed to fetch asset manager id. Details: ${JSON.stringify(configData.error)}`);\n }\n\n if (!configData.data) {\n throw new Error('Asset manager id not found (no data)');\n }\n\n if (configData.data.content?.dataType !== 'moveObject') {\n throw new Error('Asset manager id not found (not a move object)');\n }\n\n if (!('latest_package_id' in configData.data.content.fields)) {\n throw new Error('Asset manager id not found (no latest package id)');\n }\n\n const latestPackageId = configData.data.content.fields['latest_package_id'];\n\n if (typeof latestPackageId !== 'string') {\n throw new Error('Asset manager id invalid (latest package id is not a string)');\n }\n\n if (!latestPackageId) {\n throw new Error('Asset manager id not found (no latest package id)');\n }\n\n return latestPackageId.toString();\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {SuiTransferToHubParams} params - The parameters for the transfer, including:\n * - {string} token: The address of the token to transfer (use address(0) for native token).\n * - {Uint8Array} recipient: The recipient address on the hub chain.\n * - {string} amount: The amount to transfer.\n * - {Uint8Array} [data=new Uint8Array([])]: Additional data for the transfer.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: SuiTransferToHubParams,\n spokeProvider: SuiSpokeProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n return spokeProvider.transfer(token, amount, fromHex(recipient, 'bytes'), fromHex(data, 'bytes'), raw);\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {HubAddress} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {SuiSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseSuiTxReturnType<R>} A promise that resolves to the transaction hash or raw transaction base64 string.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: SuiSpokeProvider,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n return spokeProvider.sendMessage(dstChainId, fromHex(dstAddress, 'bytes'), fromHex(payload, 'bytes'), raw);\n }\n}\n","import { bcs } from '@mysten/sui/bcs';\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client';\nimport { Transaction, type TransactionResult } from '@mysten/sui/transactions';\nimport { type Hex, toHex } from 'viem';\nimport type { PromiseSuiTxReturnType, SuiReturnType } from '../../types.js';\nimport type { ISpokeProvider } from '../index.js';\nimport type { ISuiWalletProvider, SuiSpokeChainConfig } from '@sodax/types';\nimport { SuiSpokeService } from '../../services/spoke/SuiSpokeService.js';\n\ntype SuiNativeCoinResult = { $kind: 'NestedResult'; NestedResult: [number, number] };\ntype SuiTxObject = { $kind: 'Input'; Input: number; type?: 'object' | undefined };\nexport class SuiSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: ISuiWalletProvider;\n public chainConfig: SuiSpokeChainConfig;\n public readonly publicClient: SuiClient;\n private assetManagerAddress: string | undefined;\n\n constructor(config: SuiSpokeChainConfig, wallet_provider: ISuiWalletProvider) {\n this.chainConfig = config;\n this.walletProvider = wallet_provider;\n this.publicClient = new SuiClient({ url: getFullnodeUrl('mainnet') });\n }\n\n async getBalance(token: string): Promise<bigint> {\n const assetmanager = this.splitAddress(await this.getAssetManagerAddress());\n const tx = new Transaction();\n const result = await this.walletProvider.viewContract(\n tx,\n assetmanager.packageId,\n assetmanager.moduleId,\n 'get_token_balance',\n [tx.object(assetmanager.stateId)],\n [token],\n );\n if (\n !Array.isArray(result?.returnValues) ||\n !Array.isArray(result.returnValues[0]) ||\n result.returnValues[0][0] === undefined\n ) {\n throw new Error('Failed to get Balance');\n }\n const val: number[] = result.returnValues[0][0];\n const str_u64 = bcs.U64.parse(Uint8Array.from(val));\n return BigInt(str_u64);\n }\n\n async transfer<R extends boolean = false>(\n token: string,\n amount: bigint,\n to: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const isNative = token.toLowerCase() === this.chainConfig.nativeToken.toLowerCase();\n const tx = new Transaction();\n const walletAddress = await this.walletProvider.getWalletAddress();\n const coin: TransactionResult | SuiNativeCoinResult | SuiTxObject = isNative\n ? await this.getNativeCoin(tx, amount)\n : await this.getCoin(tx, token, amount, walletAddress);\n const connection = this.splitAddress(this.chainConfig.addresses.connection);\n const assetManager = this.splitAddress(await this.getAssetManagerAddress());\n\n // Call transfer function\n tx.moveCall({\n target: `${assetManager.packageId}::${assetManager.moduleId}::transfer`,\n typeArguments: [token],\n arguments: [\n tx.object(assetManager.stateId),\n tx.object(connection.stateId), // Connection state object\n coin,\n tx.pure(bcs.vector(bcs.u8()).serialize(to)),\n tx.pure(bcs.vector(bcs.u8()).serialize(data)),\n ],\n });\n\n if (raw) {\n tx.setSender(walletAddress);\n const transactionRaw = await tx.build({\n client: this.publicClient,\n onlyTransactionKind: true,\n });\n\n const transactionRawBase64String = Buffer.from(transactionRaw).toString('base64');\n\n return {\n from: walletAddress,\n to: `${assetManager.packageId}::${assetManager.moduleId}::transfer`,\n value: amount,\n data: transactionRawBase64String,\n } as SuiReturnType<R>;\n }\n // Execute transaction\n return this.walletProvider.signAndExecuteTxn(tx) as PromiseSuiTxReturnType<R>;\n }\n\n public async getNativeCoin(tx: Transaction, amount: bigint): Promise<SuiNativeCoinResult> {\n const coin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])[0];\n\n if (coin === undefined) {\n return Promise.reject(Error('[SuiIntentService.getNativeCoin] coin undefined'));\n }\n\n return coin;\n }\n\n public async getCoin(\n tx: Transaction,\n coin: string,\n amount: bigint,\n address: string,\n ): Promise<TransactionResult | SuiTxObject> {\n const coins = await this.walletProvider.getCoins(address, coin);\n\n const objects: string[] = [];\n let totalAmount = BigInt(0);\n\n for (const coin of coins.data) {\n totalAmount += BigInt(coin.balance);\n objects.push(coin.coinObjectId);\n\n if (totalAmount >= amount) {\n break;\n }\n }\n\n const firstObject = objects[0];\n\n if (!firstObject) {\n throw new Error(`[SuiIntentService.getCoin] Coin=${coin} not found for address=${address} and amount=${amount}`);\n }\n\n if (objects.length > 1) {\n tx.mergeCoins(firstObject, objects.slice(1));\n }\n\n if (totalAmount === amount) {\n return tx.object(firstObject);\n }\n\n return tx.splitCoins(firstObject, [amount]);\n }\n\n splitAddress(address: string): { packageId: string; moduleId: string; stateId: string } {\n const parts = address.split('::');\n if (parts.length === 3) {\n if (parts[0] && parts[1] && parts[2]) {\n return { packageId: parts[0], moduleId: parts[1], stateId: parts[2] };\n }\n throw new Error('Invalid package address');\n }\n throw new Error('Invalid package address');\n }\n\n async sendMessage<R extends boolean = false>(\n dst_chain_id: bigint,\n dst_address: Uint8Array,\n data: Uint8Array,\n raw?: R,\n ): PromiseSuiTxReturnType<R> {\n const txb = new Transaction();\n const connection = this.splitAddress(this.chainConfig.addresses.connection);\n // Perform send message transaction\n txb.moveCall({\n target: `${connection.packageId}::${connection.moduleId}::send_message_ua`,\n arguments: [\n txb.object(connection.stateId),\n txb.pure.u256(dst_chain_id),\n txb.pure(bcs.vector(bcs.u8()).serialize(dst_address)),\n txb.pure(bcs.vector(bcs.u8()).serialize(data)),\n ],\n });\n const walletAddress = await this.walletProvider.getWalletAddress();\n if (raw) {\n txb.setSender(walletAddress);\n const transactionRaw = await txb.build({\n client: this.publicClient,\n onlyTransactionKind: true,\n });\n const transactionRawBase64String = Buffer.from(transactionRaw).toString('base64');\n\n return {\n from: walletAddress,\n to: `${connection.packageId}::${connection.moduleId}::send_message_ua`,\n value: 0n,\n data: transactionRawBase64String,\n } as SuiReturnType<R>;\n }\n\n return this.walletProvider.signAndExecuteTxn(txb) as PromiseSuiTxReturnType<R>;\n }\n\n async configureAssetManagerHub(hubNetworkId: number, hubAssetManager: Uint8Array): Promise<string> {\n const tx = new Transaction();\n const assetmanager = this.splitAddress(await this.getAssetManagerAddress());\n\n tx.moveCall({\n target: `${assetmanager.packageId}::${assetmanager.moduleId}::set_hub_details`,\n arguments: [tx.object(assetmanager.stateId), tx.pure.u64(hubNetworkId), tx.pure.vector('u8', hubAssetManager)],\n });\n\n const result = await this.walletProvider.signAndExecuteTxn(tx);\n return result;\n }\n\n async getWalletAddress(): Promise<string> {\n return this.walletProvider.getWalletAddress();\n }\n\n static getAddressBCSBytes(suiaddress: string): Hex {\n return toHex(bcs.Address.serialize(suiaddress).toBytes());\n }\n\n async getAssetManagerAddress(): Promise<string> {\n if (!this.assetManagerAddress) {\n this.assetManagerAddress = await SuiSpokeService.fetchAssetManagerAddress(this);\n }\n return this.assetManagerAddress.toString();\n }\n}\n","import { BigNumber } from 'bignumber.js';\n\nexport type BigNumberValue = string | number | BigNumber;\n\nexport const BigNumberZeroDecimal = BigNumber.clone({\n DECIMAL_PLACES: 0,\n ROUNDING_MODE: BigNumber.ROUND_DOWN,\n});\n\nexport function valueToBigNumber(amount: BigNumberValue): BigNumber {\n if (amount instanceof BigNumber) {\n return amount;\n }\n\n return new BigNumber(amount);\n}\n\nexport function valueToZDBigNumber(amount: BigNumberValue): BigNumber {\n return new BigNumberZeroDecimal(amount);\n}\n\nexport function normalize(n: BigNumberValue, decimals: number): string {\n return normalizeBN(n, decimals).toString(10);\n}\n\nexport function normalizeBN(n: BigNumberValue, decimals: number): BigNumber {\n return valueToBigNumber(n).shiftedBy(decimals * -1);\n}\n","import { valueToBigNumber } from './bignumber.js';\n\nexport const SECONDS_PER_YEAR = valueToBigNumber('31536000');\nexport const USD_DECIMALS = 8;\nexport const WEI_DECIMALS = 18;\nexport const RAY_DECIMALS = 27;\nexport const LTV_PRECISION = 4;\n","import type BigNumber from 'bignumber.js';\nimport { type BigNumberValue, valueToZDBigNumber } from './bignumber.js';\n\nexport const WAD = valueToZDBigNumber(10).pow(18);\nexport const HALF_WAD = WAD.dividedBy(2);\n\nexport const RAY = valueToZDBigNumber(10).pow(27);\nexport const HALF_RAY = RAY.dividedBy(2);\n\nexport const WAD_RAY_RATIO = valueToZDBigNumber(10).pow(9);\n\nexport function rayMul(a: BigNumberValue, b: BigNumberValue): BigNumber {\n return HALF_RAY.plus(valueToZDBigNumber(a).multipliedBy(b)).div(RAY);\n}\n\nexport function rayDiv(a: BigNumberValue, b: BigNumberValue): BigNumber {\n const halfB = valueToZDBigNumber(b).div(2);\n\n return halfB.plus(valueToZDBigNumber(a).multipliedBy(RAY)).div(b);\n}\n\nexport function rayToWad(a: BigNumberValue): BigNumber {\n const halfRatio = valueToZDBigNumber(WAD_RAY_RATIO).div(2);\n\n return halfRatio.plus(a).div(WAD_RAY_RATIO);\n}\n\nexport function wadToRay(a: BigNumberValue): BigNumber {\n return valueToZDBigNumber(a).multipliedBy(WAD_RAY_RATIO).decimalPlaces(0);\n}\n\nexport function rayPow(a: BigNumberValue, p: BigNumberValue): BigNumber {\n let x = valueToZDBigNumber(a);\n let n = valueToZDBigNumber(p);\n let z = n.modulo(2).eq(0) ? valueToZDBigNumber(RAY) : x;\n\n for (n = n.div(2); !n.eq(0); n = n.div(2)) {\n x = rayMul(x, x);\n\n if (!n.modulo(2).eq(0)) {\n z = rayMul(z, x);\n }\n }\n\n return z;\n}\n\n/**\n * RayPow is slow and gas intensive therefore in v2 we switched to binomial approximation on the contract level.\n * While the results ar not exact to the last decimal, they are close enough.\n */\nexport function binomialApproximatedRayPow(a: BigNumberValue, p: BigNumberValue): BigNumber {\n const base = valueToZDBigNumber(a);\n const exp = valueToZDBigNumber(p);\n if (exp.eq(0)) return RAY;\n const expMinusOne = exp.minus(1);\n const expMinusTwo = exp.gt(2) ? exp.minus(2) : 0;\n\n const basePowerTwo = rayMul(base, base);\n const basePowerThree = rayMul(basePowerTwo, base);\n\n const firstTerm = exp.multipliedBy(base);\n const secondTerm = exp.multipliedBy(expMinusOne).multipliedBy(basePowerTwo).div(2);\n const thirdTerm = exp.multipliedBy(expMinusOne).multipliedBy(expMinusTwo).multipliedBy(basePowerThree).div(6);\n\n return RAY.plus(firstTerm).plus(secondTerm).plus(thirdTerm);\n}\n","import BigNumber from 'bignumber.js';\nimport { type BigNumberValue, valueToBigNumber, valueToZDBigNumber } from './bignumber.js';\nimport { SECONDS_PER_YEAR, LTV_PRECISION } from './constants.js';\nimport * as RayMath from './ray.math.js';\n\ninterface CalculateCompoundedInterestRequest {\n rate: BigNumberValue;\n currentTimestamp: number;\n lastUpdateTimestamp: number;\n}\n\nexport function calculateCompoundedInterest({\n rate,\n currentTimestamp,\n lastUpdateTimestamp,\n}: CalculateCompoundedInterestRequest): BigNumber {\n const timeDelta = valueToZDBigNumber(currentTimestamp - lastUpdateTimestamp);\n const ratePerSecond = valueToZDBigNumber(rate).dividedBy(SECONDS_PER_YEAR);\n return RayMath.binomialApproximatedRayPow(ratePerSecond, timeDelta);\n}\n\ninterface CompoundedBalanceRequest {\n principalBalance: BigNumberValue;\n reserveIndex: BigNumberValue;\n reserveRate: BigNumberValue;\n lastUpdateTimestamp: number;\n currentTimestamp: number;\n}\n\nexport function getCompoundedBalance({\n principalBalance: _principalBalance,\n reserveIndex,\n reserveRate,\n lastUpdateTimestamp,\n currentTimestamp,\n}: CompoundedBalanceRequest): BigNumber {\n const principalBalance = valueToZDBigNumber(_principalBalance);\n if (principalBalance.eq('0')) {\n return principalBalance;\n }\n\n const compoundedInterest = calculateCompoundedInterest({\n rate: reserveRate,\n currentTimestamp,\n lastUpdateTimestamp,\n });\n const cumulatedInterest = RayMath.rayMul(compoundedInterest, reserveIndex);\n const principalBalanceRay = RayMath.wadToRay(principalBalance);\n\n return RayMath.rayToWad(RayMath.rayMul(principalBalanceRay, cumulatedInterest));\n}\n\ninterface LinearInterestRequest {\n rate: BigNumberValue;\n currentTimestamp: number;\n lastUpdateTimestamp: number;\n}\n\nexport function calculateLinearInterest({\n rate,\n currentTimestamp,\n lastUpdateTimestamp,\n}: LinearInterestRequest): BigNumber {\n const timeDelta = RayMath.wadToRay(valueToZDBigNumber(currentTimestamp - lastUpdateTimestamp));\n const timeDeltaInSeconds = RayMath.rayDiv(timeDelta, RayMath.wadToRay(SECONDS_PER_YEAR));\n const a = RayMath.rayMul(rate, timeDeltaInSeconds).plus(RayMath.RAY);\n return a;\n}\n\ninterface ReserveNormalizedIncomeRequest {\n rate: BigNumberValue;\n index: BigNumberValue;\n lastUpdateTimestamp: number;\n currentTimestamp: number;\n}\nexport function getReserveNormalizedIncome({\n rate,\n index,\n lastUpdateTimestamp,\n currentTimestamp,\n}: ReserveNormalizedIncomeRequest): BigNumber {\n if (valueToZDBigNumber(rate).eq('0')) {\n return valueToZDBigNumber(index);\n }\n\n const cumulatedInterest = calculateLinearInterest({\n rate,\n currentTimestamp,\n lastUpdateTimestamp,\n });\n\n return RayMath.rayMul(cumulatedInterest, index);\n}\n\ninterface LinearBalanceRequest {\n balance: BigNumberValue;\n index: BigNumberValue;\n rate: BigNumberValue;\n lastUpdateTimestamp: number;\n currentTimestamp: number;\n}\nexport function getLinearBalance({\n balance,\n index,\n rate,\n lastUpdateTimestamp,\n currentTimestamp,\n}: LinearBalanceRequest) {\n return RayMath.rayToWad(\n RayMath.rayMul(\n RayMath.wadToRay(balance),\n getReserveNormalizedIncome({\n rate,\n index,\n lastUpdateTimestamp,\n currentTimestamp,\n }),\n ),\n );\n}\n\ninterface HealthFactorFromBalanceRequest {\n collateralBalanceMarketReferenceCurrency: BigNumberValue;\n borrowBalanceMarketReferenceCurrency: BigNumberValue;\n currentLiquidationThreshold: BigNumberValue;\n}\n\nexport function calculateHealthFactorFromBalances({\n borrowBalanceMarketReferenceCurrency,\n collateralBalanceMarketReferenceCurrency,\n currentLiquidationThreshold,\n}: HealthFactorFromBalanceRequest): BigNumber {\n if (valueToBigNumber(borrowBalanceMarketReferenceCurrency).eq(0)) {\n return valueToBigNumber('-1'); // Invalid number\n }\n\n return valueToBigNumber(collateralBalanceMarketReferenceCurrency)\n .multipliedBy(currentLiquidationThreshold)\n .shiftedBy(LTV_PRECISION * -1)\n .div(borrowBalanceMarketReferenceCurrency);\n}\n\ninterface HealthFactorFromBalanceBigUnitsRequest {\n collateralBalanceMarketReferenceCurrency: BigNumberValue;\n borrowBalanceMarketReferenceCurrency: BigNumberValue;\n currentLiquidationThreshold: BigNumberValue;\n}\nexport function calculateHealthFactorFromBalancesBigUnits({\n collateralBalanceMarketReferenceCurrency,\n borrowBalanceMarketReferenceCurrency,\n currentLiquidationThreshold,\n}: HealthFactorFromBalanceBigUnitsRequest): BigNumber {\n return calculateHealthFactorFromBalances({\n collateralBalanceMarketReferenceCurrency,\n borrowBalanceMarketReferenceCurrency,\n currentLiquidationThreshold: valueToBigNumber(currentLiquidationThreshold)\n .shiftedBy(LTV_PRECISION)\n .decimalPlaces(0, BigNumber.ROUND_DOWN),\n });\n}\n\ninterface AvailableBorrowsMarketReferenceCurrencyRequest {\n collateralBalanceMarketReferenceCurrency: BigNumberValue;\n borrowBalanceMarketReferenceCurrency: BigNumberValue;\n currentLtv: BigNumberValue;\n}\n\nexport function calculateAvailableBorrowsMarketReferenceCurrency({\n collateralBalanceMarketReferenceCurrency,\n borrowBalanceMarketReferenceCurrency,\n currentLtv,\n}: AvailableBorrowsMarketReferenceCurrencyRequest): BigNumber {\n if (valueToZDBigNumber(currentLtv).eq(0)) {\n return valueToZDBigNumber('0');\n }\n\n const availableBorrowsMarketReferenceCurrency = valueToZDBigNumber(collateralBalanceMarketReferenceCurrency)\n .multipliedBy(currentLtv)\n .shiftedBy(LTV_PRECISION * -1)\n .minus(borrowBalanceMarketReferenceCurrency);\n return availableBorrowsMarketReferenceCurrency.gt('0')\n ? availableBorrowsMarketReferenceCurrency\n : valueToZDBigNumber('0');\n}\n\ninterface MarketReferenceCurrencyAndUsdBalanceRequest {\n balance: BigNumberValue;\n priceInMarketReferenceCurrency: BigNumberValue;\n marketReferenceCurrencyDecimals: number;\n decimals: number;\n marketReferencePriceInUsdNormalized: BigNumberValue;\n}\n\ninterface MarketReferenceAndUsdBalanceResponse {\n marketReferenceCurrencyBalance: BigNumber;\n usdBalance: BigNumber;\n}\n/**\n * @returns non humanized/normalized values for usd/marketReference\n */\nexport function getMarketReferenceCurrencyAndUsdBalance({\n balance,\n priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n decimals,\n marketReferencePriceInUsdNormalized,\n}: MarketReferenceCurrencyAndUsdBalanceRequest): MarketReferenceAndUsdBalanceResponse {\n const marketReferenceCurrencyBalance = valueToZDBigNumber(balance)\n .multipliedBy(priceInMarketReferenceCurrency)\n .shiftedBy(decimals * -1);\n const usdBalance = marketReferenceCurrencyBalance\n .multipliedBy(marketReferencePriceInUsdNormalized)\n .shiftedBy(marketReferenceCurrencyDecimals * -1);\n return { marketReferenceCurrencyBalance, usdBalance };\n}\n","import type BigNumber from 'bignumber.js';\nimport { valueToZDBigNumber } from '../../bignumber.js';\nimport { SECONDS_PER_YEAR } from '../../constants.js';\nimport { RAY, rayPow } from '../../ray.math.js';\nimport type { CalculateCompoundedRateRequest } from './types.js';\n\nexport function calculateCompoundedRate({ rate, duration }: CalculateCompoundedRateRequest): BigNumber {\n return rayPow(valueToZDBigNumber(rate).dividedBy(SECONDS_PER_YEAR).plus(RAY), duration).minus(RAY);\n}\n","import { normalize, valueToBigNumber } from '../../bignumber.js';\nimport { LTV_PRECISION } from '../../constants.js';\n\ninterface EModeCategoryData {\n ltv: string;\n liquidationThreshold: string;\n liquidationBonus: string;\n collateralBitmap: string;\n label: string;\n borrowableBitmap: string;\n}\n\ninterface FormattedEModeCategory extends EModeCategoryData {\n formattedLtv: string;\n formattedLiquidationThreshold: string;\n formattedLiquidationBonus: string;\n}\n\nexport interface EModeDataString {\n id: number;\n eMode: EModeCategoryData;\n}\n\nexport function formatEModeCategory(eModeCategory: EModeCategoryData): FormattedEModeCategory {\n return {\n ...eModeCategory,\n formattedLtv: normalize(eModeCategory.ltv, LTV_PRECISION),\n formattedLiquidationThreshold: normalize(eModeCategory.liquidationThreshold, LTV_PRECISION),\n formattedLiquidationBonus: normalize(\n valueToBigNumber(eModeCategory.liquidationBonus).minus(10 ** LTV_PRECISION),\n 4,\n ),\n };\n}\n\nexport function formatEModes(eModes: EModeDataString[]) {\n return eModes.map(eMode => ({\n ...eMode,\n eMode: formatEModeCategory(eMode.eMode),\n }));\n}\n\nexport interface ReserveEMode extends EModeDataString {\n collateralEnabled: boolean;\n borrowingEnabled: boolean;\n}\n\nexport function getReservesEModes(reserveId: number, eModes: EModeDataString[]): ReserveEMode[] {\n return eModes.reduce<ReserveEMode[]>((acc, eMode) => {\n const { borrowableBitmap, collateralBitmap } = eMode.eMode;\n const borrowingEnabled = borrowableBitmap[borrowableBitmap.length - reserveId - 1] === '1';\n const collateralEnabled = collateralBitmap[collateralBitmap.length - reserveId - 1] === '1';\n if (borrowingEnabled || collateralEnabled) {\n acc.push({\n id: eMode.id,\n collateralEnabled,\n borrowingEnabled,\n eMode: eMode.eMode,\n });\n }\n\n return acc;\n }, []);\n}\n\nexport interface FormattedReserveEMode extends Omit<ReserveEMode, 'eMode'> {\n eMode: FormattedEModeCategory;\n}\n\nexport function getAndFormatReserveEModes(reserveId: number, eModes: EModeDataString[]): FormattedReserveEMode[] {\n return getReservesEModes(reserveId, eModes).map(eMode => ({\n ...eMode,\n eMode: formatEModeCategory(eMode.eMode),\n }));\n}\n","import BigNumber from 'bignumber.js';\n\nexport interface CalculateAccruedIncentivesRequest {\n principalUserBalance: BigNumber; // principal deposit or borrow amount\n reserveIndex: BigNumber; // tracks the interest earned by a reserve\n userIndex: BigNumber; // tracks the interest earned by a user from a particular reserve\n precision: number; // decimal precision of rewards calculation\n reserveIndexTimestamp: number; // timestamp of last protocol interaction\n emissionPerSecond: BigNumber;\n totalSupply: BigNumber; // total deposits or borrows of a reserve\n currentTimestamp: number;\n emissionEndTimestamp: number;\n}\n\n// Calculate incentives earned by user since reserveIndexTimestamp\n// Incentives earned before reserveIndexTimestamp are tracked separately (userUnclaimedRewards from UiIncentiveDataProvider)\n// This function is used for deposit and variableDebt incentives\nexport function calculateAccruedIncentives({\n principalUserBalance,\n reserveIndex,\n userIndex,\n precision,\n reserveIndexTimestamp,\n emissionPerSecond,\n totalSupply,\n currentTimestamp,\n emissionEndTimestamp,\n}: CalculateAccruedIncentivesRequest): BigNumber {\n if (totalSupply.isEqualTo(new BigNumber(0))) {\n return new BigNumber(0);\n }\n\n const actualCurrentTimestamp = currentTimestamp > emissionEndTimestamp ? emissionEndTimestamp : currentTimestamp;\n\n const timeDelta = actualCurrentTimestamp - reserveIndexTimestamp;\n\n let currentReserveIndex: BigNumber;\n if (reserveIndexTimestamp >= Number(currentTimestamp) || reserveIndexTimestamp >= emissionEndTimestamp) {\n currentReserveIndex = reserveIndex;\n } else {\n currentReserveIndex = emissionPerSecond\n .multipliedBy(timeDelta)\n .shiftedBy(precision)\n .dividedBy(totalSupply)\n .plus(reserveIndex);\n }\n\n const reward = principalUserBalance.multipliedBy(currentReserveIndex.minus(userIndex)).shiftedBy(precision * -1);\n\n return reward;\n}\n","import BigNumber from 'bignumber.js';\nimport { normalize } from '../../bignumber.js';\nimport { rayDiv } from '../../ray.math.js';\nimport { calculateAccruedIncentives } from './calculate-accrued-incentives.js';\nimport type {\n ReservesIncentiveDataHumanized,\n UserReservesIncentivesDataHumanized,\n UserReserveCalculationData,\n} from './types.js';\n\nexport interface CalculateUserReserveIncentivesRequest {\n reserveIncentives: ReservesIncentiveDataHumanized; // token incentive data, from UiIncentiveDataProvider\n userIncentives: UserReservesIncentivesDataHumanized; // user incentive data, from UiIncentiveDataProvider\n currentTimestamp: number;\n userReserveData?: UserReserveCalculationData; // optional to account for case that user no longer has the supply or borrow position but still has unclaimed rewards\n}\n\nexport interface UserReserveIncentive {\n tokenAddress: string;\n incentiveController: string;\n rewardTokenAddress: string;\n rewardTokenSymbol: string;\n rewardTokenDecimals: number;\n accruedRewards: BigNumber;\n unclaimedRewards: BigNumber;\n rewardPriceFeed: string;\n}\n\n// Calculate user supply and borrow incentives for an individual reserve asset\nexport function calculateUserReserveIncentives({\n reserveIncentives,\n userIncentives,\n currentTimestamp,\n userReserveData,\n}: CalculateUserReserveIncentivesRequest): UserReserveIncentive[] {\n const calculatedUserIncentives: UserReserveIncentive[] = [];\n // Compute incentive data for each reward linked to supply of this reserve\n userIncentives.aTokenIncentivesUserData.userRewardsInformation.forEach(userReserveIncentive => {\n const reserveIncentive = reserveIncentives.aIncentiveData.rewardsTokenInformation.find(\n reward => reward.rewardTokenAddress === userReserveIncentive.rewardTokenAddress,\n );\n if (reserveIncentive) {\n // Calculating accrued rewards is only required if user has an active aToken balance\n const accruedRewards = userReserveData\n ? calculateAccruedIncentives({\n principalUserBalance: new BigNumber(userReserveData.scaledATokenBalance),\n reserveIndex: new BigNumber(reserveIncentive.tokenIncentivesIndex),\n userIndex: new BigNumber(userReserveIncentive.tokenIncentivesUserIndex),\n precision: reserveIncentive.precision,\n reserveIndexTimestamp: reserveIncentive.incentivesLastUpdateTimestamp,\n emissionPerSecond: new BigNumber(reserveIncentive.emissionPerSecond),\n totalSupply: rayDiv(\n new BigNumber(userReserveData.reserve.totalLiquidity).shiftedBy(userReserveData.reserve.decimals),\n new BigNumber(userReserveData.reserve.liquidityIndex),\n ),\n currentTimestamp,\n emissionEndTimestamp: reserveIncentive.emissionEndTimestamp,\n })\n : new BigNumber('0');\n\n calculatedUserIncentives.push({\n tokenAddress: userIncentives.aTokenIncentivesUserData.tokenAddress,\n incentiveController: userIncentives.aTokenIncentivesUserData.incentiveControllerAddress,\n rewardTokenAddress: userReserveIncentive.rewardTokenAddress,\n rewardTokenDecimals: userReserveIncentive.rewardTokenDecimals,\n accruedRewards,\n unclaimedRewards: new BigNumber(userReserveIncentive.userUnclaimedRewards),\n rewardPriceFeed: normalize(userReserveIncentive.rewardPriceFeed, userReserveIncentive.priceFeedDecimals),\n rewardTokenSymbol: userReserveIncentive.rewardTokenSymbol,\n });\n }\n });\n // Compute incentive data for each reward linked to variable borrows of this reserve\n userIncentives.vTokenIncentivesUserData.userRewardsInformation.forEach(userReserveIncentive => {\n const reserveIncentive = reserveIncentives.vIncentiveData.rewardsTokenInformation.find(\n reward => reward.rewardTokenAddress === userReserveIncentive.rewardTokenAddress,\n );\n if (reserveIncentive) {\n // Calculating accrued rewards is only required if user has an active variableDebt token balance\n const accruedRewards = userReserveData\n ? calculateAccruedIncentives({\n principalUserBalance: new BigNumber(userReserveData.scaledVariableDebt),\n reserveIndex: new BigNumber(reserveIncentive.tokenIncentivesIndex),\n userIndex: new BigNumber(userReserveIncentive.tokenIncentivesUserIndex),\n precision: reserveIncentive.precision,\n reserveIndexTimestamp: reserveIncentive.incentivesLastUpdateTimestamp,\n emissionPerSecond: new BigNumber(reserveIncentive.emissionPerSecond),\n totalSupply: new BigNumber(userReserveData.reserve.totalScaledVariableDebt).shiftedBy(\n userReserveData.reserve.decimals,\n ),\n currentTimestamp,\n emissionEndTimestamp: reserveIncentive.emissionEndTimestamp,\n })\n : new BigNumber('0');\n calculatedUserIncentives.push({\n tokenAddress: userIncentives.vTokenIncentivesUserData.tokenAddress,\n incentiveController: userIncentives.vTokenIncentivesUserData.incentiveControllerAddress,\n rewardTokenAddress: userReserveIncentive.rewardTokenAddress,\n rewardTokenDecimals: userReserveIncentive.rewardTokenDecimals,\n accruedRewards,\n unclaimedRewards: new BigNumber(userReserveIncentive.userUnclaimedRewards),\n rewardPriceFeed: normalize(userReserveIncentive.rewardPriceFeed, userReserveIncentive.priceFeedDecimals),\n rewardTokenSymbol: userReserveIncentive.rewardTokenSymbol,\n });\n }\n });\n\n return calculatedUserIncentives;\n}\n","import { calculateUserReserveIncentives, type UserReserveIncentive } from './calculate-user-reserve-incentives.js';\nimport type {\n ReservesIncentiveDataHumanized,\n UserReservesIncentivesDataHumanized,\n UserReserveCalculationData,\n} from './types.js';\n\n// Indexed by reward token address\nexport type UserIncentiveDict = Record<string, UserIncentiveData>;\n\nexport interface UserIncentiveData {\n incentiveControllerAddress: string;\n rewardTokenSymbol: string;\n rewardPriceFeed: string;\n rewardTokenDecimals: number;\n claimableRewards: BigNumber;\n assets: string[];\n}\n\nexport interface CalculateAllUserIncentivesRequest {\n reserveIncentives: ReservesIncentiveDataHumanized[]; // token incentive data, from UiIncentiveDataProvider\n userIncentives: UserReservesIncentivesDataHumanized[]; // user incentive data, from UiIncentiveDataProvider\n userReserves: UserReserveCalculationData[]; // deposit and borrow data for user assets\n currentTimestamp: number;\n}\n\nexport function calculateAllUserIncentives({\n reserveIncentives,\n userIncentives,\n userReserves,\n currentTimestamp,\n}: CalculateAllUserIncentivesRequest): UserIncentiveDict {\n // calculate incentive per token\n const allRewards = userIncentives.flatMap((userIncentive: UserReservesIncentivesDataHumanized) => {\n const reserve: ReservesIncentiveDataHumanized | undefined = reserveIncentives.find(\n (reserve: ReservesIncentiveDataHumanized) => reserve.underlyingAsset === userIncentive.underlyingAsset,\n );\n const userReserve: UserReserveCalculationData | undefined = userReserves.find(\n (userReserve: UserReserveCalculationData) =>\n userReserve.reserve.underlyingAsset.toLowerCase() === userIncentive.underlyingAsset.toLowerCase(),\n );\n if (reserve) {\n const reserveRewards: UserReserveIncentive[] = calculateUserReserveIncentives({\n reserveIncentives: reserve,\n userIncentives: userIncentive,\n userReserveData: userReserve,\n currentTimestamp,\n });\n return reserveRewards;\n }\n\n return [];\n });\n\n // From the array of all deposit and borrow incentives, create dictionary indexed by reward token address\n const incentiveDict: UserIncentiveDict = {};\n for (const reward of allRewards) {\n if (!incentiveDict[reward.rewardTokenAddress]) {\n incentiveDict[reward.rewardTokenAddress] = {\n assets: [],\n rewardTokenSymbol: reward.rewardTokenSymbol,\n claimableRewards: reward.unclaimedRewards,\n incentiveControllerAddress: reward.incentiveController,\n rewardTokenDecimals: reward.rewardTokenDecimals,\n rewardPriceFeed: reward.rewardPriceFeed,\n };\n }\n\n if (reward.accruedRewards.gt(0)) {\n const incentive = incentiveDict[reward.rewardTokenAddress];\n\n if (!incentive) {\n throw new Error('Incentive not found');\n }\n\n incentive.claimableRewards = incentive.claimableRewards.plus(reward.accruedRewards);\n incentive.assets.push(reward.tokenAddress);\n }\n }\n\n return incentiveDict;\n}\n","import { normalize, normalizeBN, valueToBigNumber } from '../../bignumber.js';\nimport { SECONDS_PER_YEAR } from '../../constants.js';\n\nexport interface CalculateIncentiveAPRRequest {\n emissionPerSecond: string;\n rewardTokenPriceInMarketReferenceCurrency: string; // Can be priced in ETH or USD depending on market\n totalTokenSupply: string;\n priceInMarketReferenceCurrency: string; // Can be priced in ETH or USD depending on market\n decimals: number;\n rewardTokenDecimals: number;\n}\n\n// Calculate the APR for an incentive emission\nexport function calculateIncentiveAPR({\n emissionPerSecond,\n rewardTokenPriceInMarketReferenceCurrency,\n priceInMarketReferenceCurrency,\n totalTokenSupply,\n rewardTokenDecimals,\n decimals,\n}: CalculateIncentiveAPRRequest): string {\n const emissionPerSecondNormalized = normalizeBN(emissionPerSecond, rewardTokenDecimals).multipliedBy(\n rewardTokenPriceInMarketReferenceCurrency,\n );\n\n if (emissionPerSecondNormalized.eq(0)) {\n return '0';\n }\n\n const emissionPerYear = emissionPerSecondNormalized.multipliedBy(SECONDS_PER_YEAR);\n\n const totalSupplyNormalized = valueToBigNumber(normalize(totalTokenSupply, decimals)).multipliedBy(\n priceInMarketReferenceCurrency,\n );\n\n return emissionPerYear.dividedBy(totalSupplyNormalized).toFixed();\n}\n","import { normalize } from '../../bignumber.js';\nimport { calculateIncentiveAPR } from './calculate-incentive-apr.js';\nimport type { ReservesIncentiveDataHumanized, RewardInfoHumanized } from './types.js';\n\nexport interface CalculateReserveIncentivesRequest {\n reserves: Array<{\n underlyingAsset: string;\n formattedPriceInMarketReferenceCurrency: string;\n }>;\n reserveIncentiveData: ReservesIncentiveDataHumanized;\n totalLiquidity: string;\n totalVariableDebt: string;\n decimals: number;\n priceInMarketReferenceCurrency: string; // Can be priced in ETH or USD depending on market\n marketReferenceCurrencyDecimals: number;\n}\n\nexport interface ReserveIncentiveResponse {\n incentiveAPR: string;\n rewardTokenAddress: string;\n rewardTokenSymbol: string;\n}\n\nexport interface CalculateReserveIncentivesResponse {\n underlyingAsset: string;\n aIncentivesData: ReserveIncentiveResponse[];\n vIncentivesData: ReserveIncentiveResponse[];\n}\n\nexport function calculateRewardTokenPrice(\n reserves: Array<{\n underlyingAsset: string;\n formattedPriceInMarketReferenceCurrency: string;\n }>,\n address: string,\n priceFeed: string,\n priceFeedDecimals: number,\n): string {\n // For V3 incentives, all rewards will have attached price feed\n if (Number(priceFeed) > 0) {\n return normalize(priceFeed, priceFeedDecimals);\n }\n\n address = address.toLowerCase();\n // For stkAave incentives, use Aave price feed\n if (address.toLowerCase() === '0x4da27a545c0c5b758a6ba100e3a049001de870f5') {\n address = '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9';\n }\n\n // For V2 incentives, reward price feed comes from the reserves\n const rewardReserve = reserves.find(reserve => reserve.underlyingAsset.toLowerCase() === address);\n if (rewardReserve) {\n return rewardReserve.formattedPriceInMarketReferenceCurrency;\n }\n\n return '0';\n}\n\n// Determine is reward emsission is active or distribution has ended\nconst rewardEmissionActive = (reward: RewardInfoHumanized) => {\n if (reward.emissionEndTimestamp > reward.incentivesLastUpdateTimestamp) {\n return true;\n }\n\n return false;\n};\n\n// Calculate supply and variableBorrow incentives APR for a reserve asset\nexport function calculateReserveIncentives({\n reserves,\n reserveIncentiveData,\n totalLiquidity,\n totalVariableDebt,\n decimals,\n priceInMarketReferenceCurrency,\n}: CalculateReserveIncentivesRequest): CalculateReserveIncentivesResponse {\n const aIncentivesData: ReserveIncentiveResponse[] = reserveIncentiveData.aIncentiveData.rewardsTokenInformation.map(\n reward => {\n const aIncentivesAPR = rewardEmissionActive(reward)\n ? calculateIncentiveAPR({\n emissionPerSecond: reward.emissionPerSecond,\n rewardTokenPriceInMarketReferenceCurrency: calculateRewardTokenPrice(\n reserves,\n reward.rewardTokenAddress,\n reward.rewardPriceFeed,\n reward.priceFeedDecimals,\n ),\n priceInMarketReferenceCurrency,\n totalTokenSupply: totalLiquidity,\n decimals,\n rewardTokenDecimals: reward.rewardTokenDecimals,\n })\n : '0';\n const aIncentiveData: ReserveIncentiveResponse = {\n incentiveAPR: aIncentivesAPR,\n rewardTokenAddress: reward.rewardTokenAddress,\n rewardTokenSymbol: reward.rewardTokenSymbol,\n };\n return aIncentiveData;\n },\n );\n const vIncentivesData: ReserveIncentiveResponse[] = reserveIncentiveData.vIncentiveData.rewardsTokenInformation.map(\n reward => {\n const vIncentivesAPR = rewardEmissionActive(reward)\n ? calculateIncentiveAPR({\n emissionPerSecond: reward.emissionPerSecond,\n rewardTokenPriceInMarketReferenceCurrency: calculateRewardTokenPrice(\n reserves,\n reward.rewardTokenAddress,\n reward.rewardPriceFeed,\n reward.priceFeedDecimals,\n ),\n priceInMarketReferenceCurrency,\n totalTokenSupply: totalVariableDebt,\n decimals,\n rewardTokenDecimals: reward.rewardTokenDecimals,\n })\n : '0';\n const vIncentiveData: ReserveIncentiveResponse = {\n incentiveAPR: vIncentivesAPR,\n rewardTokenAddress: reward.rewardTokenAddress,\n rewardTokenSymbol: reward.rewardTokenSymbol,\n };\n return vIncentiveData;\n },\n );\n\n return {\n underlyingAsset: reserveIncentiveData.underlyingAsset,\n aIncentivesData,\n vIncentivesData,\n };\n}\n","import { calculateReserveIncentives, type CalculateReserveIncentivesResponse } from './calculate-reserve-incentives.js';\nimport type { ReserveCalculationData, ReservesIncentiveDataHumanized } from './types.js';\n\n// Indexed by reserve underlyingAsset address\nexport type ReserveIncentiveDict = Record<string, ReserveIncentives>;\n\ninterface ReserveIncentives {\n aIncentives: ReserveIncentive[];\n vIncentives: ReserveIncentive[];\n}\n\ninterface ReserveIncentive {\n incentiveAPR: string;\n rewardTokenAddress: string;\n rewardTokenSymbol: string;\n}\n\nexport interface CalculateAllReserveIncentivesRequest {\n reserveIncentives: ReservesIncentiveDataHumanized[];\n reserves: ReserveCalculationData[];\n marketReferenceCurrencyDecimals: number;\n}\n\nexport function calculateAllReserveIncentives({\n reserveIncentives,\n reserves,\n marketReferenceCurrencyDecimals,\n}: CalculateAllReserveIncentivesRequest): ReserveIncentiveDict {\n const reserveDict: ReserveIncentiveDict = {};\n // calculate incentive per reserve token\n reserveIncentives.forEach(reserveIncentive => {\n // Find the corresponding reserve data for each reserveIncentive\n const reserve: ReserveCalculationData | undefined = reserves.find(\n (reserve: ReserveCalculationData) =>\n reserve.underlyingAsset.toLowerCase() === reserveIncentive.underlyingAsset.toLowerCase(),\n );\n if (reserve) {\n const calculatedReserveIncentives: CalculateReserveIncentivesResponse = calculateReserveIncentives({\n reserves,\n reserveIncentiveData: reserveIncentive,\n totalLiquidity: reserve.totalLiquidity,\n totalVariableDebt: reserve.totalVariableDebt,\n priceInMarketReferenceCurrency: reserve.formattedPriceInMarketReferenceCurrency,\n decimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n });\n reserveDict[calculatedReserveIncentives.underlyingAsset] = {\n aIncentives: calculatedReserveIncentives.aIncentivesData,\n vIncentives: calculatedReserveIncentives.vIncentivesData,\n };\n }\n });\n\n return reserveDict;\n}\n","import BigNumber from 'bignumber.js';\nimport { type BigNumberValue, valueToBigNumber } from '../../bignumber.js';\n\ninterface NativeToUSD {\n amount: BigNumber;\n currencyDecimals: number;\n priceInMarketReferenceCurrency: BigNumberValue;\n marketReferenceCurrencyDecimals: number;\n normalizedMarketReferencePriceInUsd: BigNumberValue;\n}\n\nexport function nativeToUSD({\n amount,\n currencyDecimals,\n priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n normalizedMarketReferencePriceInUsd,\n}: NativeToUSD) {\n return valueToBigNumber(amount.toString())\n .multipliedBy(priceInMarketReferenceCurrency)\n .multipliedBy(normalizedMarketReferencePriceInUsd)\n .dividedBy(new BigNumber(1).shiftedBy(currencyDecimals + marketReferenceCurrencyDecimals))\n .toString();\n}\n","import type BigNumber from 'bignumber.js';\nimport type { BigNumberValue } from '../../bignumber.js';\n\nexport function normalizedToUsd(\n value: BigNumber,\n marketReferencePriceInUsd: BigNumberValue,\n marketReferenceCurrencyDecimals: number,\n): BigNumber {\n return value.multipliedBy(marketReferencePriceInUsd).shiftedBy(marketReferenceCurrencyDecimals * -1);\n}\n","import type BigNumber from 'bignumber.js';\nimport { calculateCompoundedInterest } from '../../pool-math.js';\nimport { rayMul } from '../../ray.math.js';\n\nexport interface CalculateReserveDebtRequest {\n totalScaledVariableDebt: string;\n variableBorrowIndex: string;\n availableLiquidity: string;\n variableBorrowRate: string;\n lastUpdateTimestamp: number;\n virtualUnderlyingBalance: string;\n}\n\nexport interface CalculateReserveDebtResponse {\n totalVariableDebt: BigNumber;\n totalDebt: BigNumber;\n totalLiquidity: BigNumber;\n}\n\nexport function calculateReserveDebt(\n reserveDebt: CalculateReserveDebtRequest,\n currentTimestamp: number,\n): CalculateReserveDebtResponse {\n const totalVariableDebt = getTotalVariableDebt(reserveDebt, currentTimestamp);\n const totalDebt = totalVariableDebt;\n const totalLiquidity = totalDebt.plus(reserveDebt.availableLiquidity);\n return {\n totalVariableDebt,\n totalDebt,\n totalLiquidity,\n };\n}\n\nfunction getTotalVariableDebt(reserveDebt: CalculateReserveDebtRequest, currentTimestamp: number): BigNumber {\n return rayMul(\n rayMul(reserveDebt.totalScaledVariableDebt, reserveDebt.variableBorrowIndex),\n calculateCompoundedInterest({\n rate: reserveDebt.variableBorrowRate,\n currentTimestamp,\n lastUpdateTimestamp: reserveDebt.lastUpdateTimestamp,\n }),\n );\n}\n","import BigNumber from 'bignumber.js';\nimport { type BigNumberValue, normalize, normalizeBN, valueToBigNumber } from '../../bignumber.js';\nimport { RAY_DECIMALS, SECONDS_PER_YEAR, USD_DECIMALS } from '../../constants.js';\nimport { LTV_PRECISION } from '../../index.js';\nimport { calculateCompoundedRate } from '../compounded-interest/calculate-compounded-interest.js';\nimport { type EModeDataString, type FormattedReserveEMode, getAndFormatReserveEModes } from '../emode/index.js';\nimport {\n calculateReserveIncentives,\n type CalculateReserveIncentivesResponse,\n} from '../incentive/calculate-reserve-incentives.js';\nimport type { ReservesIncentiveDataHumanized } from '../incentive/types.js';\nimport { nativeToUSD } from '../usd/native-to-usd.js';\nimport { normalizedToUsd } from '../usd/normalized-to-usd.js';\nimport { calculateReserveDebt } from './calculate-reserve-debt.js';\n\nexport interface FormatReserveResponse extends ReserveData {\n formattedBaseLTVasCollateral: string;\n formattedReserveLiquidationThreshold: string;\n formattedReserveLiquidationBonus: string;\n formattedAvailableLiquidity: string;\n totalDebt: string;\n totalVariableDebt: string;\n totalLiquidity: string;\n borrowUsageRatio: string;\n supplyUsageRatio: string;\n supplyAPY: string;\n variableBorrowAPY: string;\n unborrowedLiquidity: string;\n supplyAPR: string;\n variableBorrowAPR: string;\n isIsolated: boolean;\n isolationModeTotalDebtUSD: string;\n availableDebtCeilingUSD: string;\n debtCeilingUSD: string;\n eModes: FormattedReserveEMode[];\n}\n\nexport interface FormatReserveRequest {\n reserve: ReserveData;\n currentTimestamp: number;\n eModes?: EModeDataString[];\n}\n\nexport interface ReserveData {\n originalId: number;\n id: string;\n symbol: string;\n name: string;\n decimals: number;\n underlyingAsset: string;\n usageAsCollateralEnabled: boolean;\n reserveFactor: string;\n baseLTVasCollateral: string;\n liquidityIndex: string;\n reserveLiquidationThreshold: string;\n reserveLiquidationBonus: string;\n variableBorrowIndex: string;\n variableBorrowRate: string;\n availableLiquidity: string;\n liquidityRate: string;\n totalScaledVariableDebt: string;\n lastUpdateTimestamp: number;\n // v3\n borrowCap: string;\n supplyCap: string;\n debtCeiling: string;\n debtCeilingDecimals: number;\n isolationModeTotalDebt: string;\n unbacked: string;\n virtualAccActive: boolean;\n virtualUnderlyingBalance: string;\n}\n\ninterface GetComputedReserveFieldsResponse {\n formattedReserveLiquidationBonus: string;\n formattedAvailableLiquidity: BigNumber;\n totalDebt: BigNumber;\n totalVariableDebt: BigNumber;\n totalLiquidity: BigNumber;\n borrowUsageRatio: string;\n supplyUsageRatio: string;\n supplyAPY: BigNumber;\n variableBorrowAPY: BigNumber;\n unborrowedLiquidity: string;\n}\n\n/**\n * @description accrues interest and adds computed fields\n */\nfunction getComputedReserveFields({\n reserve,\n currentTimestamp,\n}: FormatReserveRequest): GetComputedReserveFieldsResponse {\n const { totalDebt, totalVariableDebt, totalLiquidity } = calculateReserveDebt(reserve, currentTimestamp);\n const borrowUsageRatio = totalLiquidity.eq(0) ? '0' : valueToBigNumber(totalDebt).dividedBy(totalLiquidity).toFixed();\n const supplyUsageRatio = totalLiquidity.eq(0)\n ? '0'\n : valueToBigNumber(totalDebt).dividedBy(totalLiquidity.plus(reserve.unbacked)).toFixed();\n // https://github.com/aave/protocol-v2/blob/baeb455fad42d3160d571bd8d3a795948b72dd85/contracts/protocol/lendingpool/LendingPoolConfigurator.sol#L284\n const reserveLiquidationBonus = normalize(\n valueToBigNumber(reserve.reserveLiquidationBonus).minus(10 ** LTV_PRECISION),\n LTV_PRECISION,\n );\n\n /**\n * availableLiquidity returned by the helper is the amount of unborrowed tokens\n * the actual availableLiquidity might be lower due to borrowCap\n */\n const availableLiquidity =\n reserve.borrowCap === '0'\n ? new BigNumber(reserve.availableLiquidity)\n : BigNumber.min(\n reserve.availableLiquidity,\n new BigNumber(reserve.borrowCap).shiftedBy(reserve.decimals).minus(\n // plus 1 as the cap is exclusive\n totalDebt.plus(1),\n ),\n );\n\n const supplyAPY = calculateCompoundedRate({\n rate: reserve.liquidityRate,\n duration: SECONDS_PER_YEAR,\n });\n\n const variableBorrowAPY = calculateCompoundedRate({\n rate: reserve.variableBorrowRate,\n duration: SECONDS_PER_YEAR,\n });\n\n return {\n totalDebt,\n totalVariableDebt,\n totalLiquidity,\n borrowUsageRatio,\n supplyUsageRatio,\n formattedReserveLiquidationBonus: reserveLiquidationBonus,\n supplyAPY,\n variableBorrowAPY,\n formattedAvailableLiquidity: availableLiquidity,\n unborrowedLiquidity: reserve.availableLiquidity,\n };\n}\n\ninterface FormatEnhancedReserveRequest {\n reserve: ReserveData & GetComputedReserveFieldsResponse;\n eModes?: EModeDataString[];\n}\n/**\n * @description normalizes reserve values & computed fields\n */\nfunction formatEnhancedReserve({ reserve, eModes }: FormatEnhancedReserveRequest): FormatReserveResponse {\n const normalizeWithReserve = (n: BigNumberValue) => normalize(n, reserve.decimals);\n\n const isIsolated = reserve.debtCeiling !== '0';\n const availableDebtCeilingUSD = isIsolated\n ? normalize(\n valueToBigNumber(reserve.debtCeiling).minus(reserve.isolationModeTotalDebt),\n reserve.debtCeilingDecimals,\n )\n : '0';\n\n const formattedEModes = eModes ? getAndFormatReserveEModes(reserve.originalId, eModes) : [];\n\n return {\n ...reserve,\n totalVariableDebt: normalizeWithReserve(reserve.totalVariableDebt),\n totalLiquidity: normalizeWithReserve(reserve.totalLiquidity),\n formattedAvailableLiquidity: normalizeWithReserve(reserve.availableLiquidity),\n unborrowedLiquidity: normalizeWithReserve(reserve.unborrowedLiquidity),\n borrowUsageRatio: reserve.borrowUsageRatio,\n supplyUsageRatio: reserve.supplyUsageRatio,\n totalDebt: normalizeWithReserve(reserve.totalDebt),\n formattedBaseLTVasCollateral: normalize(reserve.baseLTVasCollateral, LTV_PRECISION),\n reserveFactor: normalize(reserve.reserveFactor, LTV_PRECISION),\n supplyAPY: normalize(reserve.supplyAPY, RAY_DECIMALS),\n supplyAPR: normalize(reserve.liquidityRate, RAY_DECIMALS),\n variableBorrowAPY: normalize(reserve.variableBorrowAPY, RAY_DECIMALS),\n variableBorrowAPR: normalize(reserve.variableBorrowRate, RAY_DECIMALS),\n formattedReserveLiquidationThreshold: normalize(reserve.reserveLiquidationThreshold, 4),\n formattedReserveLiquidationBonus: normalize(\n valueToBigNumber(reserve.reserveLiquidationBonus).minus(10 ** LTV_PRECISION),\n 4,\n ),\n totalScaledVariableDebt: normalizeWithReserve(reserve.totalScaledVariableDebt),\n debtCeilingUSD: isIsolated ? normalize(reserve.debtCeiling, reserve.debtCeilingDecimals) : '0',\n isolationModeTotalDebtUSD: isIsolated\n ? normalize(reserve.isolationModeTotalDebt, reserve.debtCeilingDecimals)\n : '0',\n availableDebtCeilingUSD,\n isIsolated,\n eModes: formattedEModes,\n };\n}\n\n/**\n * @description computes additional fields and normalizes numbers into human readable decimals\n */\nexport function formatReserve({ reserve, currentTimestamp, eModes }: FormatReserveRequest): FormatReserveResponse {\n const computedFields = getComputedReserveFields({\n reserve,\n currentTimestamp,\n });\n return formatEnhancedReserve({\n reserve: { ...reserve, ...computedFields },\n eModes,\n });\n}\n\nexport type ReserveDataWithPrice = ReserveData & {\n priceInMarketReferenceCurrency: string;\n};\n\nexport interface FormatReserveUSDRequest {\n reserve: ReserveDataWithPrice;\n currentTimestamp: number;\n marketReferencePriceInUsd: string;\n marketReferenceCurrencyDecimals: number;\n eModes?: EModeDataString[];\n}\n\nexport interface FormatReserveUSDResponse extends FormatReserveResponse {\n totalLiquidityUSD: string;\n availableLiquidityUSD: string;\n totalDebtUSD: string;\n totalVariableDebtUSD: string;\n borrowCapUSD: string;\n supplyCapUSD: string;\n unbackedUSD: string;\n priceInMarketReferenceCurrency: string;\n formattedPriceInMarketReferenceCurrency: string;\n priceInUSD: string;\n}\n\n/**\n * @description computes additional fields and normalizes numbers into human readable decimals\n * In addition to that it also converts the numbers to USD\n */\nexport function formatReserveUSD({\n reserve,\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n eModes,\n}: FormatReserveUSDRequest): FormatReserveUSDResponse {\n const normalizedMarketReferencePriceInUsd = normalizeBN(marketReferencePriceInUsd, USD_DECIMALS);\n\n const computedFields = getComputedReserveFields({\n reserve,\n currentTimestamp,\n });\n const formattedReserve = formatEnhancedReserve({\n reserve: { ...reserve, ...computedFields },\n eModes,\n });\n\n return {\n ...formattedReserve,\n totalLiquidityUSD: nativeToUSD({\n amount: computedFields.totalLiquidity,\n currencyDecimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n normalizedMarketReferencePriceInUsd,\n }),\n availableLiquidityUSD: nativeToUSD({\n amount: computedFields.formattedAvailableLiquidity,\n currencyDecimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n normalizedMarketReferencePriceInUsd,\n }),\n totalDebtUSD: nativeToUSD({\n amount: computedFields.totalDebt,\n currencyDecimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n normalizedMarketReferencePriceInUsd,\n }),\n totalVariableDebtUSD: nativeToUSD({\n amount: computedFields.totalVariableDebt,\n currencyDecimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n normalizedMarketReferencePriceInUsd,\n }),\n formattedPriceInMarketReferenceCurrency: normalize(\n reserve.priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n priceInUSD: nativeToUSD({\n amount: new BigNumber(1).shiftedBy(reserve.decimals),\n currencyDecimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n priceInMarketReferenceCurrency: reserve.priceInMarketReferenceCurrency,\n normalizedMarketReferencePriceInUsd,\n }),\n // v3\n // caps are already in absolutes\n borrowCapUSD: normalizedToUsd(\n new BigNumber(reserve.borrowCap),\n reserve.priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ).toString(),\n supplyCapUSD: normalizedToUsd(\n new BigNumber(reserve.supplyCap),\n reserve.priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ).toString(),\n unbackedUSD: normalizedToUsd(\n new BigNumber(reserve.unbacked),\n reserve.priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ).toString(),\n // debtCeilingUSD: normalizedToUsd(\n // new BigNumber(reserve.debtCeiling),\n // marketReferencePriceInUsd,\n // marketReferenceCurrencyDecimals,\n // ).toString(),\n };\n}\n\nexport interface FormatReservesUSDRequest<T extends ReserveDataWithPrice> {\n reserves: T[];\n eModes?: EModeDataString[];\n currentTimestamp: number;\n marketReferencePriceInUsd: string;\n marketReferenceCurrencyDecimals: number;\n}\n\nexport function formatReserves<T extends ReserveDataWithPrice>({\n reserves,\n eModes,\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n}: FormatReservesUSDRequest<T>) {\n return reserves.map(reserve => {\n const formattedReserve = formatReserveUSD({\n reserve,\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n eModes,\n });\n return { ...reserve, ...formattedReserve };\n });\n}\n\nexport interface FormatReservesAndIncentivesUSDRequest<T extends ReserveDataWithPrice>\n extends FormatReservesUSDRequest<T & { underlyingAsset: string }> {\n reserveIncentives: ReservesIncentiveDataHumanized[];\n}\n\nexport function formatReservesAndIncentives<T extends ReserveDataWithPrice>({\n reserves,\n eModes,\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n reserveIncentives,\n}: FormatReservesAndIncentivesUSDRequest<T>): Array<\n FormatReserveUSDResponse & T & Partial<CalculateReserveIncentivesResponse>\n> {\n const formattedReserves = formatReserves<T & { underlyingAsset: string }>({\n reserves,\n currentTimestamp,\n marketReferenceCurrencyDecimals,\n marketReferencePriceInUsd,\n eModes,\n });\n\n return formattedReserves.map(reserve => {\n const reserveIncentive = reserveIncentives.find(\n reserveIncentive => reserveIncentive.underlyingAsset === reserve.underlyingAsset,\n );\n if (!reserveIncentive) return reserve;\n const incentive = calculateReserveIncentives({\n reserves: formattedReserves,\n reserveIncentiveData: reserveIncentive,\n totalLiquidity: normalize(reserve.totalLiquidity, -reserve.decimals),\n totalVariableDebt: normalize(reserve.totalVariableDebt, -reserve.decimals),\n priceInMarketReferenceCurrency: reserve.formattedPriceInMarketReferenceCurrency,\n decimals: reserve.decimals,\n marketReferenceCurrencyDecimals,\n });\n return { ...reserve, ...incentive };\n });\n}\n","import { type BigNumberValue, normalize } from '../../bignumber.js';\nimport type { FormatReserveUSDResponse } from '../reserve/index.js';\nimport type { UserReserveSummaryResponse } from './generate-user-reserve-summary.js';\nimport type { ComputedUserReserve } from './index.js';\n\nexport interface FormatUserReserveRequest<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n reserve: UserReserveSummaryResponse<T>;\n marketReferenceCurrencyDecimals: number;\n}\n\nexport interface FormatUserReserveResponse<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n reserve: ComputedUserReserve<T>;\n}\n\nexport function formatUserReserve<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>({\n reserve: _reserve,\n marketReferenceCurrencyDecimals,\n}: FormatUserReserveRequest<T>): ComputedUserReserve<T> {\n const { userReserve } = _reserve;\n const { reserve } = userReserve;\n const reserveDecimals = reserve.decimals;\n\n const normalizeWithReserve = (n: BigNumberValue) => normalize(n, reserve.decimals);\n\n return {\n ...userReserve,\n underlyingBalance: normalize(_reserve.underlyingBalance, reserveDecimals),\n underlyingBalanceMarketReferenceCurrency: normalize(\n _reserve.underlyingBalanceMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n underlyingBalanceUSD: _reserve.underlyingBalanceUSD.toString(),\n variableBorrows: normalizeWithReserve(_reserve.variableBorrows),\n variableBorrowsMarketReferenceCurrency: normalize(\n _reserve.variableBorrowsMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n variableBorrowsUSD: _reserve.variableBorrowsUSD.toString(),\n totalBorrows: normalizeWithReserve(_reserve.totalBorrows),\n totalBorrowsMarketReferenceCurrency: normalize(\n _reserve.totalBorrowsMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n totalBorrowsUSD: _reserve.totalBorrowsUSD.toString(),\n };\n}\n","import type BigNumber from 'bignumber.js';\nimport { valueToBigNumber, valueToZDBigNumber } from '../../bignumber.js';\nimport type { FormatReserveUSDResponse } from '../reserve/index.js';\nimport type { UserReserveSummaryResponse } from './generate-user-reserve-summary.js';\n\ninterface UserReserveTotalsRequest {\n userReserves: UserReserveSummaryResponse[];\n userEmodeCategoryId: number;\n}\n\ninterface UserReserveTotalsResponse {\n totalLiquidityMarketReferenceCurrency: BigNumber;\n totalBorrowsMarketReferenceCurrency: BigNumber;\n totalCollateralMarketReferenceCurrency: BigNumber;\n currentLtv: BigNumber;\n currentLiquidationThreshold: BigNumber;\n isInIsolationMode: boolean;\n isolatedReserve?: FormatReserveUSDResponse;\n}\n\nexport function calculateUserReserveTotals({\n userReserves,\n userEmodeCategoryId,\n}: UserReserveTotalsRequest): UserReserveTotalsResponse {\n let totalLiquidityMarketReferenceCurrency = valueToZDBigNumber('0');\n let totalCollateralMarketReferenceCurrency = valueToZDBigNumber('0');\n let totalBorrowsMarketReferenceCurrency = valueToZDBigNumber('0');\n let currentLtv = valueToBigNumber('0');\n let currentLiquidationThreshold = valueToBigNumber('0');\n let isInIsolationMode = false;\n let isolatedReserve: FormatReserveUSDResponse | undefined;\n\n userReserves.forEach(userReserveSummary => {\n totalLiquidityMarketReferenceCurrency = totalLiquidityMarketReferenceCurrency.plus(\n userReserveSummary.underlyingBalanceMarketReferenceCurrency,\n );\n totalBorrowsMarketReferenceCurrency = totalBorrowsMarketReferenceCurrency.plus(\n userReserveSummary.variableBorrowsMarketReferenceCurrency,\n );\n\n if (\n userReserveSummary.userReserve.reserve.reserveLiquidationThreshold !== '0' &&\n userReserveSummary.userReserve.usageAsCollateralEnabledOnUser\n ) {\n if (userReserveSummary.userReserve.reserve.debtCeiling !== '0') {\n isolatedReserve = userReserveSummary.userReserve.reserve;\n isInIsolationMode = true;\n }\n\n totalCollateralMarketReferenceCurrency = totalCollateralMarketReferenceCurrency.plus(\n userReserveSummary.underlyingBalanceMarketReferenceCurrency,\n );\n const selectedEModeCategory = userReserveSummary.userReserve.reserve.eModes.find(\n elem => elem.id === userEmodeCategoryId,\n );\n if (userEmodeCategoryId && selectedEModeCategory && selectedEModeCategory.collateralEnabled) {\n currentLtv = currentLtv.plus(\n valueToBigNumber(userReserveSummary.underlyingBalanceMarketReferenceCurrency).multipliedBy(\n selectedEModeCategory.eMode.ltv,\n ),\n );\n currentLiquidationThreshold = currentLiquidationThreshold.plus(\n valueToBigNumber(userReserveSummary.underlyingBalanceMarketReferenceCurrency).multipliedBy(\n selectedEModeCategory.eMode.liquidationThreshold,\n ),\n );\n } else {\n currentLtv = currentLtv.plus(\n valueToBigNumber(userReserveSummary.underlyingBalanceMarketReferenceCurrency).multipliedBy(\n userReserveSummary.userReserve.reserve.baseLTVasCollateral,\n ),\n );\n currentLiquidationThreshold = currentLiquidationThreshold.plus(\n valueToBigNumber(userReserveSummary.underlyingBalanceMarketReferenceCurrency).multipliedBy(\n userReserveSummary.userReserve.reserve.reserveLiquidationThreshold,\n ),\n );\n }\n }\n });\n\n if (currentLtv.gt(0)) {\n currentLtv = valueToZDBigNumber(currentLtv.div(totalCollateralMarketReferenceCurrency));\n }\n\n if (currentLiquidationThreshold.gt(0)) {\n currentLiquidationThreshold = valueToZDBigNumber(\n currentLiquidationThreshold.div(totalCollateralMarketReferenceCurrency),\n );\n }\n\n return {\n totalLiquidityMarketReferenceCurrency,\n totalBorrowsMarketReferenceCurrency,\n totalCollateralMarketReferenceCurrency,\n currentLtv,\n currentLiquidationThreshold,\n isInIsolationMode,\n isolatedReserve,\n };\n}\n","import BigNumber from 'bignumber.js';\nimport { type BigNumberValue, normalizeBN } from '../../bignumber.js';\nimport {\n calculateAvailableBorrowsMarketReferenceCurrency,\n calculateHealthFactorFromBalances,\n} from '../../pool-math.js';\nimport type { FormatReserveUSDResponse } from '../reserve/index.js';\nimport { normalizedToUsd } from '../usd/normalized-to-usd.js';\nimport { calculateUserReserveTotals } from './calculate-user-reserve-totals.js';\nimport type { UserReserveSummaryResponse } from './generate-user-reserve-summary.js';\n\nexport interface RawUserSummaryRequest {\n userReserves: UserReserveSummaryResponse[];\n marketReferencePriceInUsd: BigNumberValue;\n marketReferenceCurrencyDecimals: number;\n userEmodeCategoryId: number;\n}\n\nexport interface RawUserSummaryResponse {\n totalLiquidityUSD: BigNumber;\n totalCollateralUSD: BigNumber;\n totalBorrowsUSD: BigNumber;\n totalLiquidityMarketReferenceCurrency: BigNumber;\n totalCollateralMarketReferenceCurrency: BigNumber;\n totalBorrowsMarketReferenceCurrency: BigNumber;\n availableBorrowsMarketReferenceCurrency: BigNumber;\n availableBorrowsUSD: BigNumber;\n currentLoanToValue: BigNumber;\n currentLiquidationThreshold: BigNumber;\n healthFactor: BigNumber;\n isInIsolationMode: boolean;\n isolatedReserve?: FormatReserveUSDResponse;\n}\n\nexport function generateRawUserSummary({\n userReserves,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n userEmodeCategoryId,\n}: RawUserSummaryRequest): RawUserSummaryResponse {\n const {\n totalLiquidityMarketReferenceCurrency,\n totalBorrowsMarketReferenceCurrency,\n totalCollateralMarketReferenceCurrency,\n currentLtv,\n currentLiquidationThreshold,\n isInIsolationMode,\n isolatedReserve,\n } = calculateUserReserveTotals({ userReserves, userEmodeCategoryId });\n\n const _availableBorrowsMarketReferenceCurrency = calculateAvailableBorrowsMarketReferenceCurrency({\n collateralBalanceMarketReferenceCurrency: totalCollateralMarketReferenceCurrency,\n borrowBalanceMarketReferenceCurrency: totalBorrowsMarketReferenceCurrency,\n currentLtv,\n });\n\n const availableBorrowsMarketReferenceCurrency =\n isInIsolationMode && isolatedReserve\n ? BigNumber.min(\n BigNumber.max(\n 0,\n normalizeBN(\n new BigNumber(isolatedReserve.debtCeiling).minus(isolatedReserve.isolationModeTotalDebt),\n isolatedReserve.debtCeilingDecimals - marketReferenceCurrencyDecimals,\n ),\n ),\n _availableBorrowsMarketReferenceCurrency,\n )\n : _availableBorrowsMarketReferenceCurrency;\n\n return {\n isInIsolationMode,\n isolatedReserve,\n totalLiquidityUSD: normalizedToUsd(\n totalLiquidityMarketReferenceCurrency,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n ),\n totalCollateralUSD: normalizedToUsd(\n totalCollateralMarketReferenceCurrency,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n ),\n totalBorrowsUSD: normalizedToUsd(\n totalBorrowsMarketReferenceCurrency,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n ),\n totalLiquidityMarketReferenceCurrency,\n totalCollateralMarketReferenceCurrency,\n totalBorrowsMarketReferenceCurrency,\n availableBorrowsMarketReferenceCurrency,\n availableBorrowsUSD: normalizedToUsd(\n availableBorrowsMarketReferenceCurrency,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n ),\n currentLoanToValue: currentLtv,\n currentLiquidationThreshold,\n healthFactor: calculateHealthFactorFromBalances({\n collateralBalanceMarketReferenceCurrency: totalCollateralMarketReferenceCurrency,\n borrowBalanceMarketReferenceCurrency: totalBorrowsMarketReferenceCurrency,\n currentLiquidationThreshold,\n }),\n };\n}\n","import type BigNumber from 'bignumber.js';\nimport type { BigNumberValue } from '../../bignumber.js';\nimport { getLinearBalance, getMarketReferenceCurrencyAndUsdBalance, getCompoundedBalance } from '../../pool-math.js';\nimport type { FormatReserveUSDResponse } from '../reserve/index.js';\nimport type { CombinedReserveData } from './index.js';\n\nexport interface UserReserveSummaryRequest<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n userReserve: CombinedReserveData<T>;\n marketReferencePriceInUsdNormalized: BigNumberValue;\n marketReferenceCurrencyDecimals: number;\n currentTimestamp: number;\n}\n\nexport interface UserReserveSummaryResponse<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n userReserve: CombinedReserveData<T>;\n underlyingBalance: BigNumber;\n underlyingBalanceMarketReferenceCurrency: BigNumber;\n underlyingBalanceUSD: BigNumber;\n variableBorrows: BigNumber;\n variableBorrowsMarketReferenceCurrency: BigNumber;\n variableBorrowsUSD: BigNumber;\n totalBorrows: BigNumber;\n totalBorrowsMarketReferenceCurrency: BigNumber;\n totalBorrowsUSD: BigNumber;\n}\n\nexport function generateUserReserveSummary<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>({\n userReserve,\n marketReferencePriceInUsdNormalized,\n marketReferenceCurrencyDecimals,\n currentTimestamp,\n}: UserReserveSummaryRequest<T>): UserReserveSummaryResponse<T> {\n const poolReserve: FormatReserveUSDResponse = userReserve.reserve;\n const { priceInMarketReferenceCurrency, decimals } = poolReserve;\n const underlyingBalance = getLinearBalance({\n balance: userReserve.scaledATokenBalance,\n index: poolReserve.liquidityIndex,\n rate: poolReserve.liquidityRate,\n lastUpdateTimestamp: poolReserve.lastUpdateTimestamp,\n currentTimestamp,\n });\n const { marketReferenceCurrencyBalance: underlyingBalanceMarketReferenceCurrency, usdBalance: underlyingBalanceUSD } =\n getMarketReferenceCurrencyAndUsdBalance({\n balance: underlyingBalance,\n priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n decimals,\n marketReferencePriceInUsdNormalized,\n });\n\n const variableBorrows = getCompoundedBalance({\n principalBalance: userReserve.scaledVariableDebt,\n reserveIndex: poolReserve.variableBorrowIndex,\n reserveRate: poolReserve.variableBorrowRate,\n lastUpdateTimestamp: poolReserve.lastUpdateTimestamp,\n currentTimestamp,\n });\n\n const { marketReferenceCurrencyBalance: variableBorrowsMarketReferenceCurrency, usdBalance: variableBorrowsUSD } =\n getMarketReferenceCurrencyAndUsdBalance({\n balance: variableBorrows,\n priceInMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n decimals,\n marketReferencePriceInUsdNormalized,\n });\n\n return {\n userReserve,\n underlyingBalance,\n underlyingBalanceMarketReferenceCurrency,\n underlyingBalanceUSD,\n variableBorrows,\n variableBorrowsMarketReferenceCurrency,\n variableBorrowsUSD,\n totalBorrows: variableBorrows,\n totalBorrowsMarketReferenceCurrency: variableBorrowsMarketReferenceCurrency,\n totalBorrowsUSD: variableBorrowsUSD,\n };\n}\n","import { type BigNumberValue, normalize } from '../../bignumber.js';\nimport { LTV_PRECISION, USD_DECIMALS } from '../../constants.js';\nimport { calculateAllUserIncentives, type UserIncentiveDict } from '../incentive/calculate-all-user-incentives.js';\nimport type { ReservesIncentiveDataHumanized, UserReservesIncentivesDataHumanized } from '../incentive/types.js';\nimport type { FormatReserveUSDResponse } from '../reserve/index.js';\nimport { formatUserReserve } from './format-user-reserve.js';\nimport { generateRawUserSummary } from './generate-raw-user-summary.js';\nimport { generateUserReserveSummary, type UserReserveSummaryResponse } from './generate-user-reserve-summary.js';\n\nexport interface UserReserveDataString {\n underlyingAsset: string;\n scaledATokenBalance: string;\n usageAsCollateralEnabledOnUser: boolean;\n scaledVariableDebt: string;\n}\n\nexport interface CombinedReserveData<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>\n extends UserReserveDataString {\n reserve: T;\n}\n\nexport interface ComputedUserReserve<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>\n extends CombinedReserveData<T> {\n underlyingBalance: string;\n underlyingBalanceMarketReferenceCurrency: string;\n underlyingBalanceUSD: string;\n variableBorrows: string;\n variableBorrowsMarketReferenceCurrency: string;\n variableBorrowsUSD: string;\n totalBorrows: string;\n totalBorrowsMarketReferenceCurrency: string;\n totalBorrowsUSD: string;\n}\n\nexport interface FormatUserSummaryRequest<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n userReserves: UserReserveDataString[];\n formattedReserves: T[];\n marketReferencePriceInUsd: BigNumberValue;\n marketReferenceCurrencyDecimals: number;\n currentTimestamp: number;\n userEmodeCategoryId: number;\n}\n\nexport interface FormatUserSummaryResponse<T extends FormatReserveUSDResponse = FormatReserveUSDResponse> {\n userReservesData: Array<ComputedUserReserve<T>>;\n totalLiquidityMarketReferenceCurrency: string;\n totalLiquidityUSD: string;\n totalCollateralMarketReferenceCurrency: string;\n totalCollateralUSD: string;\n totalBorrowsMarketReferenceCurrency: string;\n totalBorrowsUSD: string;\n netWorthUSD: string;\n availableBorrowsMarketReferenceCurrency: string;\n availableBorrowsUSD: string;\n currentLoanToValue: string;\n currentLiquidationThreshold: string;\n healthFactor: string;\n userEmodeCategoryId: number;\n isInIsolationMode: boolean;\n isolatedReserve?: FormatReserveUSDResponse;\n}\n\nexport interface FormatUserSummaryAndIncentivesRequest<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>\n extends FormatUserSummaryRequest<T> {\n reserveIncentives: ReservesIncentiveDataHumanized[];\n userIncentives: UserReservesIncentivesDataHumanized[];\n}\n\nexport interface FormatUserSummaryAndIncentivesResponse<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>\n extends FormatUserSummaryResponse<T> {\n calculatedUserIncentives: UserIncentiveDict;\n}\n\nexport function formatUserSummary<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>({\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n userReserves,\n formattedReserves,\n userEmodeCategoryId,\n}: FormatUserSummaryRequest<T>): FormatUserSummaryResponse<T> {\n const normalizedMarketRefPriceInUsd = normalize(marketReferencePriceInUsd, USD_DECIMALS);\n\n // Combine raw user and formatted reserve data\n const combinedReserves: Array<CombinedReserveData<T>> = [];\n\n userReserves.forEach(userReserve => {\n const reserve = formattedReserves.find(\n r => r.underlyingAsset.toLowerCase() === userReserve.underlyingAsset.toLowerCase(),\n );\n if (reserve) {\n combinedReserves.push({\n ...userReserve,\n reserve,\n });\n }\n });\n\n const computedUserReserves: Array<UserReserveSummaryResponse<T>> = combinedReserves.map(userReserve =>\n generateUserReserveSummary<T>({\n userReserve,\n marketReferencePriceInUsdNormalized: normalizedMarketRefPriceInUsd,\n marketReferenceCurrencyDecimals,\n currentTimestamp,\n }),\n );\n\n const formattedUserReserves = computedUserReserves.map(computedUserReserve =>\n formatUserReserve<T>({\n reserve: computedUserReserve,\n marketReferenceCurrencyDecimals,\n }),\n );\n\n const userData = generateRawUserSummary({\n userReserves: computedUserReserves,\n marketReferencePriceInUsd: normalizedMarketRefPriceInUsd,\n marketReferenceCurrencyDecimals,\n userEmodeCategoryId,\n });\n\n return {\n userReservesData: formattedUserReserves,\n totalLiquidityMarketReferenceCurrency: normalize(\n userData.totalLiquidityMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n totalLiquidityUSD: userData.totalLiquidityUSD.toString(),\n totalCollateralMarketReferenceCurrency: normalize(\n userData.totalCollateralMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n totalCollateralUSD: userData.totalCollateralUSD.toString(),\n totalBorrowsMarketReferenceCurrency: normalize(\n userData.totalBorrowsMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n totalBorrowsUSD: userData.totalBorrowsUSD.toString(),\n netWorthUSD: userData.totalLiquidityUSD.minus(userData.totalBorrowsUSD).toString(),\n availableBorrowsMarketReferenceCurrency: normalize(\n userData.availableBorrowsMarketReferenceCurrency,\n marketReferenceCurrencyDecimals,\n ),\n availableBorrowsUSD: userData.availableBorrowsUSD.toString(),\n currentLoanToValue: normalize(userData.currentLoanToValue, LTV_PRECISION),\n currentLiquidationThreshold: normalize(userData.currentLiquidationThreshold, LTV_PRECISION),\n healthFactor: userData.healthFactor.toFixed(),\n userEmodeCategoryId,\n isInIsolationMode: userData.isInIsolationMode,\n isolatedReserve: userData.isolatedReserve,\n };\n}\n\nexport function formatUserSummaryAndIncentives<T extends FormatReserveUSDResponse = FormatReserveUSDResponse>({\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n userReserves,\n formattedReserves,\n userEmodeCategoryId,\n reserveIncentives,\n userIncentives,\n}: FormatUserSummaryAndIncentivesRequest<T>): FormatUserSummaryAndIncentivesResponse<T> {\n const formattedUserSummary = formatUserSummary({\n currentTimestamp,\n marketReferencePriceInUsd,\n marketReferenceCurrencyDecimals,\n userReserves,\n formattedReserves,\n userEmodeCategoryId,\n });\n\n const calculatedUserIncentives = calculateAllUserIncentives({\n reserveIncentives,\n userIncentives,\n userReserves: formattedUserSummary.userReservesData,\n currentTimestamp,\n });\n\n return {\n ...formattedUserSummary,\n calculatedUserIncentives,\n };\n}\n","import { type Address, getMoneyMarketConfig } from '@sodax/types';\nimport type { EvmHubProvider } from '../shared/entities/Providers.js';\nimport { uiPoolDataAbi } from '../shared/abis/uiPoolData.abi.js';\nimport type {\n AggregatedReserveData,\n BaseCurrencyInfo,\n EModeData,\n EmodeDataHumanized,\n PoolBaseCurrencyHumanized,\n ReserveDataHumanized,\n ReservesDataHumanized,\n UserReserveData,\n UserReserveDataHumanized,\n UiPoolDataProviderInterface,\n} from './MoneyMarketTypes.js';\n\nexport class UiPoolDataProviderService implements UiPoolDataProviderInterface {\n private readonly hubProvider: EvmHubProvider;\n private readonly uiPoolDataProvider: Address;\n private readonly poolAddressesProvider: Address;\n\n constructor(hubProvider: EvmHubProvider) {\n this.hubProvider = hubProvider;\n this.uiPoolDataProvider = getMoneyMarketConfig(this.hubProvider.chainConfig.chain.id).uiPoolDataProvider;\n this.poolAddressesProvider = getMoneyMarketConfig(this.hubProvider.chainConfig.chain.id).poolAddressesProvider;\n }\n\n public async getUserReservesHumanized(userAddress: Address): Promise<{\n userReserves: UserReserveDataHumanized[];\n userEmodeCategoryId: number;\n }> {\n const [userReservesRaw, userEmodeCategoryId] = await this.getUserReservesData(userAddress);\n\n return {\n userReserves: userReservesRaw.map(userReserveRaw => ({\n id: `${this.hubProvider.chainConfig.chain.id}-${userAddress}-${userReserveRaw.underlyingAsset}-${this.poolAddressesProvider}`.toLowerCase(),\n underlyingAsset: userReserveRaw.underlyingAsset.toLowerCase(),\n scaledATokenBalance: userReserveRaw.scaledATokenBalance.toString(),\n usageAsCollateralEnabledOnUser: userReserveRaw.usageAsCollateralEnabledOnUser,\n scaledVariableDebt: userReserveRaw.scaledVariableDebt.toString(),\n })),\n userEmodeCategoryId,\n };\n }\n\n /**\n * Get the list of all eModes in the pool humanized\n * @returns {Promise<EmodeDataHumanized[]>} - Array of eMode data humanized\n */\n public async getEModesHumanized(): Promise<EmodeDataHumanized[]> {\n const eModeData = await this.getEModes();\n return eModeData.map(eMode => ({\n id: eMode.id,\n eMode: {\n ltv: eMode.eMode.ltv.toString(),\n liquidationThreshold: eMode.eMode.liquidationThreshold.toString(),\n liquidationBonus: eMode.eMode.liquidationBonus.toString(),\n collateralBitmap: eMode.eMode.collateralBitmap.toString(2).padStart(256, '0'),\n label: eMode.eMode.label,\n borrowableBitmap: eMode.eMode.borrowableBitmap.toString(2).padStart(256, '0'),\n },\n }));\n }\n\n /**\n * Get the list of all eModes in the pool\n * @returns {Promise<readonly EModeData[]>} - Array of eMode data\n */\n public async getEModes(): Promise<readonly EModeData[]> {\n return this.hubProvider.publicClient.readContract({\n address: this.uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getEModes',\n args: [this.poolAddressesProvider],\n });\n }\n /**\n * Get the list of all reserves in the pool\n * @param uiPoolDataProvider - The address of the UI Pool Data Provider\n * @param poolAddressesProvider - The address of the Pool Addresses Provider\n * @returns {Promise<readonly Address[]>} - Array of reserve addresses\n */\n public async getReservesList(): Promise<readonly Address[]> {\n return this.hubProvider.publicClient.readContract({\n address: this.uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getReservesList',\n args: [this.poolAddressesProvider],\n });\n }\n\n /**\n * Get detailed data for all reserves in the pool\n * @returns {Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]>} - Tuple containing array of reserve data and base currency info\n */\n public async getReservesData(): Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]> {\n return this.hubProvider.publicClient.readContract({\n address: this.uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getReservesData',\n args: [this.poolAddressesProvider],\n });\n }\n\n /**\n * Get user-specific reserve data\n * @param userAddress Address of the user\n * @param uiPoolDataProvider - The address of the UI Pool Data Provider\n * @param poolAddressesProvider - The address of the Pool Addresses Provider\n * @returns {Promise<readonly [readonly UserReserveData[], number]>} - Tuple containing array of user reserve data and eMode category ID\n */\n public async getUserReservesData(userAddress: Address): Promise<readonly [readonly UserReserveData[], number]> {\n return this.hubProvider.publicClient.readContract({\n address: this.uiPoolDataProvider,\n abi: uiPoolDataAbi,\n functionName: 'getUserReservesData',\n args: [this.poolAddressesProvider, userAddress],\n });\n }\n\n /**\n * Get the reserves data humanized\n * @returns {Promise<ReservesDataHumanized>} - The reserves data humanized\n */\n public async getReservesHumanized(): Promise<ReservesDataHumanized> {\n const [reservesRaw, poolBaseCurrencyRaw] = await this.getReservesData();\n\n const reservesData: ReserveDataHumanized[] = reservesRaw.map((reserveRaw, index) => {\n const virtualUnderlyingBalance = reserveRaw.virtualUnderlyingBalance.toString();\n const { virtualAccActive } = reserveRaw;\n return {\n originalId: index,\n id: `${this.hubProvider.chainConfig.chain.id}-${reserveRaw.underlyingAsset}-${this.poolAddressesProvider}`.toLowerCase(),\n underlyingAsset: reserveRaw.underlyingAsset.toLowerCase(),\n name: reserveRaw.name,\n symbol: reserveRaw.symbol,\n decimals: Number(reserveRaw.decimals),\n baseLTVasCollateral: reserveRaw.baseLTVasCollateral.toString(),\n reserveLiquidationThreshold: reserveRaw.reserveLiquidationThreshold.toString(),\n reserveLiquidationBonus: reserveRaw.reserveLiquidationBonus.toString(),\n reserveFactor: reserveRaw.reserveFactor.toString(),\n usageAsCollateralEnabled: reserveRaw.usageAsCollateralEnabled,\n borrowingEnabled: reserveRaw.borrowingEnabled,\n isActive: reserveRaw.isActive,\n isFrozen: reserveRaw.isFrozen,\n liquidityIndex: reserveRaw.liquidityIndex.toString(),\n variableBorrowIndex: reserveRaw.variableBorrowIndex.toString(),\n liquidityRate: reserveRaw.liquidityRate.toString(),\n variableBorrowRate: reserveRaw.variableBorrowRate.toString(),\n lastUpdateTimestamp: reserveRaw.lastUpdateTimestamp,\n aTokenAddress: reserveRaw.aTokenAddress.toString(),\n variableDebtTokenAddress: reserveRaw.variableDebtTokenAddress.toString(),\n interestRateStrategyAddress: reserveRaw.interestRateStrategyAddress.toString(),\n availableLiquidity: reserveRaw.availableLiquidity.toString(),\n totalScaledVariableDebt: reserveRaw.totalScaledVariableDebt.toString(),\n priceInMarketReferenceCurrency: reserveRaw.priceInMarketReferenceCurrency.toString(),\n priceOracle: reserveRaw.priceOracle,\n variableRateSlope1: reserveRaw.variableRateSlope1.toString(),\n variableRateSlope2: reserveRaw.variableRateSlope2.toString(),\n baseVariableBorrowRate: reserveRaw.baseVariableBorrowRate.toString(),\n optimalUsageRatio: reserveRaw.optimalUsageRatio.toString(),\n // new fields\n isPaused: reserveRaw.isPaused,\n debtCeiling: reserveRaw.debtCeiling.toString(),\n borrowCap: reserveRaw.borrowCap.toString(),\n supplyCap: reserveRaw.supplyCap.toString(),\n borrowableInIsolation: reserveRaw.borrowableInIsolation,\n accruedToTreasury: reserveRaw.accruedToTreasury.toString(),\n unbacked: reserveRaw.unbacked.toString(),\n isolationModeTotalDebt: reserveRaw.isolationModeTotalDebt.toString(),\n debtCeilingDecimals: Number(reserveRaw.debtCeilingDecimals),\n isSiloedBorrowing: reserveRaw.isSiloedBorrowing,\n flashLoanEnabled: reserveRaw.flashLoanEnabled,\n virtualAccActive,\n virtualUnderlyingBalance,\n };\n });\n\n const baseCurrencyData: PoolBaseCurrencyHumanized = {\n // this is to get the decimals from the unit so 1e18 = string length of 19 - 1 to get the number of 0\n marketReferenceCurrencyDecimals: poolBaseCurrencyRaw.marketReferenceCurrencyUnit.toString().length - 1,\n marketReferenceCurrencyPriceInUsd: poolBaseCurrencyRaw.marketReferenceCurrencyPriceInUsd.toString(),\n networkBaseTokenPriceInUsd: poolBaseCurrencyRaw.networkBaseTokenPriceInUsd.toString(),\n networkBaseTokenPriceDecimals: poolBaseCurrencyRaw.networkBaseTokenPriceDecimals,\n };\n\n return {\n reservesData,\n baseCurrencyData,\n };\n }\n}\n","import { getMoneyMarketConfig, type Address } from '@sodax/types';\nimport type { EvmHubProvider } from '../shared/entities/Providers.js';\nimport { poolAbi } from '../shared/abis/pool.abi.js';\nimport type { ReserveDataLegacy } from './MoneyMarketTypes.js';\n\nexport class LendingPoolService {\n private readonly hubProvider: EvmHubProvider;\n private readonly lendingPool: Address;\n\n constructor(hubProvider: EvmHubProvider) {\n this.hubProvider = hubProvider;\n this.lendingPool = getMoneyMarketConfig(this.hubProvider.chainConfig.chain.id).lendingPool;\n }\n\n /**\n * Get the list of all reserves in the lending pool\n * @returns {Promise<readonly Address[]>} - Array of reserve addresses\n */\n async getReservesList(): Promise<readonly Address[]> {\n return this.hubProvider.publicClient.readContract({\n address: this.lendingPool,\n abi: poolAbi,\n functionName: 'getReservesList',\n args: [],\n });\n }\n\n /**\n * Get detailed data for a reserve in the pool\n * @param assetAddress - The address of the asset\n * @returns {Promise<ReserveDataLegacy>} - Reserve data\n */\n async getReserveData(assetAddress: Address): Promise<ReserveDataLegacy> {\n return this.hubProvider.publicClient.readContract({\n address: this.lendingPool,\n abi: poolAbi,\n functionName: 'getReserveData',\n args: [assetAddress],\n });\n }\n\n /**\n * Get the normalized income for a reserve\n * @param asset - The address of the asset\n * @returns {Promise<bigint>} - Normalized income\n */\n async getReserveNormalizedIncome(asset: Address): Promise<bigint> {\n return this.hubProvider.publicClient.readContract({\n address: this.lendingPool,\n abi: poolAbi,\n functionName: 'getReserveNormalizedIncome',\n args: [asset],\n });\n }\n}\n","import type { EvmHubProvider, SpokeProvider } from '../shared/entities/Providers.js';\nimport type {\n AggregatedReserveData,\n BaseCurrencyInfo,\n EModeData,\n EmodeDataHumanized,\n ReservesDataHumanized,\n UserReserveData,\n UserReserveDataHumanized,\n ReserveDataLegacy,\n} from './MoneyMarketTypes.js';\nimport {\n formatReserves,\n formatReserveUSD,\n formatUserSummary,\n type FormatReservesUSDRequest,\n type FormatReserveUSDRequest,\n type FormatReserveUSDResponse,\n type FormatUserSummaryRequest,\n type FormatUserSummaryResponse,\n type ReserveData,\n type ReserveDataWithPrice,\n} from './math-utils/index.js';\nimport { UiPoolDataProviderService } from './UiPoolDataProviderService.js';\nimport { LendingPoolService } from './LendingPoolService.js';\nimport type { Address } from '@sodax/types';\nimport { deriveUserWalletAddress } from '../shared/utils/shared-utils.js';\n\nexport class MoneyMarketDataService {\n public readonly uiPoolDataProviderService: UiPoolDataProviderService;\n public readonly lendingPoolService: LendingPoolService;\n public readonly hubProvider: EvmHubProvider;\n\n constructor(hubProvider: EvmHubProvider) {\n this.hubProvider = hubProvider;\n this.uiPoolDataProviderService = new UiPoolDataProviderService(hubProvider);\n this.lendingPoolService = new LendingPoolService(hubProvider);\n }\n\n /**\n * LendingPool\n */\n\n /**\n * Get the normalized income for a reserve\n * @param asset - The address of the asset\n * @returns {Promise<bigint>} - Normalized income\n */\n public async getReserveNormalizedIncome(asset: Address): Promise<bigint> {\n return this.lendingPoolService.getReserveNormalizedIncome(asset);\n }\n\n /**\n * Get the reserve data for an asset\n * @param asset - The address of the asset\n * @returns {Promise<ReserveDataLegacy>} - The reserve data\n */\n public async getReserveData(asset: Address): Promise<ReserveDataLegacy> {\n return this.lendingPoolService.getReserveData(asset);\n }\n\n /**\n * UiPoolDataProvider\n */\n\n /**\n * Get the reserves list\n * @returns {Promise<readonly Address[]>} - List of reserve asset addresses\n */\n public async getReservesList(): Promise<readonly Address[]> {\n return this.uiPoolDataProviderService.getReservesList();\n }\n\n /**\n * Get the reserves data\n * @returns {Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]>} - The reserves data\n */\n public async getReservesData(): Promise<readonly [readonly AggregatedReserveData[], BaseCurrencyInfo]> {\n return this.uiPoolDataProviderService.getReservesData();\n }\n\n /**\n * Get the user reserves data\n * @param spokeProvider - The spoke provider\n * @returns {Promise<readonly [readonly UserReserveData[], number]>} - The user reserves data\n */\n public async getUserReservesData(\n spokeProvider: SpokeProvider,\n ): Promise<readonly [readonly UserReserveData[], number]> {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n // derive users hub wallet address\n const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n return this.uiPoolDataProviderService.getUserReservesData(hubWalletAddress);\n }\n\n /**\n * Get the list of all eModes in the pool\n * @returns {Promise<readonly EModeData[]>} - Array of eMode data\n */\n public async getEModes(): Promise<readonly EModeData[]> {\n return this.uiPoolDataProviderService.getEModes();\n }\n\n /**\n * Get the list of all eModes in the pool humanized\n * @returns {Promise<EmodeDataHumanized[]>} - Array of eMode data humanized\n */\n public async getEModesHumanized(): Promise<EmodeDataHumanized[]> {\n return this.uiPoolDataProviderService.getEModesHumanized();\n }\n\n /**\n * Get the reserves data humanized\n * @returns {Promise<ReservesDataHumanized>} - The reserves data humanized\n */\n public async getReservesHumanized(): Promise<ReservesDataHumanized> {\n return this.uiPoolDataProviderService.getReservesHumanized();\n }\n\n /**\n * Get the user reserves humanized\n * @param spokeProvider - The spoke provider\n * @returns {Promise<{userReserves: UserReserveDataHumanized[], userEmodeCategoryId: number}>} - The user reserves humanized\n */\n public async getUserReservesHumanized(spokeProvider: SpokeProvider): Promise<{\n userReserves: UserReserveDataHumanized[];\n userEmodeCategoryId: number;\n }> {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n // derive users hub wallet address\n const hubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n return this.uiPoolDataProviderService.getUserReservesHumanized(hubWalletAddress);\n }\n\n /**\n * Utils for building requests\n */\n\n /**\n * @description Util function to build the request for the formatReserves function\n */\n public buildReserveDataWithPrice(reserves: ReservesDataHumanized): FormatReservesUSDRequest<ReserveDataWithPrice> {\n // Current UNIX timestamp in seconds\n const currentUnixTimestamp: number = Math.floor(Date.now() / 1000);\n const baseCurrencyData = reserves.baseCurrencyData;\n\n return {\n reserves: reserves.reservesData,\n currentTimestamp: currentUnixTimestamp,\n marketReferenceCurrencyDecimals: baseCurrencyData.marketReferenceCurrencyDecimals,\n marketReferencePriceInUsd: baseCurrencyData.marketReferenceCurrencyPriceInUsd,\n };\n }\n\n /**\n * @description Util function to build the request for the formatReserves function\n */\n public buildUserSummaryRequest(\n reserves: ReservesDataHumanized,\n formattedReserves: (ReserveData & { priceInMarketReferenceCurrency: string } & FormatReserveUSDResponse)[],\n userReserves: {\n userReserves: UserReserveDataHumanized[];\n userEmodeCategoryId: number;\n },\n ): FormatUserSummaryRequest<FormatReserveUSDResponse> {\n // Current UNIX timestamp in seconds\n const currentUnixTimestamp: number = Math.floor(Date.now() / 1000);\n const baseCurrencyData = reserves.baseCurrencyData;\n const userReservesArray = userReserves.userReserves;\n\n return {\n currentTimestamp: currentUnixTimestamp,\n marketReferenceCurrencyDecimals: baseCurrencyData.marketReferenceCurrencyDecimals,\n marketReferencePriceInUsd: baseCurrencyData.marketReferenceCurrencyPriceInUsd,\n userReserves: userReservesArray,\n formattedReserves,\n userEmodeCategoryId: userReserves.userEmodeCategoryId,\n };\n }\n\n /**\n * Formatted data\n */\n\n /**\n * @description computes additional fields and normalizes numbers into human readable decimals\n * In addition to that it also converts the numbers to USD\n * @param {FormatReservesUSDRequest<ReserveDataWithPrice>} - the request parameters\n * @returns {FormatReserveUSDResponse<FormatReservesUSDRequest>} - an array of formatted configuration and live usage data for each reserve in a Sodax market\n */\n public formatReservesUSD(\n params: FormatReservesUSDRequest<ReserveDataWithPrice>,\n ): (ReserveData & { priceInMarketReferenceCurrency: string } & FormatReserveUSDResponse)[] {\n return formatReserves(params);\n }\n\n /**\n * @description computes additional fields and normalizes numbers into human readable decimals\n * In addition to that it also converts the numbers to USD\n * @param FormatReserveUSDRequest - the request parameters\n * @returns an array of formatted configuration and live usage data for each reserve in a Sodax market\n */\n public formatReserveUSD(params: FormatReserveUSDRequest): FormatReserveUSDResponse {\n return formatReserveUSD(params);\n }\n\n /**\n * Returns formatted summary of Sodax money market user portfolio (holdings, total liquidity,\n * collateral, borrows, liquidation threshold, health factor, available borrowing power, etc..)\n * @param {FormatUserSummaryRequest<FormatReserveUSDResponse>} - the request parameters\n * @returns {FormatReserveUSDResponse<FormatUserSummaryRequest>} - a formatted summary of Sodax user portfolio\n */\n public formatUserSummary(\n params: FormatUserSummaryRequest<FormatReserveUSDResponse>,\n ): FormatUserSummaryResponse<FormatReserveUSDResponse> {\n return formatUserSummary(params);\n }\n}\n\n// Helper functions to format data\nexport function formatPercentage(value: bigint, decimals = 27): string {\n return `${(Number(value) / 10 ** decimals).toFixed(2)}%`;\n}\n\nexport function formatBasisPoints(value: bigint): string {\n return `${(Number(value) / 100).toFixed(2)}%`;\n}\n","import { type Address, type Hex, fromHex } from 'viem';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport type { StellarSpokeProvider } from '../../entities/stellar/StellarSpokeProvider.js';\nimport {\n CustomStellarAccount,\n type DepositSimulationParams,\n type PromiseStellarTxReturnType,\n type Result,\n STELLAR_DEFAULT_TX_TIMEOUT_SECONDS,\n type StellarGasEstimate,\n type StellarReturnType,\n encodeAddress,\n parseToStroops,\n sleep,\n} from '../../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport {\n FeeBumpTransaction,\n type Transaction,\n TransactionBuilder,\n rpc,\n type Horizon,\n Operation,\n Asset,\n BASE_FEE,\n} from '@stellar/stellar-sdk';\nimport {\n STELLAR_MAINNET_CHAIN_ID,\n getIntentRelayChainId,\n spokeChainConfig,\n type HubAddress,\n type StellarRawTransaction,\n} from '@sodax/types';\n\nexport type StellarSpokeDepositParams = {\n from: Hex; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type StellarTransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class StellarSpokeService {\n private constructor() {}\n\n /**\n * Check if the user has sufficent trustline established for the token.\n * @param token - The token address to check the trustline for.\n * @param amount - The amount of tokens to check the trustline for.\n * @param spokeProvider - The Stellar spoke provider.\n * @returns True if the user has sufficent trustline established for the token, false otherwise.\n */\n public static async hasSufficientTrustline(\n token: string,\n amount: bigint,\n spokeProvider: StellarSpokeProvider,\n ): Promise<boolean> {\n // native token and legacy bnUSD do not require trustline\n if (\n token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase() ||\n token.toLowerCase() ===\n spokeChainConfig[STELLAR_MAINNET_CHAIN_ID].supportedTokens.legacybnUSD.address.toLowerCase()\n ) {\n return true;\n }\n\n const trustlineConfig = spokeProvider.chainConfig.trustlineConfigs.find(\n config => config.contractId.toLowerCase() === token.toLowerCase(),\n );\n\n if (!trustlineConfig) {\n throw new Error(`Trustline config not found for token: ${token}`);\n }\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const { balances } = await spokeProvider.server.accounts().accountId(walletAddress).call();\n\n const tokenBalance = balances.find(\n balance =>\n 'limit' in balance &&\n 'balance' in balance &&\n 'asset_code' in balance &&\n trustlineConfig.assetCode.toLowerCase() === balance.asset_code?.toLowerCase() &&\n 'asset_issuer' in balance &&\n trustlineConfig.assetIssuer.toLowerCase() === balance.asset_issuer?.toLowerCase(),\n ) as Horizon.HorizonApi.BalanceLineAsset<'credit_alphanum4' | 'credit_alphanum12'> | undefined;\n\n if (!tokenBalance) {\n console.error(`No token balances found for token: ${token}`);\n return false;\n }\n\n const limit = parseToStroops(tokenBalance.limit);\n const balance = parseToStroops(tokenBalance.balance);\n const availableTrustAmount: bigint = limit - balance;\n\n return availableTrustAmount >= amount;\n }\n\n /**\n * Request a trustline for a given token and amount.\n * @param token - The token address to request the trustline for.\n * @param amount - The amount of tokens to request the trustline for.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n public static async requestTrustline<R extends boolean = false>(\n token: string,\n amount: bigint,\n spokeProvider: StellarSpokeProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n try {\n const asset = spokeProvider.chainConfig.trustlineConfigs.find(\n t => t.contractId.toLowerCase() === token.toLowerCase(),\n );\n\n if (!asset) {\n throw new Error(`Asset ${token} not found. Cannot proceed with trustline.`);\n }\n\n const [network, walletAddress] = await Promise.all([\n spokeProvider.sorobanServer.getNetwork(),\n spokeProvider.walletProvider.getWalletAddress(),\n ]);\n\n const accountResponse = await spokeProvider.server.loadAccount(walletAddress);\n const stellarAccount = new CustomStellarAccount(accountResponse);\n\n const transaction = new TransactionBuilder(stellarAccount.getAccountClone(), {\n fee: BASE_FEE,\n networkPassphrase: network.passphrase,\n })\n .addOperation(\n Operation.changeTrust({\n asset: new Asset(asset?.assetCode, asset?.assetIssuer),\n }),\n )\n .setTimeout(STELLAR_DEFAULT_TX_TIMEOUT_SECONDS)\n .build();\n\n if (raw) {\n const transactionXdr = transaction.toXDR();\n\n return {\n from: walletAddress,\n to: spokeProvider.chainConfig.addresses.assetManager,\n value: amount,\n data: transactionXdr,\n } satisfies StellarReturnType<true> as StellarReturnType<R>;\n }\n\n const hash = await spokeProvider.signAndSendTransaction(transaction);\n\n return `${hash}` as StellarReturnType<R>;\n } catch (error) {\n console.error('Error during requestTrustline:', error);\n throw error;\n }\n }\n\n /**\n * Estimate the gas for a transaction.\n * @param rawTx - The raw transaction to estimate the gas for.\n * @param spokeProvider - The spoke provider.\n * @returns The estimated gas (minResourceFee) for the transaction.\n */\n public static async estimateGas(\n rawTx: StellarRawTransaction,\n spokeProvider: StellarSpokeProvider,\n ): Promise<StellarGasEstimate> {\n const network = await spokeProvider.sorobanServer.getNetwork();\n let tx: Transaction | FeeBumpTransaction = TransactionBuilder.fromXDR(rawTx.data, network.passphrase);\n\n if (tx instanceof FeeBumpTransaction) {\n tx = tx.innerTransaction;\n }\n\n const simulationForFee = await spokeProvider.sorobanServer.simulateTransaction(tx);\n\n if (!rpc.Api.isSimulationSuccess(simulationForFee)) {\n throw new Error(`Simulation error: ${JSON.stringify(simulationForFee)}`);\n }\n\n return BigInt(simulationForFee.minResourceFee);\n }\n\n public static async deposit<R extends boolean = false>(\n params: StellarSpokeDepositParams,\n spokeProvider: StellarSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n hubProvider,\n ));\n\n return StellarSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain asset manager.\n * @param token - The address of the token to get the balance of.\n * @param spokeProvider - The spoke provider.\n * @returns The balance of the token.\n */\n public static async getDeposit(token: string, spokeProvider: StellarSpokeProvider): Promise<bigint> {\n return BigInt(await spokeProvider.getBalance(token));\n }\n\n /**\n * Generate simulation parameters for deposit from StellarSpokeDepositParams.\n * @param {StellarSpokeDepositParams} params - The deposit parameters.\n * @param {StellarSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: StellarSpokeDepositParams,\n spokeProvider: StellarSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n hubProvider,\n ));\n\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: encodeAddress(spokeProvider.chainConfig.chain.id, params.token),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n spokeProvider.chainConfig.addresses.assetManager as `0x${string}`,\n ),\n };\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param from - The address of the user on the hub chain.\n * @param payload - The payload to send to the contract.\n * @param spokeProvider - The spoke provider.\n * @param hubProvider - The hub provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: StellarSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return StellarSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: StellarTransferToHubParams,\n spokeProvider: StellarSpokeProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n return await spokeProvider.deposit(\n token,\n amount.toString(),\n fromHex(recipient, 'bytes'),\n fromHex(data, 'bytes'),\n raw,\n );\n }\n\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: StellarSpokeProvider,\n raw?: R,\n ): PromiseStellarTxReturnType<R> {\n return await spokeProvider.sendMessage(\n dstChainId.toString(),\n fromHex(dstAddress, 'bytes'),\n fromHex(payload, 'bytes'),\n raw,\n );\n }\n\n public static async waitForTransaction(\n spokeProvider: StellarSpokeProvider,\n txHash: string,\n pollingTimeout = 750,\n maxAttempts = 40,\n ): Promise<Result<boolean, Error>> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const tx = await spokeProvider.sorobanServer.getTransaction(txHash);\n\n if (tx && tx.status === 'SUCCESS') {\n return { ok: true, value: true }; // confirmed\n }\n\n if (tx && tx.status === 'FAILED') {\n return { ok: false, error: new Error(`Transaction failed: ${JSON.stringify(tx)}`) };\n }\n\n if (tx && tx.status === 'NOT_FOUND') {\n // not in a closed ledger yet → poll again\n await sleep(pollingTimeout);\n continue;\n }\n\n // unknown status or tx undefined -> poll again\n await sleep(pollingTimeout);\n } catch (err) {\n // Network/transient error → back off and retry\n await sleep(pollingTimeout);\n }\n }\n\n return { ok: false, error: new Error('Transaction was not confirmed within the max attempts') };\n }\n}\n","import { IntentsAbi } from '../shared/abis/intents.abi.js';\nimport invariant from 'tiny-invariant';\nimport {\n type Address,\n type GetLogsReturnType,\n encodeAbiParameters,\n encodeFunctionData,\n encodePacked,\n getAbiItem,\n keccak256,\n parseEventLogs,\n} from 'viem';\nimport {\n Erc20Service,\n type EvmContractCall,\n type EvmHubProvider,\n FEE_PERCENTAGE_SCALE,\n type PartnerFee,\n calculatePercentageFeeAmount,\n encodeAddress,\n encodeContractCalls,\n isIntentRelayChainId,\n isPartnerFeeAmount,\n isPartnerFeePercentage,\n randomUint256,\n} from '../index.js';\nimport { type CreateIntentParams, type FeeData, type Intent, type IntentData, IntentDataType } from './index.js';\nimport { SONIC_MAINNET_CHAIN_ID, getIntentRelayChainId, type Hash, type Hex, type SolverConfig } from '@sodax/types';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\nexport const IntentCreatedEventAbi = getAbiItem({ abi: IntentsAbi, name: 'IntentCreated' });\nexport type IntentCreatedEventLog = GetLogsReturnType<typeof IntentCreatedEventAbi>[number];\n\nexport class EvmSolverService {\n private constructor() {}\n\n /**\n * Constructs the create intent data for EVM Hub chain\n * @param {CreateIntentParams} createIntentParams - The create intent parameters\n * @param {Address} creatorHubWalletAddress - The creator hub wallet address\n * @param {SolverConfig} solverConfig - The intent configuration\n * @param {PartnerFee} fee - The partner fee configuration\n * @returns {Promise<[Hex, Intent, bigint]>} The encoded contract call, intent and fee amount\n */\n public static constructCreateIntentData(\n createIntentParams: CreateIntentParams,\n creatorHubWalletAddress: Address,\n solverConfig: SolverConfig,\n configService: ConfigService,\n fee: PartnerFee | undefined,\n ): [Hex, Intent, bigint] {\n const inputToken =\n createIntentParams.srcChain !== SONIC_MAINNET_CHAIN_ID\n ? configService.getHubAssetInfo(createIntentParams.srcChain, createIntentParams.inputToken)?.asset\n : (createIntentParams.inputToken as `0x${string}`);\n\n const outputToken =\n createIntentParams.dstChain !== SONIC_MAINNET_CHAIN_ID\n ? configService.getHubAssetInfo(createIntentParams.dstChain, createIntentParams.outputToken)?.asset\n : (createIntentParams.outputToken as `0x${string}`);\n\n invariant(\n inputToken,\n `hub asset not found for spoke chain token (intent.inputToken): ${createIntentParams.inputToken}`,\n );\n invariant(\n outputToken,\n `hub asset not found for spoke chain token (intent.outputToken): ${createIntentParams.outputToken}`,\n );\n\n const [feeData, feeAmount] = EvmSolverService.createIntentFeeData(fee, createIntentParams.inputAmount);\n\n const calls: EvmContractCall[] = [];\n const intentsContract = solverConfig.intentsContract;\n const intent = {\n ...createIntentParams,\n inputToken,\n outputToken,\n inputAmount: createIntentParams.inputAmount - feeAmount,\n srcChain: getIntentRelayChainId(createIntentParams.srcChain),\n dstChain: getIntentRelayChainId(createIntentParams.dstChain),\n srcAddress: encodeAddress(createIntentParams.srcChain, createIntentParams.srcAddress),\n dstAddress: encodeAddress(createIntentParams.dstChain, createIntentParams.dstAddress),\n intentId: randomUint256(),\n creator: creatorHubWalletAddress,\n data: feeData, // fee amount will be deducted from the input amount\n } satisfies Intent;\n\n calls.push(Erc20Service.encodeApprove(intent.inputToken, intentsContract, createIntentParams.inputAmount));\n calls.push(EvmSolverService.encodeCreateIntent(intent, intentsContract));\n return [encodeContractCalls(calls), intent, feeAmount];\n }\n\n /**\n * Creates encoded fee data for an intent\n * @param fee The partner fee configuration\n * @param inputAmount The input amount to calculate percentage-based fee from\n * @returns A tuple containing [encoded fee data, fee amount]. Fee amount will be 0n if no fee.\n */\n public static createIntentFeeData(fee: PartnerFee | undefined, inputAmount: bigint): [Hex, bigint] {\n invariant(inputAmount > 0n, 'Input amount must be greater than 0');\n if (!fee) {\n return ['0x', 0n];\n }\n\n let feeAmount: bigint;\n if (isPartnerFeeAmount(fee)) {\n feeAmount = fee.amount;\n } else if (isPartnerFeePercentage(fee)) {\n invariant(\n fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,\n `Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`,\n );\n\n feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);\n } else {\n return ['0x', 0n];\n }\n\n // Create the fee data struct\n const feeData = {\n fee: feeAmount,\n receiver: fee.address,\n } satisfies FeeData;\n\n // Encode the fee data\n const encodedFeeData = encodeAbiParameters(\n [\n { name: 'fee', type: 'uint256' },\n { name: 'receiver', type: 'address' },\n ],\n [feeData.fee, feeData.receiver],\n );\n\n // Create the intent data struct\n const intentData = {\n type: IntentDataType.FEE,\n data: encodedFeeData,\n } satisfies IntentData;\n\n // Encode the intent data\n return [encodePacked(['uint8', 'bytes'], [intentData.type, intentData.data]), feeAmount];\n }\n\n /**\n * Gets an intent from a transaction hash\n * @param {Hash} txHash - The transaction hash\n * @param {SolverConfig} solverConfig - The solver configuration\n * @param {EvmHubProvider} hubProvider - The EVM hub provider\n * @returns {Promise<Intent>} The intent\n */\n public static async getIntent(\n txHash: Hash,\n solverConfig: SolverConfig,\n hubProvider: EvmHubProvider,\n ): Promise<Intent> {\n const receipt = await hubProvider.publicClient.waitForTransactionReceipt({ hash: txHash });\n const logs: IntentCreatedEventLog[] = parseEventLogs({\n abi: IntentsAbi,\n eventName: 'IntentCreated',\n logs: receipt.logs,\n strict: true,\n });\n\n for (const log of logs) {\n if (log.address.toLowerCase() === solverConfig.intentsContract.toLowerCase()) {\n if (!log.args.intent) {\n continue;\n }\n\n if (!isIntentRelayChainId(log.args.intent.srcChain) || !isIntentRelayChainId(log.args.intent.dstChain)) {\n throw new Error(`Invalid intent relay chain id: ${log.args.intent.srcChain} or ${log.args.intent.dstChain}`);\n }\n\n return {\n intentId: log.args.intent.intentId,\n creator: log.args.intent.creator,\n inputToken: log.args.intent.inputToken,\n outputToken: log.args.intent.outputToken,\n inputAmount: log.args.intent.inputAmount,\n minOutputAmount: log.args.intent.minOutputAmount,\n deadline: log.args.intent.deadline,\n data: log.args.intent.data,\n allowPartialFill: log.args.intent.allowPartialFill,\n srcChain: log.args.intent.srcChain,\n dstChain: log.args.intent.dstChain,\n srcAddress: log.args.intent.srcAddress,\n dstAddress: log.args.intent.dstAddress,\n solver: log.args.intent.solver,\n } satisfies Intent;\n }\n }\n\n throw new Error(`No intent found for ${txHash}`);\n }\n\n /**\n * Gets the keccak256 hash of an intent. Hash serves as the intent id on Hub chain.\n * @param {Intent} intent - The intent\n * @returns {Hex} The keccak256 hash of the intent\n */\n public static getIntentHash(intent: Intent): Hex {\n return keccak256(encodeAbiParameters(getAbiItem({ abi: IntentsAbi, name: 'createIntent' }).inputs, [intent]));\n }\n\n /**\n * Encodes a createIntent transaction\n * @param {Intent} intent - The intent to create\n * @param {Address} intentsContract - The address of the intents contract\n * @returns {EvmContractCall} The encoded contract call\n */\n public static encodeCreateIntent(intent: Intent, intentsContract: Address): EvmContractCall {\n return {\n address: intentsContract,\n value: 0n,\n data: encodeFunctionData({\n abi: IntentsAbi,\n functionName: 'createIntent',\n args: [intent],\n }),\n };\n }\n\n /**\n * Encodes a cancelIntent transaction\n * @param {Intent} intent - The intent to cancel\n * @param {Address} intentsContract - The address of the intents contract\n * @returns {EvmContractCall} The encoded contract call\n */\n public static encodeCancelIntent(intent: Intent, intentsContract: Address): EvmContractCall {\n return {\n address: intentsContract,\n value: 0n,\n data: encodeFunctionData({\n abi: IntentsAbi,\n functionName: 'cancelIntent',\n args: [intent],\n }),\n };\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n SolverIntentErrorCode,\n retry,\n type SolverErrorResponse,\n type SolverExecutionRequest,\n type SolverExecutionResponse,\n type SolverIntentQuoteRequest,\n type SolverIntentQuoteResponse,\n type SolverIntentQuoteResponseRaw,\n type SolverIntentStatusRequest,\n type SolverIntentStatusResponse,\n type Result,\n type ConfigService,\n} from '../index.js';\nimport type { SolverConfig } from '@sodax/types';\n\nexport class SolverApiService {\n private constructor() {}\n\n /**\n * Request a quote from the solver API\n * @example\n * {\n * \"token_src\":\"0x13b70564b1ec12876b20fab5d1bb630311312f4f\", // Asset BSC\n * \"token_dst\":\"0xdcd9578b51ef55239b6e68629d822a8d97c95b86\", // Asset ETH Arbitrum\n * \"token_src_blockchain_id\":\"56\",\n * \"token_dst_blockchain_id\":\"42161\",\n * \"amount\":1000000000000000n,\n * \"quote_type\": \"exact_input\"\n * }\n */\n public static async getQuote(\n payload: SolverIntentQuoteRequest,\n config: SolverConfig,\n configService: ConfigService,\n ): Promise<Result<SolverIntentQuoteResponse, SolverErrorResponse>> {\n invariant(payload.token_src.length > 0, 'Empty token_src');\n invariant(payload.token_src_blockchain_id.length > 0, 'Empty token_src_blockchain_id');\n invariant(payload.token_dst.length > 0, 'Empty token_dst');\n invariant(payload.token_dst_blockchain_id.length > 0, 'Empty token_dst_blockchain_id');\n invariant(payload.amount > 0n, 'amount must be greater than 0');\n invariant(\n configService.isValidOriginalAssetAddress(payload.token_src_blockchain_id, payload.token_src),\n 'unsupported token_src for src chain',\n );\n invariant(\n configService.isValidOriginalAssetAddress(payload.token_dst_blockchain_id, payload.token_dst),\n 'unsupported token_dst for dst chain',\n );\n\n const tokenSrc = configService.getHubAssetInfo(payload.token_src_blockchain_id, payload.token_src)?.asset;\n const tokenDst = configService.getHubAssetInfo(payload.token_dst_blockchain_id, payload.token_dst)?.asset;\n\n invariant(tokenSrc, 'hub asset not found for token_src');\n invariant(tokenDst, 'hub asset not found for token_dst');\n\n try {\n const response = await fetch(`${config.solverApiEndpoint}/quote`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token_src: tokenSrc,\n token_dst: tokenDst,\n amount: payload.amount.toString(),\n quote_type: payload.quote_type,\n }),\n });\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n const quoteResponse: SolverIntentQuoteResponseRaw = await response.json();\n\n return {\n ok: true,\n value: {\n quoted_amount: BigInt(quoteResponse.quoted_amount),\n } satisfies SolverIntentQuoteResponse,\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.getQuote] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: SolverIntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n\n /**\n * Post execution of intent order to Solver API\n * @example\n * // request\n * {\n * \"intent_tx_hash\": \"0xba3dce19347264db32ced212ff1a2036f20d9d2c7493d06af15027970be061af\",\n * \"quote_uuid\": \"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\"\n * }\n *\n * // response\n * {\n * \"ok\": true,\n * \"value\": {\n * \"output\": {\n * \"answer\":\"OK\",\n * \"task_id\":\"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\"\n * }\n * }\n * }\n */\n public static async postExecution(\n request: SolverExecutionRequest,\n config: SolverConfig,\n ): Promise<Result<SolverExecutionResponse, SolverErrorResponse>> {\n try {\n const response = await retry(() =>\n fetch(`${config.solverApiEndpoint}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }),\n );\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n return {\n ok: true,\n value: await response.json(),\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.postExecution] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: SolverIntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n\n public static async getStatus(\n request: SolverIntentStatusRequest,\n config: SolverConfig,\n ): Promise<Result<SolverIntentStatusResponse, SolverErrorResponse>> {\n invariant(request.intent_tx_hash.length > 0, 'Empty intent_tx_hash');\n try {\n const response = await fetch(`${config.solverApiEndpoint}/status`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n return {\n ok: false,\n error: await response.json(),\n };\n }\n\n return {\n ok: true,\n value: await response.json(),\n };\n } catch (e: unknown) {\n console.error(`[SolverApiService.getStatus] failed. Details: ${JSON.stringify(e)}`);\n return {\n ok: false,\n error: {\n detail: {\n code: SolverIntentErrorCode.UNKNOWN,\n message: e ? JSON.stringify(e) : 'Unknown error',\n },\n },\n };\n }\n }\n}\n","import {\n http,\n type Account,\n type Address,\n type Chain,\n type CustomTransport,\n type Hex,\n type HttpTransport,\n type PublicClient,\n type WalletClient,\n createPublicClient,\n} from 'viem';\nimport { getEvmViemChain } from '../constants.js';\nimport type { InjectiveSpokeProvider } from './injective/InjectiveSpokeProvider.js';\nimport type { IconSpokeProvider } from './icon/IconSpokeProvider.js';\nimport type { SolanaSpokeProvider } from './solana/SolanaSpokeProvider.js';\nimport type { StellarSpokeProvider } from './stellar/StellarSpokeProvider.js';\nimport type { SuiSpokeProvider } from './sui/SuiSpokeProvider.js';\nimport {\n SONIC_MAINNET_CHAIN_ID,\n type IEvmWalletProvider,\n type IStellarWalletProvider,\n type ISuiWalletProvider,\n type IIconWalletProvider,\n type IInjectiveWalletProvider,\n type ISolanaWalletProvider,\n type EvmSpokeChainConfig,\n type SonicSpokeChainConfig,\n type SpokeChainConfig,\n type EvmChainId,\n type EvmHubChainConfig,\n} from '@sodax/types';\nimport { type ConfigService, getHubChainConfig } from '../../index.js';\n\nexport type CustomProvider = { request(...args: unknown[]): Promise<unknown> };\n\nexport interface ISpokeProvider {\n readonly walletProvider: IWalletProvider;\n readonly chainConfig: SpokeChainConfig;\n}\n\nexport type EvmUninitializedBrowserConfig = {\n userAddress: Address;\n chain: EvmChainId;\n provider: CustomProvider;\n};\n\nexport type EvmUninitializedPrivateKeyConfig = {\n chain: EvmChainId;\n privateKey: Hex | undefined;\n provider: string; // rpc url\n};\n\nexport type EvmUninitializedConfig = EvmUninitializedBrowserConfig | EvmUninitializedPrivateKeyConfig;\n\nexport type EvmInitializedConfig = {\n walletClient: WalletClient<CustomTransport | HttpTransport, Chain, Account>;\n publicClient: PublicClient<CustomTransport | HttpTransport>;\n};\n\nexport type EvmHubProviderConfig = {\n hubRpcUrl: string;\n chainConfig: EvmHubChainConfig;\n};\n\nexport type EvmHubProviderConstructorParams = {\n config?: EvmHubProviderConfig;\n configService: ConfigService;\n};\n\nexport class EvmHubProvider {\n public readonly publicClient: PublicClient<HttpTransport>;\n public readonly chainConfig: EvmHubChainConfig;\n public readonly configService: ConfigService;\n\n constructor({ config, configService }: EvmHubProviderConstructorParams) {\n if (config) {\n this.publicClient = createPublicClient({\n transport: http(config.hubRpcUrl),\n chain: getEvmViemChain(config.chainConfig.chain.id),\n });\n this.chainConfig = config.chainConfig;\n } else {\n // default to Sonic mainnet\n this.publicClient = createPublicClient({\n transport: http('https://rpc.soniclabs.com'),\n chain: getEvmViemChain(SONIC_MAINNET_CHAIN_ID),\n });\n this.chainConfig = getHubChainConfig();\n }\n this.configService = configService;\n }\n}\n\nexport class SonicSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: IEvmWalletProvider;\n public readonly chainConfig: SonicSpokeChainConfig;\n public readonly publicClient: PublicClient<HttpTransport>;\n\n constructor(walletProvider: IEvmWalletProvider, chainConfig: SonicSpokeChainConfig, rpcUrl?: string) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n if (rpcUrl) {\n this.publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n } else {\n this.publicClient = createPublicClient({\n transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n }\n }\n}\n\nexport class EvmSpokeProvider implements ISpokeProvider {\n public readonly walletProvider: IEvmWalletProvider;\n public readonly chainConfig: EvmSpokeChainConfig;\n public readonly publicClient: PublicClient<HttpTransport>;\n\n constructor(walletProvider: IEvmWalletProvider, chainConfig: EvmSpokeChainConfig, rpcUrl?: string) {\n this.walletProvider = walletProvider;\n this.chainConfig = chainConfig;\n if (rpcUrl) {\n this.publicClient = createPublicClient({\n transport: http(rpcUrl),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n } else {\n this.publicClient = createPublicClient({\n transport: http(getEvmViemChain(chainConfig.chain.id).rpcUrls.default.http[0]),\n chain: getEvmViemChain(chainConfig.chain.id),\n });\n }\n }\n}\n\nexport { InjectiveSpokeProvider } from './injective/InjectiveSpokeProvider.js';\nexport { IconSpokeProvider } from './icon/IconSpokeProvider.js';\nexport { getIconAddressBytes } from './icon/utils.js';\n\nexport type IWalletProvider =\n | IEvmWalletProvider\n | IInjectiveWalletProvider\n | IStellarWalletProvider\n | ISuiWalletProvider\n | IIconWalletProvider\n | IInjectiveWalletProvider\n | ISolanaWalletProvider;\n\nexport type SpokeProvider = (\n | EvmSpokeProvider\n | InjectiveSpokeProvider\n | IconSpokeProvider\n | SuiSpokeProvider\n | StellarSpokeProvider\n | SolanaSpokeProvider\n | SonicSpokeProvider\n) &\n ISpokeProvider;\n","import invariant from 'tiny-invariant';\nimport {\n DEFAULT_DEADLINE_OFFSET,\n DEFAULT_RELAYER_API_ENDPOINT,\n DEFAULT_RELAY_TX_TIMEOUT,\n Erc20Service,\n type EvmHubProvider,\n type GetRelayResponse,\n type IntentDeliveryInfo,\n type IntentRelayRequest,\n type RelayErrorCode,\n SonicSpokeService,\n type SpokeProvider,\n SpokeService,\n type WaitUntilIntentExecutedPayload,\n adjustAmountByFee,\n calculateFeeAmount,\n calculatePercentageFeeAmount,\n deriveUserWalletAddress,\n encodeContractCalls,\n isConfiguredSolverConfig,\n submitTransaction,\n waitUntilIntentExecuted,\n} from '../index.js';\nimport type {\n EvmContractCall,\n FeeAmount,\n GetSpokeDepositParamsType,\n SolverErrorResponse,\n SolverExecutionRequest,\n SolverExecutionResponse,\n SolverIntentQuoteRequest,\n SolverIntentQuoteResponse,\n SolverIntentStatusRequest,\n SolverIntentStatusResponse,\n Result,\n SolverConfigParams,\n SwapServiceConfig,\n TxReturnType,\n GetEstimateGasReturnType,\n GetAddressType,\n OptionalRaw,\n Prettify,\n OptionalTimeout,\n OptionalFee,\n} from '../shared/types.js';\nimport { EvmSolverService } from './EvmSolverService.js';\nimport { SolverApiService } from './SolverApiService.js';\nimport {\n SONIC_MAINNET_CHAIN_ID,\n type SpokeChainId,\n type Address,\n type Hex,\n type Hash,\n type HttpUrl,\n SOLANA_MAINNET_CHAIN_ID,\n type IntentRelayChainId,\n getIntentRelayChainId,\n getSolverConfig,\n type Token,\n} from '@sodax/types';\nimport { StellarSpokeService } from '../shared/services/spoke/StellarSpokeService.js';\nimport { EvmSpokeProvider } from '../shared/entities/Providers.js';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\nimport { SonicSpokeProvider } from '../shared/entities/Providers.js';\nimport { StellarSpokeProvider } from '../shared/entities/stellar/StellarSpokeProvider.js';\n\nexport type CreateIntentParams = {\n inputToken: string; // The address of the input token on spoke chain\n outputToken: string; // The address of the output token on spoke chain\n inputAmount: bigint; // The amount of input tokens\n minOutputAmount: bigint; // The minimum amount of output tokens to accept\n deadline: bigint; // Optional timestamp after which intent expires (0 = no deadline)\n allowPartialFill: boolean; // Whether the intent can be partially filled\n srcChain: SpokeChainId; // Chain ID where input tokens originate\n dstChain: SpokeChainId; // Chain ID where output tokens should be delivered\n srcAddress: string; // Source address (original address on spoke chain)\n dstAddress: string; // Destination address (original address on spoke chain)\n solver: Address; // Optional specific solver address (address(0) = any solver)\n data: Hex; // Additional arbitrary data\n};\n\nexport type Intent = {\n intentId: bigint; // Unique identifier for the intent\n creator: Address; // Address that created the intent (Wallet abstraction address on hub chain)\n inputToken: Address; // Token the user is providing (hub asset address on hub chain)\n outputToken: Address; // Token the user wants to receive (hub asset address on hub chain)\n inputAmount: bigint; // Amount of input tokens\n minOutputAmount: bigint; // Minimum amount of output tokens to accept\n deadline: bigint; // Optional timestamp after which intent expires (0 = no deadline)\n allowPartialFill: boolean; // Whether the intent can be partially filled\n srcChain: IntentRelayChainId; // Chain ID where input tokens originate\n dstChain: IntentRelayChainId; // Chain ID where output tokens should be delivered\n srcAddress: Hex; // Source address in bytes (original address on spoke chain)\n dstAddress: Hex; // Destination address in bytes (original address on spoke chain)\n solver: Address; // Optional specific solver address (address(0) = any solver)\n data: Hex; // Additional arbitrary data\n};\n\n// Data types for arbitrary data\nexport enum IntentDataType {\n FEE = 1,\n}\n\nexport type FeeData = {\n fee: bigint;\n receiver: Address;\n};\n\nexport type IntentData = {\n type: IntentDataType;\n data: Hex;\n};\n\nexport type IntentState = {\n exists: boolean;\n remainingInput: bigint;\n receivedOutput: bigint;\n pendingPayment: boolean;\n};\n\nexport type IntentCreationFailedErrorData = {\n payload: CreateIntentParams;\n error: unknown;\n};\n\nexport type IntentSubmitTxFailedErrorData = {\n payload: IntentRelayRequest<'submit'>;\n error: unknown;\n};\n\nexport type IntentWaitUntilIntentExecutedFailedErrorData = {\n payload: WaitUntilIntentExecutedPayload;\n error: unknown;\n};\n\nexport type IntentPostExecutionFailedErrorData = SolverErrorResponse & {\n intent: Intent;\n intentDeliveryInfo: IntentDeliveryInfo;\n};\n\nexport type IntentErrorCode = RelayErrorCode | 'UNKNOWN' | 'CREATION_FAILED' | 'POST_EXECUTION_FAILED';\nexport type IntentErrorData<T extends IntentErrorCode> = T extends 'RELAY_TIMEOUT'\n ? IntentWaitUntilIntentExecutedFailedErrorData\n : T extends 'CREATION_FAILED'\n ? IntentCreationFailedErrorData\n : T extends 'SUBMIT_TX_FAILED'\n ? IntentSubmitTxFailedErrorData\n : T extends 'POST_EXECUTION_FAILED'\n ? IntentPostExecutionFailedErrorData\n : T extends 'UNKNOWN'\n ? IntentCreationFailedErrorData\n : never;\n\nexport type IntentError<T extends IntentErrorCode = IntentErrorCode> = {\n code: T;\n data: IntentErrorData<T>;\n};\n\nexport type SwapParams<S extends SpokeProvider> = Prettify<\n {\n intentParams: CreateIntentParams;\n spokeProvider: S;\n skipSimulation?: boolean;\n } & OptionalFee\n>;\n\nexport type SwapServiceConstructorParams = {\n config: SolverConfigParams | undefined;\n configService: ConfigService;\n hubProvider: EvmHubProvider;\n relayerApiEndpoint?: HttpUrl;\n};\n\nexport class SwapService {\n readonly config: SwapServiceConfig;\n readonly hubProvider: EvmHubProvider;\n readonly configService: ConfigService;\n\n public constructor({ config, configService, hubProvider, relayerApiEndpoint }: SwapServiceConstructorParams) {\n if (!config) {\n this.config = {\n ...getSolverConfig(SONIC_MAINNET_CHAIN_ID), // default to mainnet config\n partnerFee: undefined,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else if (isConfiguredSolverConfig(config)) {\n this.config = {\n ...config,\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else {\n this.config = {\n ...getSolverConfig(hubProvider.chainConfig.chain.id), // default to mainnet config\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n }\n this.configService = configService;\n this.hubProvider = hubProvider;\n }\n\n /**\n * Estimate the gas for a raw transaction.\n * @param {TxReturnType<T, true>} params - The parameters for the raw transaction.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Promise<GetEstimateGasReturnType<T>>} A promise that resolves to the gas.\n */\n public static async estimateGas<T extends SpokeProvider = SpokeProvider>(\n params: TxReturnType<T, true>,\n spokeProvider: T,\n ): Promise<GetEstimateGasReturnType<T>> {\n return SpokeService.estimateGas(params, spokeProvider) as Promise<GetEstimateGasReturnType<T>>;\n }\n\n /**\n * Request a quote from the solver API\n * @param {SolverIntentQuoteRequest} payload - The solver intent quote request\n * @returns {Promise<Result<SolverIntentQuoteResponse, SolverErrorResponse>>} The intent quote response\n *\n * @example\n * const payload = {\n * \"token_src\":\"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"token_dst\":\"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"token_src_blockchain_id\":\"0x38.bsc\",\n * \"token_dst_blockchain_id\":\"0xa4b1.arbitrum\",\n * \"amount\":1000000000000000n,\n * \"quote_type\": \"exact_input\"\n * } satisfies SolverIntentQuoteRequest\n *\n * const response = await swapService.getQuote(payload);\n *\n * if (response.ok) {\n * const quotedAmount = response.value.quoted_amount;\n * console.log('Quoted amount:', quotedAmount);\n * } else {\n * console.error('Quote failed:', response.error);\n * }\n */\n public async getQuote(\n payload: SolverIntentQuoteRequest,\n ): Promise<Result<SolverIntentQuoteResponse, SolverErrorResponse>> {\n payload = {\n ...payload,\n amount: adjustAmountByFee(payload.amount, this.config.partnerFee, payload.quote_type),\n } satisfies SolverIntentQuoteRequest;\n return SolverApiService.getQuote(payload, this.config, this.configService);\n }\n\n /**\n * Get the partner fee for a given input amount\n * @param {bigint} inputAmount - The amount of input tokens\n * @returns {bigint} The partner fee amount (denominated in input tokens)\n *\n * @example\n * const fee: bigint = swapService.getPartnerFee(1000000000000000n);\n * console.log('Partner fee:', fee);\n */\n public getPartnerFee(inputAmount: bigint): bigint {\n if (!this.config.partnerFee) {\n return 0n;\n }\n\n return calculateFeeAmount(inputAmount, this.config.partnerFee);\n }\n\n /**\n * Get the solver fee for a given input amount (0.1% fee)\n * @param {bigint} inputAmount - The amount of input tokens\n * @returns {bigint} The solver fee amount (denominated in input tokens)\n *\n * @example\n * const fee: bigint = swapService.getSolverFee(1000000000000000n);\n * console.log('Solver fee:', fee);\n */\n public getSolverFee(inputAmount: bigint): bigint {\n return calculatePercentageFeeAmount(inputAmount, 10);\n }\n\n /**\n * Get the status of an intent from Solver API\n * NOTE: intentHash should be retrieved from relay packet dst_tx_hash property (see createAndSubmitIntent)\n * @param {SolverIntentStatusRequest} request - The intent status request\n * @returns {Promise<Result<SolverIntentStatusResponse, SolverErrorResponse>>} The solver intent status response\n *\n * @example\n * const request = {\n * \"intent_tx_hash\": \"a0dd7652-b360-4123-ab2d-78cfbcd20c6b\" // destination tx hash from relay packet\n * } satisfies SolverIntentStatusRequest\n *\n * const response = await swapService.getStatus(request);\n *\n * if (response.ok) {\n * const { status, intent_hash } = response.value;\n * console.log('Status:', status);\n * console.log('Intent hash:', intent_hash);\n * } else {\n * // handle error\n * }\n */\n public async getStatus(\n request: SolverIntentStatusRequest,\n ): Promise<Result<SolverIntentStatusResponse, SolverErrorResponse>> {\n return SolverApiService.getStatus(request, this.config);\n }\n\n /**\n * Post execution of intent order transaction executed on hub chain to Solver API\n * @param {SolverExecutionRequest} request - The intent execution request\n * @returns {Promise<Result<SolverExecutionResponse, SolverErrorResponse>>} The intent execution response\n *\n * @example\n * const request = {\n * \"intent_tx_hash\": \"0xba3dce19347264db32ced212ff1a2036f20d9d2c7493d06af15027970be061af\",\n * } satisfies SolverExecutionRequest\n *\n * const response = await swapService.postExecution(request);\n *\n * if (response.ok) {\n * const { answer, intent_hash } = response.value;\n * console.log('Answer:', answer);\n * console.log('Intent hash:', intent_hash);\n * } else {\n * // handle error\n * }\n */\n public async postExecution(\n request: SolverExecutionRequest,\n ): Promise<Result<SolverExecutionResponse, SolverErrorResponse>> {\n return SolverApiService.postExecution(request, this.config);\n }\n\n /**\n * Submit intent transaction to the relayer API\n * @param {IntentRelayRequest<'submit'>} submitPayload - The intent relay request\n * @returns {Promise<Result<GetRelayResponse<'submit'>, IntentError<'SUBMIT_TX_FAILED'>>>} The intent relay response\n *\n * @example\n * const submitPayload = {\n * \"action\": \"submit\",\n * \"params\": {\n * \"chain_id\": \"0x38.bsc\",\n * \"tx_hash\": \"0xba3dce19347264db32ced212ff1a2036f20d9d2c7493d06af15027970be061af\",\n * },\n * } satisfies IntentRelayRequest<'submit'>;\n *\n * const submitResult = await swapService.submitIntent(submitPayload);\n *\n * if (submitResult.ok) {\n * const { success, message } = submitResult.value;\n * console.log('Success:', success);\n * console.log('Message:', message);\n * } else {\n * // handle error\n * }\n */\n public async submitIntent(\n submitPayload: IntentRelayRequest<'submit'>,\n ): Promise<Result<GetRelayResponse<'submit'>, IntentError<'SUBMIT_TX_FAILED'>>> {\n try {\n const submitResult = await submitTransaction(submitPayload, this.config.relayerApiEndpoint);\n\n if (!submitResult.success) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n data: {\n payload: submitPayload,\n error: new Error(submitResult.message),\n },\n },\n };\n }\n\n return {\n ok: true,\n value: submitResult,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n data: {\n payload: submitPayload,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Syntactic sugar for createAndSubmitIntent: creates an intent and submits it to the Solver API and Relayer API.\n *\n * @param {Prettify<SwapParams<S> & OptionalTimeout>} params - Object containing:\n * - intentParams: The parameters for creating the intent.\n * - spokeProvider: The spoke provider instance.\n * - fee: (Optional) Partner fee configuration.\n * - timeout: (Optional) Timeout in milliseconds for the transaction (default: 60 seconds).\n * - skipSimulation: (Optional) Whether to skip transaction simulation (default: false).\n * @returns {Promise<Result<[SolverExecutionResponse, Intent, IntentDeliveryInfo], IntentError<IntentErrorCode>>>}\n * A promise resolving to a Result containing a tuple of SolverExecutionResponse, Intent, and intent delivery info,\n * or an IntentError if the operation fails.\n *\n * @example\n * const swapResult = await swapService.swap({\n * intentParams: {\n * inputToken: \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\",\n * outputToken: \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\",\n * inputAmount: 1000000000000000n,\n * minOutputAmount: 900000000000000n,\n * deadline: 0n,\n * allowPartialFill: false,\n * srcChain: \"0x38.bsc\",\n * dstChain: \"0xa4b1.arbitrum\",\n * srcAddress: \"0x..\",\n * dstAddress: \"0x...\",\n * solver: \"0x..\",\n * data: \"0x..\",\n * },\n * spokeProvider,\n * fee, // optional\n * timeout, // optional\n * });\n *\n * if (swapResult.ok) {\n * const [solverExecutionResponse, intent, intentDeliveryInfo] = swapResult.value;\n * console.log('Intent execution response:', solverExecutionResponse);\n * console.log('Intent:', intent);\n * console.log('Intent delivery info:', intentDeliveryInfo);\n * } else {\n * // handle error\n * }\n */\n public async swap<S extends SpokeProvider>({\n intentParams: params,\n spokeProvider,\n fee = this.config.partnerFee,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n skipSimulation = false,\n }: Prettify<SwapParams<S> & OptionalTimeout>): Promise<\n Result<[SolverExecutionResponse, Intent, IntentDeliveryInfo], IntentError<IntentErrorCode>>\n > {\n return this.createAndSubmitIntent({\n intentParams: params,\n spokeProvider,\n fee,\n timeout,\n skipSimulation,\n });\n }\n\n /**\n * Creates an intent and submits it to the Solver API and Relayer API\n * @param {Prettify<SwapParams<S> & OptionalTimeout>} params - Object containing:\n * - intentParams: The parameters for creating the intent.\n * - spokeProvider: The spoke provider instance.\n * - fee: (Optional) Partner fee configuration.\n * - timeout: (Optional) Timeout in milliseconds for the transaction (default: 60 seconds).\n * - skipSimulation: (Optional) Whether to skip transaction simulation (default: false).\n * @returns {Promise<Result<[SolverExecutionResponse, Intent, IntentDeliveryInfo], IntentError<IntentErrorCode>>>}\n * A promise resolving to a Result containing a tuple of SolverExecutionResponse, Intent, and intent delivery info,\n * or an IntentError if the operation fails.\n *\n * @example\n * const createAndSubmitIntentResult = await swapService.createAndSubmitIntent({\n * intentParams: {\n * inputToken: \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\",\n * outputToken: \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\",\n * inputAmount: 1000000000000000n,\n * minOutputAmount: 900000000000000n,\n * deadline: 0n,\n * allowPartialFill: false,\n * srcChain: \"0x38.bsc\",\n * dstChain: \"0xa4b1.arbitrum\",\n * srcAddress: \"0x..\",\n * dstAddress: \"0x...\",\n * solver: \"0x..\",\n * data: \"0x..\",\n * },\n * spokeProvider,\n * fee, // optional\n * timeout, // optional\n * });\n *\n *\n * if (createAndSubmitIntentResult.ok) {\n * const [solverExecutionResponse, intent, intentDeliveryInfo] = createAndSubmitIntentResult.value;\n * console.log('Intent execution response:', solverExecutionResponse);\n * console.log('Intent:', intent);\n * console.log('Intent delivery info:', intentDeliveryInfo);\n * } else {\n * // handle error\n * }\n */\n public async createAndSubmitIntent<S extends SpokeProvider>({\n intentParams: params,\n spokeProvider,\n fee = this.config.partnerFee,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n skipSimulation = false,\n }: Prettify<SwapParams<S> & OptionalTimeout>): Promise<\n Result<[SolverExecutionResponse, Intent, IntentDeliveryInfo], IntentError<IntentErrorCode>>\n > {\n try {\n // first create the deposit with intent data on spoke chain\n const createIntentResult = await this.createIntent({\n intentParams: params,\n spokeProvider,\n fee,\n raw: false,\n skipSimulation,\n });\n\n if (!createIntentResult.ok) {\n return createIntentResult;\n }\n\n const [spokeTxHash, intent, data] = createIntentResult.value;\n\n // then verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(spokeTxHash, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATION_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n // then submit the deposit tx hash of spoke chain to the intent relay\n let dstIntentTxHash: string;\n\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const intentRelayChainId = getIntentRelayChainId(params.srcChain).toString();\n const submitPayload: IntentRelayRequest<'submit'> =\n params.srcChain === SOLANA_MAINNET_CHAIN_ID && data\n ? {\n action: 'submit',\n params: {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n data: {\n address: intent.creator,\n payload: data,\n },\n },\n }\n : {\n action: 'submit',\n params: {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n },\n };\n\n const submitResult = await this.submitIntent(submitPayload);\n\n if (!submitResult.ok) {\n return submitResult;\n }\n\n // then wait until the intent is executed on the intent relay\n const packet = await waitUntilIntentExecuted({\n intentRelayChainId,\n spokeTxHash,\n timeout,\n apiUrl: this.config.relayerApiEndpoint,\n });\n\n if (!packet.ok) {\n return {\n ok: false,\n error: packet.error,\n };\n }\n dstIntentTxHash = packet.value.dst_tx_hash;\n } else {\n dstIntentTxHash = spokeTxHash;\n }\n\n // then post execution of intent order transaction executed on hub chain to Solver API\n const result = await this.postExecution({\n intent_tx_hash: dstIntentTxHash as `0x${string}`,\n });\n\n if (!result.ok) {\n return {\n ok: false,\n error: {\n code: 'POST_EXECUTION_FAILED',\n data: {\n ...result.error,\n intent,\n intentDeliveryInfo: {\n srcChainId: params.srcChain,\n srcTxHash: spokeTxHash,\n srcAddress: params.srcAddress,\n dstChainId: params.dstChain,\n dstTxHash: dstIntentTxHash,\n dstAddress: params.dstAddress,\n } satisfies IntentDeliveryInfo,\n },\n },\n };\n }\n\n return {\n ok: true,\n value: [\n result.value,\n intent,\n {\n srcChainId: params.srcChain,\n srcTxHash: spokeTxHash,\n srcAddress: params.srcAddress,\n dstChainId: params.dstChain,\n dstTxHash: dstIntentTxHash,\n dstAddress: params.dstAddress,\n } satisfies IntentDeliveryInfo,\n ],\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNKNOWN',\n data: {\n payload: params,\n error: error,\n },\n } satisfies IntentError<'UNKNOWN'>,\n };\n }\n }\n\n /**\n * Check whether the Asset Manager contract is allowed to spend the specified amount of tokens\n * @param {Prettify<SwapParams<S>} params - Object containing:\n * - intentParams: The parameters for creating the intent.\n * - spokeProvider: The spoke provider instance.\n * @returns {Promise<Result<boolean>>} - Returns true if allowance is sufficient, false if approval is needed\n *\n * @example\n * const createIntentParams = {\n * inputToken: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', // BSC ETH token address\n * outputToken: '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f', // ARB WBTC token address\n * inputAmount: 1000000000000000n, // The amount of input tokens\n * minOutputAmount: 900000000000000n, // min amount you are expecting to receive\n * deadline: 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * allowPartialFill: false, // Whether the intent can be partially filled\n * srcChain: BSC_MAINNET_CHAIN_ID, // Chain ID where input tokens originate\n * dstChain: ARBITRUM_MAINNET_CHAIN_ID, // Chain ID where output tokens should be delivered\n * srcAddress: '0x..', // Source address (original address on spoke chain)\n * dstAddress: '0x...', // Destination address (original address on spoke chain)\n * solver: '0x0000000000000000000000000000000000000000', // Optional specific solver address\n * data: '0x', // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const isAllowanceValid = await sodax.swap.isAllowanceValid({\n * intentParams: createIntentParams,\n * spokeProvider: bscSpokeProvider,\n * });\n *\n * if (!isAllowanceValid.ok) {\n * // Handle error\n * console.error('Failed to check allowance:', isAllowanceValid.error);\n * } else if (!isAllowanceValid.value) {\n * // Need to approve tokens\n * console.log('Approval required');\n * }\n */\n public async isAllowanceValid<S extends SpokeProvider>({\n intentParams: params,\n spokeProvider,\n }: SwapParams<S>): Promise<Result<boolean>> {\n // apply fee to input amount without changing original params\n try {\n if (spokeProvider instanceof EvmSpokeProvider) {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n return await Erc20Service.isAllowanceValid(\n params.inputToken as GetAddressType<EvmSpokeProvider>,\n params.inputAmount,\n walletAddress,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n );\n }\n\n if (spokeProvider instanceof SonicSpokeProvider) {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n return await Erc20Service.isAllowanceValid(\n params.inputToken as GetAddressType<SonicSpokeProvider>,\n params.inputAmount,\n walletAddress,\n getSolverConfig(SONIC_MAINNET_CHAIN_ID).intentsContract,\n spokeProvider,\n );\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n return {\n ok: true,\n value: await StellarSpokeService.hasSufficientTrustline(params.inputToken, params.inputAmount, spokeProvider),\n };\n }\n\n return {\n ok: true,\n value: true,\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Approve the Asset Manager contract to spend tokens on behalf of the user (required for EVM chains)\n * @param {Prettify<SwapParams<S> & OptionalRaw<R>>} params - Object containing:\n * - intentParams: The parameters for creating the intent.\n * - spokeProvider: The spoke provider instance.\n * - raw: (Optional) Whether to return the raw transaction data instead of executing it\n * @returns {Promise<Result<TxReturnType<S, R>>>} - Returns transaction hash or raw transaction data\n *\n * @example\n * const createIntentParams = {\n * inputToken: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', // BSC ETH token address\n * outputToken: '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f', // ARB WBTC token address\n * inputAmount: 1000000000000000n, // The amount of input tokens\n * minOutputAmount: 900000000000000n, // min amount you are expecting to receive\n * deadline: 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * allowPartialFill: false, // Whether the intent can be partially filled\n * srcChain: BSC_MAINNET_CHAIN_ID, // Chain ID where input tokens originate\n * dstChain: ARBITRUM_MAINNET_CHAIN_ID, // Chain ID where output tokens should be delivered\n * srcAddress: '0x..', // Source address (original address on spoke chain)\n * dstAddress: '0x...', // Destination address (original address on spoke chain)\n * solver: '0x0000000000000000000000000000000000000000', // Optional specific solver address\n * data: '0x', // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const approveResult = await sodax.swap.approve({\n * intentParams: createIntentParams,\n * spokeProvider: bscSpokeProvider,\n * });\n *\n * if (!approveResult.ok) {\n * // Handle error\n * console.error('Failed to approve tokens:', approveResult.error);\n * } else {\n * // Transaction hash or raw transaction data\n * const txHash = approveResult.value;\n * console.log('Approval transaction:', txHash);\n * }\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>({\n intentParams: params,\n spokeProvider,\n raw,\n }: Prettify<SwapParams<S> & OptionalRaw<R>>): Promise<Result<TxReturnType<S, R>>> {\n try {\n if (spokeProvider instanceof EvmSpokeProvider) {\n const result = await Erc20Service.approve(\n params.inputToken as GetAddressType<EvmSpokeProvider>,\n params.inputAmount,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof SonicSpokeProvider) {\n const result = await Erc20Service.approve(\n params.inputToken as GetAddressType<SonicSpokeProvider>,\n params.inputAmount,\n getSolverConfig(SONIC_MAINNET_CHAIN_ID).intentsContract,\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n const result = await StellarSpokeService.requestTrustline(\n params.inputToken,\n params.inputAmount,\n spokeProvider,\n raw,\n );\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n return {\n ok: false,\n error: new Error('Approve only supported for EVM (approve) and Stellar (trustline) spoke chains'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Creates an intent by handling token approval and intent creation\n * NOTE: This method does not submit the intent to the Solver API\n * @param {Prettify<SwapParams<S> & OptionalRaw<R>>} params - Object containing:\n * - intentParams: The parameters for creating the intent.\n * - spokeProvider: The spoke provider instance.\n * - fee: (Optional) Partner fee configuration.\n * - raw: (Optional) Whether to return the raw transaction data instead of executing it\n * - skipSimulation: (Optional) Whether to skip transaction simulation (default: false).\n * @returns {Promise<Result<[TxReturnType<S, R>, Intent & FeeAmount, Hex], IntentError<'CREATION_FAILED'>>>} The encoded contract call or raw transaction data, Intent and intent data as hex\n *\n * @example\n * const payload = {\n * \"inputToken\": \"0x2170Ed0880ac9A755fd29B2688956BD959F933F8\", // BSC ETH token address\n * \"outputToken\": \"0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f\", // ARB WBTC token address\n * \"inputAmount\": 1000000000000000n, // The amount of input tokens\n * \"minOutputAmount\": 900000000000000n, // min amount you are expecting to receive\n * \"deadline\": 0n, // Optional timestamp after which intent expires (0 = no deadline)\n * \"allowPartialFill\": false, // Whether the intent can be partially filled\n * \"srcChain\": \"0x38.bsc\", // Chain ID where input tokens originate\n * \"dstChain\": \"0xa4b1.arbitrum\", // Chain ID where output tokens should be delivered\n * \"srcAddress\": \"0x..\", // Source address (original address on spoke chain)\n * \"dstAddress\": \"0x...\", // Destination address (original address on spoke chain)\n * \"solver\": \"0x..\", // Optional specific solver address (address(0) = any solver)\n * \"data\": \"0x..\", // Additional arbitrary data\n * } satisfies CreateIntentParams;\n *\n * const createIntentResult = await swapService.createIntent({\n * intentParams: payload,\n * spokeProvider,\n * fee, // optional\n * raw, // optional\n * });\n *\n * if (createIntentResult.ok) {\n * const [txResult, intent, intentData] = createIntentResult.value;\n * console.log('Transaction result:', txResult);\n * console.log('Intent:', intent);\n * console.log('Intent data:', intentData);\n * } else {\n * // handle error\n * }\n */\n public async createIntent<S extends SpokeProvider, R extends boolean = false>({\n intentParams: params,\n spokeProvider,\n fee = this.config.partnerFee,\n raw,\n }: Prettify<SwapParams<S> & OptionalRaw<R>>): Promise<\n Result<[TxReturnType<S, R>, Intent & FeeAmount, Hex], IntentError<'CREATION_FAILED'>>\n > {\n invariant(\n this.configService.isValidOriginalAssetAddress(params.srcChain, params.inputToken),\n `Unsupported spoke chain token (params.srcChain): ${params.srcChain}, params.inputToken): ${params.inputToken}`,\n );\n invariant(\n this.configService.isValidOriginalAssetAddress(params.dstChain, params.outputToken),\n `Unsupported spoke chain token (params.dstChain): ${params.dstChain}, params.outputToken): ${params.outputToken}`,\n );\n invariant(\n this.configService.isValidSpokeChainId(params.srcChain),\n `Invalid spoke chain (params.srcChain): ${params.srcChain}`,\n );\n invariant(\n this.configService.isValidSpokeChainId(params.dstChain),\n `Invalid spoke chain (params.dstChain): ${params.dstChain}`,\n );\n\n try {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n invariant(\n params.srcAddress.toLowerCase() === walletAddress.toLowerCase(),\n 'srcAddress must be the same as wallet address',\n );\n\n // derive users hub wallet address\n const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {\n // on hub chain create intent directly\n\n const [txResult, intent, feeAmount, data] = await SonicSpokeService.createSwapIntent(\n params,\n creatorHubWalletAddress,\n this.config,\n fee,\n spokeProvider as SonicSpokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: [\n txResult satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>,\n { ...intent, feeAmount } as Intent & FeeAmount,\n data,\n ],\n };\n }\n\n {\n // construct the intent data\n const [data, intent, feeAmount] = EvmSolverService.constructCreateIntentData(\n {\n ...params,\n srcAddress: walletAddress,\n },\n creatorHubWalletAddress,\n this.config,\n this.configService,\n fee,\n );\n\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: creatorHubWalletAddress,\n token: params.inputToken,\n amount: params.inputAmount,\n data: data,\n } as GetSpokeDepositParamsType<S>,\n spokeProvider satisfies S,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: [txResult as TxReturnType<S, R>, { ...intent, feeAmount } as Intent & FeeAmount, data],\n };\n }\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Cancels an intent\n * @param {Intent} intent - The intent to cancel\n * @param {ISpokeProvider} spokeProvider - The spoke provider\n * @param {boolean} raw - Whether to return the raw transaction\n * @returns {Promise<TxReturnType<S, R>>} The encoded contract call\n */\n public async cancelIntent<S extends SpokeProvider, R extends boolean = false>(\n intent: Intent,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>>> {\n try {\n invariant(\n this.configService.isValidIntentRelayChainId(intent.srcChain),\n `Invalid intent.srcChain: ${intent.srcChain}`,\n );\n invariant(\n this.configService.isValidIntentRelayChainId(intent.dstChain),\n `Invalid intent.dstChain: ${intent.dstChain}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n // derive users hub wallet address\n const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n const calls: EvmContractCall[] = [];\n const intentsContract = this.config.intentsContract;\n calls.push(EvmSolverService.encodeCancelIntent(intent, intentsContract));\n const data = encodeContractCalls(calls);\n const txResult = await SpokeService.callWallet(\n creatorHubWalletAddress,\n data,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Gets an intent from a transaction hash (on Hub chain)\n * @param {Hash} txHash - The transaction hash on Hub chain\n * @returns {Promise<Intent>} The intent\n */\n public getIntent(txHash: Hash): Promise<Intent> {\n return EvmSolverService.getIntent(txHash, this.config, this.hubProvider);\n }\n\n /**\n * Gets the keccak256 hash of an intent. Hash serves as the intent id on Hub chain.\n * @param {Intent} intent - The intent\n * @returns {Hex} The keccak256 hash of the intent\n */\n public getIntentHash(intent: Intent): Hex {\n return EvmSolverService.getIntentHash(intent);\n }\n\n /**\n * Gets the deadline for a swap by querying hub chain block timestamp and adding the deadline offset\n * @param {bigint} deadline (default: 5 minutes) - The deadline offset in seconds for the swap to be cancelled\n * @returns {Promise<bigint>} The deadline for the swap as a sum of hub chain block timestamp and deadline offset\n */\n public async getSwapDeadline(deadline: bigint = DEFAULT_DEADLINE_OFFSET): Promise<bigint> {\n invariant(deadline > 0n, 'Deadline must be greater than 0');\n\n const block = await this.hubProvider.publicClient.getBlock({\n includeTransactions: false,\n blockTag: 'latest',\n });\n return block.timestamp + deadline;\n }\n\n /**\n * Get the list of all supported swap tokens for a given spoke chain ID\n * @param {SpokeChainId} chainId - The chain ID\n * @returns {readonly Token[]} - Array of supported tokens\n */\n public getSupportedSwapTokensByChainId(chainId: SpokeChainId): readonly Token[] {\n return this.configService.getSupportedSwapTokensByChainId(chainId);\n }\n\n /**\n * Get the list of all supported swap tokens\n * @returns {Record<SpokeChainId, readonly Token[]>} - Object containing all supported swap tokens\n */\n public getSupportedSwapTokens(): Record<SpokeChainId, readonly Token[]> {\n return this.configService.getSupportedSwapTokens();\n }\n}\n","import { type Address, decodeAbiParameters, encodeFunctionData, erc20Abi } from 'viem';\nimport { sonicWalletFactoryAbi } from '../../abis/sonicWalletFactory.abi.js';\nimport { variableDebtTokenAbi } from '../../abis/variableDebtToken.abi.js';\nimport { wrappedSonicAbi } from '../../abis/wrappedSonic.abi.js';\nimport { SonicSpokeProvider, type EvmHubProvider, type SpokeProvider } from '../../entities/index.js';\nimport type {\n EvmContractCall,\n EvmReturnType,\n PartnerFee,\n PromiseEvmTxReturnType,\n Result,\n TxReturnType,\n} from '../../types.js';\nimport { EvmSolverService, type CreateIntentParams, type Intent } from '../../../swap/index.js';\nimport type { MoneyMarketService } from '../../../moneyMarket/MoneyMarketService.js';\nimport { encodeContractCalls } from '../../utils/evm-utils.js';\nimport {\n SONIC_MAINNET_CHAIN_ID,\n type EvmRawTransaction,\n type Hex,\n type HubAddress,\n type SpokeChainId,\n type SolverConfig,\n getIntentRelayChainId,\n} from '@sodax/types';\nimport type { MoneyMarketDataService } from '../../../moneyMarket/MoneyMarketDataService.js';\nimport invariant from 'tiny-invariant';\nimport { encodeAddress, randomUint256 } from '../../utils/shared-utils.js';\nimport { Erc20Service, type ConfigService } from '../../../index.js';\n\nexport type SonicSpokeDepositParams = {\n from: Address; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: Address; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit (encoded calls array)\n};\n\nexport type WithdrawInfo = {\n aTokenAddress: Address;\n aTokenAmount: bigint;\n token: Address;\n};\n\nexport type BorrowInfo = {\n variableDebtTokenAddress: Address;\n vaultAddress: Address;\n amount: bigint;\n};\n\nexport class SonicSpokeService {\n private constructor() {}\n\n /**\n /**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param {EvmRawTransaction} rawTx - The raw transaction to estimate the gas for.\n * @param {SonicSpokeProvider} spokeProvider - The EVM spoke provider.\n * @returns {Promise<bigint>} Estimated gas for the transaction.\n *\n * @example\n *\n * const rawTx: EvmRawTransaction = {\n * from: '0x1234...abcd', // sender address\n * to: '0xabcd...1234', // recipient address\n * value: 1000000000000000000n, // 1 ETH in wei\n * data: '0x', // no calldata\n * };\n *\n * // Assume spokeProvider is an initialized EvmSpokeProvider\n * const estimatedGas = await EvmSpokeService.estimateGas(rawTx, spokeProvider);\n * console.log(`Estimated gas: ${estimatedGas}`);\n */\n public static async estimateGas(rawTx: EvmRawTransaction, spokeProvider: SonicSpokeProvider): Promise<bigint> {\n // Use viem's estimateGas with explicit parameter types\n return spokeProvider.publicClient.estimateGas({\n account: rawTx.from,\n to: rawTx.to,\n value: rawTx.value,\n data: rawTx.data,\n });\n }\n\n /**\n * Get the derived address of a contract deployed with CREATE3.\n * @param address - User's address on the specified chain as hex\n * @param provider - Sonic Spoke provider\n * @returns {HubAddress} The computed contract address as a EVM address (hex) string\n */\n public static async getUserRouter(address: Address, provider: SonicSpokeProvider): Promise<HubAddress> {\n return provider.publicClient.readContract({\n address: provider.chainConfig.addresses.walletRouter,\n abi: sonicWalletFactoryAbi,\n functionName: 'getDeployedAddress',\n args: [address],\n });\n }\n\n /**\n * Deposit tokens to the spoke chain using the Sonic wallet abstraction.\n * @param {SonicSpokeDepositParams} params - The parameters for the deposit\n * @param {SonicSpokeProvider} spokeProvider - The provider for the spoke chain\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async deposit<S extends SpokeProvider, R extends boolean = false>(\n params: SonicSpokeDepositParams,\n spokeProvider: S,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n invariant(spokeProvider instanceof SonicSpokeProvider, '[SonicSpokeService] invalid spoke provider');\n\n const userHubAddress = params.to ?? (await SonicSpokeService.getUserRouter(params.from, spokeProvider));\n\n // Decode the data field which contains the encoded calls array\n const calls = Array.from(\n decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n params.data,\n )[0] satisfies readonly EvmContractCall[],\n );\n\n if (params.token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase()) {\n // Add a call to wrap the native token\n const wrapCall = {\n address: spokeProvider.chainConfig.addresses.wrappedSonic,\n value: params.amount,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'deposit',\n }),\n } satisfies EvmContractCall;\n calls.unshift(wrapCall);\n } else {\n const transferFromCall = Erc20Service.encodeTransferFrom(\n params.token,\n params.from,\n userHubAddress,\n params.amount,\n );\n calls.unshift(transferFromCall);\n }\n\n const txData = encodeFunctionData({\n abi: sonicWalletFactoryAbi,\n functionName: 'route',\n args: [\n calls.map(call => ({\n addr: call.address,\n value: call.value,\n data: call.data,\n })),\n ],\n });\n\n const rawTx = {\n from: params.from,\n to: spokeProvider.chainConfig.addresses.walletRouter,\n data: txData,\n value: params.token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase() ? params.amount : 0n,\n } satisfies TxReturnType<SonicSpokeProvider, true>;\n\n if (raw) {\n return Promise.resolve(rawTx) satisfies PromiseEvmTxReturnType<true> as PromiseEvmTxReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n public static async createSwapIntent<R extends boolean = false>(\n createIntentParams: CreateIntentParams,\n creatorHubWalletAddress: Address,\n solverConfig: SolverConfig,\n fee: PartnerFee | undefined,\n spokeProvider: SonicSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): Promise<[TxReturnType<SonicSpokeProvider, R>, Intent, bigint, Hex]> {\n const inputToken = createIntentParams.inputToken as `0x${string}`;\n\n const outputToken =\n createIntentParams.dstChain !== SONIC_MAINNET_CHAIN_ID\n ? hubProvider.configService.getHubAssetInfo(createIntentParams.dstChain, createIntentParams.outputToken)?.asset\n : (createIntentParams.outputToken as `0x${string}`);\n\n invariant(\n inputToken,\n `hub asset not found for spoke chain token (intent.inputToken): ${createIntentParams.inputToken}`,\n );\n invariant(\n outputToken,\n `hub asset not found for spoke chain token (intent.outputToken): ${createIntentParams.outputToken}`,\n );\n\n const [feeData, feeAmount] = EvmSolverService.createIntentFeeData(fee, createIntentParams.inputAmount);\n\n const intentsContract = solverConfig.intentsContract;\n const intent = {\n ...createIntentParams,\n inputToken,\n outputToken,\n inputAmount: createIntentParams.inputAmount - feeAmount,\n srcChain: getIntentRelayChainId(createIntentParams.srcChain),\n dstChain: getIntentRelayChainId(createIntentParams.dstChain),\n srcAddress: encodeAddress(createIntentParams.srcChain, createIntentParams.srcAddress),\n dstAddress: encodeAddress(createIntentParams.dstChain, createIntentParams.dstAddress),\n intentId: randomUint256(),\n creator: creatorHubWalletAddress,\n data: feeData, // fee amount will be deducted from the input amount\n } satisfies Intent;\n\n const txData = EvmSolverService.encodeCreateIntent(intent, intentsContract);\n\n const rawTx = {\n from: await spokeProvider.walletProvider.getWalletAddress(),\n to: txData.address,\n data: txData.data,\n value:\n createIntentParams.inputToken.toLowerCase() === hubProvider.chainConfig.nativeToken.toLowerCase()\n ? createIntentParams.inputAmount\n : 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return [\n rawTx satisfies TxReturnType<SonicSpokeProvider, true> as TxReturnType<SonicSpokeProvider, R>,\n intent,\n feeAmount,\n txData.data,\n ];\n }\n\n return [\n (await spokeProvider.walletProvider.sendTransaction(rawTx)) satisfies EvmReturnType<false> as EvmReturnType<R>,\n intent,\n feeAmount,\n txData.data,\n ];\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SonicSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: Address, spokeProvider: SonicSpokeProvider): Promise<bigint> {\n return spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [token],\n });\n }\n\n /**\n * Execute a batch of contract calls through the Sonic wallet contract.\n * @param {Hex} payload - The encoded payload containing the calls array\n * @param {SonicSpokeProvider} spokeProvider - The provider for the spoke chain\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async callWallet<S extends SpokeProvider, R extends boolean>(\n payload: Hex,\n spokeProvider: S,\n raw?: R,\n ): Promise<TxReturnType<S, R>> {\n invariant(spokeProvider instanceof SonicSpokeProvider, '[SonicSpokeService] invalid spoke provider');\n\n // Decode the payload which contains the encoded calls array\n const calls = decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n payload,\n )[0] satisfies readonly EvmContractCall[];\n\n const txData = encodeFunctionData({\n abi: sonicWalletFactoryAbi,\n functionName: 'route',\n args: [\n calls.map(call => ({\n addr: call.address,\n value: call.value,\n data: call.data,\n })),\n ],\n });\n\n const rawTx = {\n from: await spokeProvider.walletProvider.getWalletAddress(),\n to: spokeProvider.chainConfig.addresses.walletRouter,\n data: txData,\n value: 0n,\n } satisfies TxReturnType<SonicSpokeProvider, true>;\n\n if (raw) {\n return rawTx as TxReturnType<S, R>;\n }\n\n return (await spokeProvider.walletProvider.sendTransaction(rawTx)) as TxReturnType<S, R>;\n }\n\n /**\n * Get withdraw information for a given token\n * @param token - The address of the underlying token\n * @param amount - The amount to withdraw\n * @param spokeProvider - The spoke provider\n * @param moneyMarketService - The money market service\n * @param configService - The config service\n * @returns {WithdrawInfo} WithdrawInfo containing aToken address, amount and vault address\n */\n public static async getWithdrawInfo(\n token: Address,\n amount: bigint,\n spokeProvider: SonicSpokeProvider,\n dataService: MoneyMarketDataService,\n configService: ConfigService,\n ): Promise<WithdrawInfo> {\n const assetConfig = configService.getHubAssetInfo(spokeProvider.chainConfig.chain.id, token);\n\n if (!assetConfig) {\n throw new Error('[SonicSpokeService.getWithdrawInfo] Hub asset not found');\n }\n\n const vaultAddress = assetConfig.vault;\n\n const aTokenAddress = (await dataService.getReserveData(vaultAddress)).aTokenAddress;\n\n return {\n aTokenAddress,\n aTokenAmount: amount,\n token,\n };\n }\n\n /**\n * Get borrow information for a given token\n * @param token - The address of the underlying token\n * @param amount - The amount to borrow\n * @param chainId - The chain ID\n * @param moneyMarketService - The money market service\n * @param configService - The config service\n * @returns BorrowInfo containing variable debt token address and vault address\n */\n public static async getBorrowInfo(\n token: Address,\n amount: bigint,\n chainId: SpokeChainId,\n dataService: MoneyMarketDataService,\n configService: ConfigService,\n ): Promise<BorrowInfo> {\n const assetConfig = configService.getHubAssetInfo(chainId, token);\n\n if (!assetConfig) {\n throw new Error('[SonicSpokeService.getBorrowInfo] Hub asset not found');\n }\n\n const vaultAddress = assetConfig.vault;\n const reserveData = await dataService.getReserveData(vaultAddress);\n const variableDebtTokenAddress = reserveData.variableDebtTokenAddress;\n\n return {\n variableDebtTokenAddress,\n vaultAddress,\n amount,\n };\n }\n\n /**\n * Check if the user has approved the withdrawal of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param withdrawInfo - The information about the withdrawal\n * @param spokeProvider - The spoke provider\n * @param spender - The address of the spender\n * @returns {Promise<Result<boolean>>} A promise that resolves to the result of the approval check\n */\n public static async isWithdrawApproved(\n from: Address,\n withdrawInfo: WithdrawInfo,\n spokeProvider: SonicSpokeProvider,\n spender?: HubAddress,\n ): Promise<Result<boolean>> {\n try {\n const spenderAddress = spender ?? (await SonicSpokeService.getUserRouter(from, spokeProvider));\n\n return Erc20Service.isAllowanceValid(\n withdrawInfo.aTokenAddress,\n withdrawInfo.aTokenAmount,\n from,\n spenderAddress,\n spokeProvider,\n );\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n\n /**\n * Approve the withdrawal of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param withdrawInfo - The information about the withdrawal\n * @param spokeProvider - The spoke provider\n * @param raw - Whether to return the raw transaction data\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash\n */\n public static async approveWithdraw<R extends boolean = false>(\n from: Address,\n withdrawInfo: WithdrawInfo,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const [userRouter, walletAddress] = await Promise.all([\n SonicSpokeService.getUserRouter(from, spokeProvider),\n spokeProvider.walletProvider.getWalletAddress(),\n ]);\n\n const txData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [userRouter, withdrawInfo.aTokenAmount],\n });\n\n const rawTx = {\n from: walletAddress,\n to: withdrawInfo.aTokenAddress,\n data: txData,\n value: 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Check if the user has approved the borrowing of tokens from the spoke chain using the Sonic wallet abstraction.\n * @param from - The address of the user on the spoke chain\n * @param borrowInfo - The information about the borrowing\n * @param spokeProvider - The spoke provider\n * @param spender - The address of the spender\n * @returns {Promise<Result<boolean>>} A promise that resolves to the result of the approval check\n */\n public static async isBorrowApproved(\n from: Address,\n borrowInfo: BorrowInfo,\n spokeProvider: SonicSpokeProvider,\n spender?: HubAddress,\n ): Promise<Result<boolean>> {\n try {\n const spenderAddress = spender ?? (await SonicSpokeService.getUserRouter(from, spokeProvider));\n\n const allowance: bigint = await spokeProvider.publicClient.readContract({\n address: borrowInfo.variableDebtTokenAddress,\n abi: variableDebtTokenAbi,\n functionName: 'borrowAllowance',\n args: [from, spenderAddress],\n });\n\n return {\n ok: true,\n value: allowance >= borrowInfo.amount,\n };\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n\n public static async approveBorrow<R extends boolean = false>(\n from: Address,\n borrowInfo: BorrowInfo,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const [userRouter, walletAddress] = await Promise.all([\n SonicSpokeService.getUserRouter(from, spokeProvider),\n spokeProvider.walletProvider.getWalletAddress(),\n ]);\n\n const txData = encodeFunctionData({\n abi: variableDebtTokenAbi,\n functionName: 'approveDelegation',\n args: [userRouter, borrowInfo.amount],\n });\n\n const rawTx = {\n from: walletAddress,\n to: borrowInfo.variableDebtTokenAddress,\n data: txData,\n value: 0n,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n public static async buildWithdrawData(\n from: Address,\n withdrawInfo: WithdrawInfo,\n amount: bigint,\n spokeProvider: SonicSpokeProvider,\n moneyMarketService: MoneyMarketService,\n ): Promise<Hex> {\n const userRouter = await SonicSpokeService.getUserRouter(from, spokeProvider);\n\n // Add withdraw call\n const withdrawCall = moneyMarketService.buildWithdrawData(\n userRouter,\n from,\n withdrawInfo.token,\n amount,\n spokeProvider.chainConfig.chain.id,\n );\n const calls = decodeAbiParameters(\n [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'address', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'data', type: 'bytes' },\n ],\n },\n ],\n withdrawCall,\n )[0] as {\n address: Address;\n value: bigint;\n data: `0x${string}`;\n }[];\n // move aTokens to user wallet address\n const transferFromCall = Erc20Service.encodeTransferFrom(\n withdrawInfo.aTokenAddress,\n from,\n userRouter,\n withdrawInfo.aTokenAmount,\n );\n\n calls.unshift({\n address: transferFromCall.address,\n value: transferFromCall.value,\n data: transferFromCall.data,\n });\n console.log('calls', calls);\n\n return encodeContractCalls(calls);\n }\n}\n","import { type Hex, encodeFunctionData, isAddress } from 'viem';\nimport { poolAbi } from '../shared/abis/pool.abi.js';\nimport type { EvmHubProvider, SpokeProvider } from '../shared/entities/index.js';\nimport {\n DEFAULT_RELAYER_API_ENDPOINT,\n isConfiguredMoneyMarketConfig,\n SpokeService,\n relayTxAndWaitPacket,\n type RelayErrorCode,\n DEFAULT_RELAY_TX_TIMEOUT,\n SolanaSpokeProvider,\n type RelayError,\n type ConfigService,\n} from '../index.js';\nimport type {\n EvmContractCall,\n EvmReturnType,\n GetAddressType,\n GetEstimateGasReturnType,\n GetSpokeDepositParamsType,\n HubTxHash,\n MoneyMarketConfigParams,\n MoneyMarketServiceConfig,\n PromiseTxReturnType,\n Result,\n SpokeTxHash,\n TxReturnType,\n} from '../shared/types.js';\nimport {\n calculateFeeAmount,\n deriveUserWalletAddress,\n encodeAddress,\n encodeContractCalls,\n} from '../shared/utils/index.js';\nimport { EvmAssetManagerService, EvmVaultTokenService } from '../shared/services/hub/index.js';\nimport { Erc20Service } from '../shared/services/erc-20/index.js';\nimport invariant from 'tiny-invariant';\nimport {\n SONIC_MAINNET_CHAIN_ID,\n type SpokeChainId,\n type Token,\n type Address,\n type HttpUrl,\n getMoneyMarketConfig,\n type GetMoneyMarketTokensApiResponse,\n} from '@sodax/types';\nimport { wrappedSonicAbi } from '../shared/abis/wrappedSonic.abi.js';\nimport { MoneyMarketDataService } from './MoneyMarketDataService.js';\nimport { StellarSpokeService } from '../shared/services/spoke/StellarSpokeService.js';\nimport { SonicSpokeService } from '../shared/services/spoke/SonicSpokeService.js';\nimport { EvmSpokeProvider } from '../shared/entities/Providers.js';\nimport { SonicSpokeProvider } from '../shared/entities/Providers.js';\nimport { StellarSpokeProvider } from '../shared/entities/stellar/StellarSpokeProvider.js';\n\nexport type MoneyMarketEncodeSupplyParams = {\n asset: Address; // The address of the asset to supply.\n amount: bigint; // The amount of the asset to supply.\n onBehalfOf: Address; // The address on whose behalf the asset is supplied.\n referralCode: number; // The referral code for the transaction.\n};\n\nexport type MoneyMarketEncodeWithdrawParams = {\n asset: Address; // The address of the asset to withdraw.\n amount: bigint; // The amount of the asset to withdraw.\n to: Address; // The address that will receive the withdrawn assets.\n};\n\nexport type MoneyMarketEncodeBorrowParams = {\n asset: Address; // The address of the asset to borrow.\n amount: bigint; // The amount of the asset to borrow.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n referralCode: number; // The referral code for the borrow transaction.\n onBehalfOf: Address; // The address that will receive the borrowed assets.\n};\n\nexport type MoneyMarketEncodeRepayParams = {\n asset: Address; // The address of the asset to repay.\n amount: bigint; // The amount of the asset to repay.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n onBehalfOf: Address; // The address that will get their debt reduced/removed.\n};\n\nexport type MoneyMarketEncodeRepayWithATokensParams = {\n asset: Address; // The address of the asset to repay.\n amount: bigint; // The amount of the asset to repay.\n interestRateMode: bigint; // The interest rate mode (2 for Variable).\n};\n\nexport type MoneyMarketAction = 'supply' | 'borrow' | 'withdraw' | 'repay';\n\nexport type MoneyMarketSupplyParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to supply.\n action: 'supply';\n};\n\nexport type MoneyMarketBorrowParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to borrow.\n action: 'borrow';\n};\n\nexport type MoneyMarketWithdrawParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to withdraw.\n action: 'withdraw';\n};\n\nexport type MoneyMarketRepayParams = {\n token: string; // spoke chain token address\n amount: bigint; // The amount of the asset to repay.\n action: 'repay';\n};\n\nexport type MoneyMarketParams =\n | MoneyMarketSupplyParams\n | MoneyMarketBorrowParams\n | MoneyMarketWithdrawParams\n | MoneyMarketRepayParams;\n\nexport type MoneyMarketUnknownErrorCode =\n | 'SUPPLY_UNKNOWN_ERROR'\n | 'BORROW_UNKNOWN_ERROR'\n | 'WITHDRAW_UNKNOWN_ERROR'\n | 'REPAY_UNKNOWN_ERROR';\n\nexport type GetMoneyMarketParams<T extends MoneyMarketUnknownErrorCode> = T extends 'SUPPLY_UNKNOWN_ERROR'\n ? MoneyMarketSupplyParams\n : T extends 'BORROW_UNKNOWN_ERROR'\n ? MoneyMarketBorrowParams\n : T extends 'WITHDRAW_UNKNOWN_ERROR'\n ? MoneyMarketWithdrawParams\n : T extends 'REPAY_UNKNOWN_ERROR'\n ? MoneyMarketRepayParams\n : never;\n\nexport type MoneyMarketErrorCode =\n | MoneyMarketUnknownErrorCode\n | RelayErrorCode\n | 'CREATE_SUPPLY_INTENT_FAILED'\n | 'CREATE_BORROW_INTENT_FAILED'\n | 'CREATE_WITHDRAW_INTENT_FAILED'\n | 'CREATE_REPAY_INTENT_FAILED';\n\nexport type MoneyMarketUnknownError<T extends MoneyMarketUnknownErrorCode> = {\n error: unknown;\n payload: GetMoneyMarketParams<T>;\n};\n\nexport type MoneyMarketSubmitTxFailedError = {\n error: RelayError;\n payload: SpokeTxHash;\n};\n\nexport type MoneyMarketSupplyFailedError = {\n error: unknown;\n payload: MoneyMarketSupplyParams;\n};\n\nexport type MoneyMarketBorrowFailedError = {\n error: unknown;\n payload: MoneyMarketBorrowParams;\n};\n\nexport type MoneyMarketWithdrawFailedError = {\n error: unknown;\n payload: MoneyMarketWithdrawParams;\n};\n\nexport type MoneyMarketRepayFailedError = {\n error: unknown;\n payload: MoneyMarketRepayParams;\n};\n\nexport type GetMoneyMarketError<T extends MoneyMarketErrorCode> = T extends 'SUBMIT_TX_FAILED'\n ? MoneyMarketSubmitTxFailedError\n : T extends 'RELAY_TIMEOUT'\n ? MoneyMarketSubmitTxFailedError\n : T extends 'CREATE_SUPPLY_INTENT_FAILED'\n ? MoneyMarketSupplyFailedError\n : T extends 'CREATE_BORROW_INTENT_FAILED'\n ? MoneyMarketBorrowFailedError\n : T extends 'CREATE_WITHDRAW_INTENT_FAILED'\n ? MoneyMarketWithdrawFailedError\n : T extends 'CREATE_REPAY_INTENT_FAILED'\n ? MoneyMarketRepayFailedError\n : T extends MoneyMarketUnknownErrorCode\n ? MoneyMarketUnknownError<T>\n : never;\n\nexport type MoneyMarketError<T extends MoneyMarketErrorCode> = {\n code: T;\n data: GetMoneyMarketError<T>;\n};\n\nexport type MoneyMarketExtraData = { address: Hex; payload: Hex };\nexport type MoneyMarketOptionalExtraData = { data?: MoneyMarketExtraData };\n\nexport type MoneyMarketServiceConstructorParams = {\n config: MoneyMarketConfigParams | undefined;\n hubProvider: EvmHubProvider;\n relayerApiEndpoint?: HttpUrl;\n configService: ConfigService;\n};\n\nexport class MoneyMarketService {\n public readonly config: MoneyMarketServiceConfig;\n private readonly hubProvider: EvmHubProvider;\n public readonly data: MoneyMarketDataService;\n public readonly configService: ConfigService;\n\n constructor({ config, hubProvider, relayerApiEndpoint, configService }: MoneyMarketServiceConstructorParams) {\n if (!config) {\n this.config = {\n ...getMoneyMarketConfig(SONIC_MAINNET_CHAIN_ID), // default to mainnet config\n partnerFee: undefined,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else if (isConfiguredMoneyMarketConfig(config)) {\n this.config = {\n ...config,\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n } else {\n this.config = {\n ...getMoneyMarketConfig(hubProvider.chainConfig.chain.id), // default to mainnet config\n partnerFee: config.partnerFee,\n relayerApiEndpoint: relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT,\n };\n }\n this.hubProvider = hubProvider;\n this.data = new MoneyMarketDataService(hubProvider);\n this.configService = configService;\n }\n\n /**\n * Estimate the gas for a raw transaction.\n * @param {TxReturnType<T, true>} params - The parameters for the raw transaction.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Promise<GetEstimateGasReturnType<T>>} A promise that resolves to the gas.\n */\n public static async estimateGas<T extends SpokeProvider = SpokeProvider>(\n params: TxReturnType<T, true>,\n spokeProvider: T,\n ): Promise<GetEstimateGasReturnType<T>> {\n return SpokeService.estimateGas(params, spokeProvider) as Promise<GetEstimateGasReturnType<T>>;\n }\n\n /**\n * Check if allowance is sufficient for actions on the money market pool\n * @param {MoneyMarketParams} params - Money market params containing token address and amount\n * @param {SpokeProvider} spokeProvider - The spoke provider instance\n * @return {Promise<Result<boolean>>} - Returns true if allowance is sufficient, false otherwise\n *\n * @example\n * const allowanceValid = await isAllowanceValid({\n * token: '0x...', // Address of the token (spoke chain) to supply\n * amount: 1000n, // Amount to supply (in token decimals)\n * action: 'supply',\n * }, spokeProvider);\n *\n * if (!allowanceValid.ok) {\n * // Handle error\n * }\n *\n * if (!allowanceValid.value) {\n * // Need to approve\n * }\n */\n public async isAllowanceValid<S extends SpokeProvider>(\n params: MoneyMarketParams,\n spokeProvider: S,\n ): Promise<Result<boolean>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.token.length > 0, 'Token is required');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n if (spokeProvider instanceof StellarSpokeProvider && (params.action === 'supply' || params.action === 'repay')) {\n return {\n ok: true,\n value: await StellarSpokeService.hasSufficientTrustline(params.token, params.amount, spokeProvider),\n };\n }\n if (spokeProvider instanceof EvmSpokeProvider && (params.action === 'supply' || params.action === 'repay')) {\n return await Erc20Service.isAllowanceValid(\n params.token as GetAddressType<EvmSpokeProvider>,\n params.amount,\n walletAddress as GetAddressType<EvmSpokeProvider>,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n );\n }\n if (\n spokeProvider instanceof SonicSpokeProvider &&\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id\n ) {\n if (params.action === 'withdraw') {\n const withdrawInfo = await SonicSpokeService.getWithdrawInfo(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n spokeProvider,\n this.data,\n this.configService,\n );\n return await SonicSpokeService.isWithdrawApproved(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n withdrawInfo,\n spokeProvider,\n );\n }\n if (params.action === 'borrow') {\n const borrowInfo = await SonicSpokeService.getBorrowInfo(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n this.data,\n this.configService,\n );\n return await SonicSpokeService.isBorrowApproved(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n borrowInfo,\n spokeProvider,\n );\n }\n if (params.action === 'supply' || params.action === 'repay') {\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n return await Erc20Service.isAllowanceValid(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n walletAddress as GetAddressType<SonicSpokeProvider>,\n userRouter,\n spokeProvider,\n );\n }\n }\n\n return {\n ok: true,\n value: true,\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Approve amount spending if isAllowanceValid returns false.\n * For evm spoke chains, the spender is the asset manager contract while\n * for sonic spoke (hub) chain, the spender is the user router contract.\n * @param token - ERC20 token address\n * @param amount - Amount to approve\n * @param spender - Spender address\n * @param spokeProvider - Spoke provider\n * @returns {Promise<Result<TxReturnType<S, R>>>} - Returns the transaction receipt\n *\n * @example\n * const approveResult = await approve(\n * {\n * token: '0x...', // ERC20 token address\n * amount: 1000n, // Amount to approve (in token decimals)\n * action: 'supply', // Action to perform\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = execute and return the transaction hash (default: false)\n * );\n *\n * if (!approveResult.ok) {\n * // Handle error\n * }\n *\n * const txReceipt = approveResult.value;\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>(\n params: MoneyMarketParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.token.length > 0, 'Token is required');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n invariant(\n params.action === 'supply' || params.action === 'repay',\n 'Invalid action (only supply and repay are supported on stellar)',\n );\n\n const result = await StellarSpokeService.requestTrustline(params.token, params.amount, spokeProvider, raw);\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof EvmSpokeProvider) {\n invariant(\n params.action === 'supply' || params.action === 'repay',\n 'Invalid action (only supply and repay are supported on evm)',\n );\n invariant(isAddress(params.token), 'Invalid token address');\n\n const result = (await Erc20Service.approve(\n params.token,\n params.amount,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n\n if (\n spokeProvider instanceof SonicSpokeProvider &&\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id\n ) {\n invariant(\n params.action === 'withdraw' ||\n params.action === 'borrow' ||\n params.action === 'supply' ||\n params.action === 'repay',\n 'Invalid action (only withdraw, borrow, supply and repay are supported on sonic)',\n );\n invariant(isAddress(params.token), 'Invalid token address');\n\n if (params.action === 'withdraw') {\n const withdrawInfo = await SonicSpokeService.getWithdrawInfo(\n params.token,\n params.amount,\n spokeProvider,\n this.data,\n this.configService,\n );\n\n const result = (await SonicSpokeService.approveWithdraw(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n withdrawInfo,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n if (params.action === 'borrow') {\n const borrowInfo = await SonicSpokeService.getBorrowInfo(\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n this.data,\n this.configService,\n );\n\n const result = (await SonicSpokeService.approveBorrow(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n borrowInfo,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n if (params.action === 'supply' || params.action === 'repay') {\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n const result = (await Erc20Service.approve(\n params.token,\n params.amount,\n userRouter,\n spokeProvider,\n raw,\n )) satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>;\n\n return {\n ok: true,\n value: result,\n };\n }\n }\n\n return {\n ok: false,\n error: new Error('Approve only supported for EVM spoke chains'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Supply tokens to the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n * @param params - The parameters for the supply transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[SpokeTxHash, HubTxHash], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.supply(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to supply\n * amount: 1000n, // Amount to supply (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Supply transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async supply<S extends SpokeProvider>(\n params: MoneyMarketSupplyParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [SpokeTxHash, HubTxHash],\n MoneyMarketError<'CREATE_SUPPLY_INTENT_FAILED' | 'SUPPLY_UNKNOWN_ERROR' | RelayErrorCode>\n >\n > {\n try {\n const txResult = await this.createSupplyIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return txResult;\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_SUPPLY_INTENT_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n let intentTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== SONIC_MAINNET_CHAIN_ID) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider ? txResult.data : undefined,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n data: {\n error: packetResult.error,\n payload: txResult.value,\n },\n },\n };\n }\n\n intentTxHash = packetResult.value.dst_tx_hash;\n } else {\n intentTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, intentTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'SUPPLY_UNKNOWN_ERROR',\n data: {\n error: error,\n payload: params,\n },\n },\n };\n }\n }\n\n /**\n * Create supply intent only (without relay submit to Solver API)\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully supply tokens, you need to:\n * 1. Check if the allowance is sufficient\n * 2. Approve the asset manager contract to spend the tokens\n * 3. Supply the tokens\n * 4. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the supply transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result.\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.createSupplyIntent(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Supply transaction hash:', txHash);\n * } else {\n * console.error('Supply failed:', result.error);\n * }\n */\n async createSupplyIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketSupplyParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<\n Result<TxReturnType<S, R>, MoneyMarketError<'CREATE_SUPPLY_INTENT_FAILED'>> & MoneyMarketOptionalExtraData\n > {\n try {\n invariant(params.action === 'supply', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n const abstractedWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n const data: Hex = this.buildSupplyData(\n params.token,\n abstractedWalletAddress,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n );\n\n let txResult: Awaited<PromiseTxReturnType<S, R>> | EvmReturnType<R>;\n if (\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id &&\n spokeProvider instanceof SonicSpokeProvider\n ) {\n txResult = await SonicSpokeService.deposit(\n {\n from: walletAddress as GetAddressType<SonicSpokeProvider>,\n token: params.token as GetAddressType<SonicSpokeProvider>,\n amount: params.amount,\n data,\n },\n spokeProvider,\n raw,\n );\n } else {\n txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: abstractedWalletAddress,\n token: params.token,\n amount: params.amount,\n data,\n } as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n }\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: abstractedWalletAddress,\n payload: data,\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATE_SUPPLY_INTENT_FAILED',\n data: {\n error,\n payload: params,\n },\n },\n };\n }\n }\n\n /**\n * Borrow tokens from the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n * @param params - The parameters for the borrow transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[SpokeTxHash, HubTxHash], MoneyMarketError>>} - Returns the transaction result and the hub transaction hash or error\n *\n * @example\n * const result = await moneyMarketService.borrow(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to borrow\n * amount: 1000n, // Amount to borrow (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Borrow transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async borrow<S extends SpokeProvider>(\n params: MoneyMarketBorrowParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [SpokeTxHash, HubTxHash],\n MoneyMarketError<'CREATE_BORROW_INTENT_FAILED' | 'BORROW_UNKNOWN_ERROR' | RelayErrorCode>\n >\n > {\n try {\n const txResult = await this.createBorrowIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return txResult;\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_BORROW_INTENT_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n let intentTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== SONIC_MAINNET_CHAIN_ID) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider ? txResult.data : undefined,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n data: {\n error: packetResult.error,\n payload: txResult.value,\n },\n },\n };\n }\n\n intentTxHash = packetResult.value.dst_tx_hash;\n } else {\n intentTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, intentTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'BORROW_UNKNOWN_ERROR',\n data: {\n error: error,\n payload: params,\n },\n },\n };\n }\n }\n\n /**\n * Create borrow intent only (without relay and submit to Solver API)\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully borrow tokens, you need to:\n * 1. Execute the borrow transaction on the spoke chain\n * 2. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the borrow transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result (raw transaction data or transaction hash).\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.createBorrowIntent(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = execute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Borrow transaction hash:', txHash);\n * } else {\n * console.error('Borrow failed:', result.error);\n * }\n */\n async createBorrowIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketBorrowParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<\n Result<TxReturnType<S, R>, MoneyMarketError<'CREATE_BORROW_INTENT_FAILED'>> & MoneyMarketOptionalExtraData\n > {\n invariant(params.action === 'borrow', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);\n const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n const data: Hex = this.buildBorrowData(\n hubWallet,\n encodedAddress,\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n );\n\n let txResult: TxReturnType<S, R>;\n if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {\n txResult = await SonicSpokeService.callWallet(data, spokeProvider, raw);\n } else {\n txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n }\n\n return {\n ok: true,\n value: txResult satisfies TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n }\n\n /**\n * Withdraw tokens from the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n *\n * @param params - The parameters for the withdraw transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[SpokeTxHash, HubTxHash], MoneyMarketError>>} - Returns the spoke and hub transaction hashes or error\n *\n * @example\n * const result = await moneyMarketService.withdraw(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to withdraw\n * amount: 1000n, // Amount to withdraw (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Withdraw transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async withdraw<S extends SpokeProvider>(\n params: MoneyMarketWithdrawParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [SpokeTxHash, HubTxHash],\n MoneyMarketError<'CREATE_WITHDRAW_INTENT_FAILED' | 'WITHDRAW_UNKNOWN_ERROR' | RelayErrorCode>\n >\n > {\n try {\n const txResult = await this.createWithdrawIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return txResult;\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_WITHDRAW_INTENT_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n let intentTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== SONIC_MAINNET_CHAIN_ID) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider ? txResult.data : undefined,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n data: {\n error: packetResult.error,\n payload: txResult.value,\n },\n },\n };\n }\n\n intentTxHash = packetResult.value.dst_tx_hash;\n } else {\n intentTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, intentTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'WITHDRAW_UNKNOWN_ERROR',\n data: {\n error: error,\n payload: params,\n },\n },\n };\n }\n }\n\n /**\n * Create withdraw intent only (without relay and submit to Solver API)\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully withdraw tokens, you need to:\n * 1. Execute the withdraw transaction on the spoke chain\n * 2. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the withdraw transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} - Returns the transaction result (raw transaction data or transaction hash).\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.createWithdrawIntent(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Withdraw transaction hash:', txHash);\n * } else {\n * console.error('Withdraw failed:', result.error);\n * }\n */\n async createWithdrawIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketWithdrawParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<\n Result<TxReturnType<S, R>, MoneyMarketError<'CREATE_WITHDRAW_INTENT_FAILED'>> & MoneyMarketOptionalExtraData\n > {\n invariant(params.action === 'withdraw', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress);\n const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n let data: Hex;\n if (spokeProvider instanceof SonicSpokeProvider) {\n const withdrawInfo = await SonicSpokeService.getWithdrawInfo(\n params.token as GetAddressType<SonicSpokeProvider>,\n params.amount,\n spokeProvider,\n this.data,\n this.configService,\n );\n\n data = await SonicSpokeService.buildWithdrawData(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n withdrawInfo,\n params.amount,\n spokeProvider,\n this,\n );\n } else {\n data = this.buildWithdrawData(\n hubWallet,\n encodedAddress,\n params.token,\n params.amount,\n spokeProvider.chainConfig.chain.id,\n );\n }\n\n const txResult =\n spokeProvider instanceof SonicSpokeProvider\n ? await SonicSpokeService.callWallet(data, spokeProvider, raw)\n : await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n\n return {\n ok: true,\n value: txResult,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n }\n\n /**\n * Repay tokens to the money market pool, relay the transaction to the hub and submit the intent to the Solver API\n *\n * @param params - The parameters for the repay transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[SpokeTxHash, HubTxHash], MoneyMarketError>>} - Returns the spoke and hub transaction hashes or error\n *\n * @example\n * const result = await moneyMarketService.repay(\n * {\n * token: '0x...', // Address of the token (spoke chain address) to repay\n * amount: 1000n, // Amount to repay (in token decimals)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Repay transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async repay<S extends SpokeProvider>(\n params: MoneyMarketRepayParams,\n spokeProvider: S,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [SpokeTxHash, HubTxHash],\n MoneyMarketError<'CREATE_REPAY_INTENT_FAILED' | 'REPAY_UNKNOWN_ERROR' | RelayErrorCode>\n >\n > {\n try {\n const txResult = await this.createRepayIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return txResult;\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_REPAY_INTENT_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n let intentTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== SONIC_MAINNET_CHAIN_ID) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider ? txResult.data : undefined,\n spokeProvider,\n this.config.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n data: {\n error: packetResult.error,\n payload: txResult.value,\n },\n },\n };\n }\n\n intentTxHash = packetResult.value.dst_tx_hash;\n } else {\n intentTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, intentTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'REPAY_UNKNOWN_ERROR',\n data: {\n error: error,\n payload: params,\n },\n },\n };\n }\n }\n\n /**\n * Create repay intent only (without relay and submit to Solver API)\n * NOTE: This method does not submit the intent to the Solver API, it only executes the transaction on the spoke chain\n * In order to successfully repay tokens, you need to:\n * 1. Check if the allowance is sufficient\n * 2. Approve the asset manager contract to spend the tokens\n * 3. Execute the repay transaction on the spoke chain\n * 4. Submit the intent to the Solver API and await it using relayTxAndWaitPacket method\n *\n * @param params - The parameters for the repay transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns {Promise<Result<TxReturnType<S, R>, MoneyMarketErrorCode>>} The transaction result (raw transaction data or transaction hash) or error.\n *\n * @example\n * const moneyMarketService = new MoneyMarketService(config);\n * const result = await moneyMarketService.createRepayIntent(\n * {\n * token: \"0x123...\", // token address\n * amount: 1000000000000000000n // 1 token in wei\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = exeute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Repay transaction hash:', txHash);\n * } else {\n * console.error('Repay failed:', result.error);\n * }\n */\n async createRepayIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: MoneyMarketRepayParams,\n spokeProvider: S,\n raw?: R,\n ): Promise<\n Result<TxReturnType<S, R>, MoneyMarketError<'CREATE_REPAY_INTENT_FAILED'>> & MoneyMarketOptionalExtraData\n > {\n invariant(params.action === 'repay', 'Invalid action');\n invariant(params.token.length > 0, 'Token is required');\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(\n this.configService.isMoneyMarketSupportedToken(spokeProvider.chainConfig.chain.id, params.token),\n `Unsupported spoke chain (${spokeProvider.chainConfig.chain.id}) token: ${params.token}`,\n );\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const hubWallet = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n const data: Hex = this.buildRepayData(params.token, hubWallet, params.amount, spokeProvider.chainConfig.chain.id);\n\n let txResult: Awaited<PromiseTxReturnType<S, R>> | EvmReturnType<R>;\n if (\n spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id &&\n spokeProvider instanceof SonicSpokeProvider\n ) {\n txResult = await SonicSpokeService.deposit(\n {\n from: walletAddress as GetAddressType<SonicSpokeProvider>,\n token: params.token as GetAddressType<SonicSpokeProvider>,\n amount: params.amount,\n data,\n },\n spokeProvider,\n raw,\n );\n } else {\n txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: hubWallet,\n token: params.token,\n amount: params.amount,\n data,\n } as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n }\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n }\n\n /**\n * Build transaction data for supplying to the money market pool\n * @param token - The address of the token on spoke chain\n * @param to - The user wallet address on the hub chain\n * @param amount - The amount to deposit\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public buildSupplyData(token: string, to: Address, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(spokeChainId, token);\n\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${token}`);\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const lendingPool = this.config.lendingPool;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, amount);\n calls.push(Erc20Service.encodeApprove(vaultAddress, lendingPool, translatedAmount));\n calls.push(\n MoneyMarketService.encodeSupply(\n { asset: vaultAddress, amount: translatedAmount, onBehalfOf: to, referralCode: 0 },\n lendingPool,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for borrowing from the money market pool\n * @param from - The user wallet address on the hub chain\n * @param to - The user wallet address on the spoke chain\n * @param token - The address of the token to borrow\n * @param amount - The amount to borrow in hub chain decimals\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public buildBorrowData(\n from: Address,\n to: Address | Hex,\n token: string,\n amount: bigint,\n spokeChainId: SpokeChainId,\n ): Hex {\n invariant(this.configService.isValidSpokeChainId(spokeChainId), `Invalid spokeChainId: ${spokeChainId}`);\n invariant(\n this.configService.isValidOriginalAssetAddress(spokeChainId, token),\n `Unsupported spoke chain (${spokeChainId}) token: ${token}`,\n );\n\n const assetConfig = this.configService.getHubAssetInfo(spokeChainId, token);\n\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${token}`);\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const bnUSDVault = this.config.bnUSDVault;\n const bnUSD = this.config.bnUSD;\n\n const feeAmount = calculateFeeAmount(amount, this.config.partnerFee);\n const calls: EvmContractCall[] = [];\n\n if (bnUSDVault && bnUSD && bnUSDVault.toLowerCase() === vaultAddress.toLowerCase()) {\n calls.push(\n MoneyMarketService.encodeBorrow(\n { asset: bnUSD, amount: amount, interestRateMode: 2n, referralCode: 0, onBehalfOf: from },\n this.config.lendingPool,\n ),\n );\n calls.push(Erc20Service.encodeApprove(bnUSD, bnUSDVault, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(bnUSDVault, bnUSD, amount));\n\n if (this.config.partnerFee && feeAmount) {\n calls.push(Erc20Service.encodeTransfer(bnUSDVault, this.config.partnerFee.address, feeAmount));\n }\n } else {\n calls.push(\n MoneyMarketService.encodeBorrow(\n { asset: vaultAddress, amount: amount, interestRateMode: 2n, referralCode: 0, onBehalfOf: from },\n this.config.lendingPool,\n ),\n );\n\n if (this.config.partnerFee && feeAmount) {\n calls.push(Erc20Service.encodeTransfer(vaultAddress, this.config.partnerFee.address, feeAmount));\n }\n }\n\n calls.push(EvmVaultTokenService.encodeWithdraw(vaultAddress, assetAddress, amount - feeAmount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(assetConfig.decimal, amount - feeAmount);\n\n if (spokeChainId === this.hubProvider.chainConfig.chain.id) {\n if (\n token.toLowerCase() ===\n this.configService.spokeChainConfig[this.hubProvider.chainConfig.chain.id].nativeToken.toLowerCase()\n ) {\n const withdrawToCall = {\n address: assetAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'withdrawTo',\n args: [to, translatedAmountOut],\n }),\n };\n\n calls.push(withdrawToCall);\n } else {\n calls.push(Erc20Service.encodeTransfer(assetAddress, to, translatedAmountOut));\n }\n } else {\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for withdrawing from the money market pool\n * @param from - The user wallet address on the hub chain\n * @param to - The user wallet address on the spoke chain\n * @param token - The address of the token to borrow\n * @param amount - The amount to borrow in hub chain decimals\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public buildWithdrawData(from: Address, to: Address, token: string, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(spokeChainId, token);\n\n if (!assetConfig) {\n throw new Error('[withdrawData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n\n if (!assetAddress || !vaultAddress) {\n throw new Error('Address not found');\n }\n calls.push(\n MoneyMarketService.encodeWithdraw({ asset: vaultAddress, amount: amount, to: from }, this.config.lendingPool),\n );\n\n calls.push(EvmVaultTokenService.encodeWithdraw(vaultAddress, assetAddress, amount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(assetConfig.decimal, amount);\n\n if (spokeChainId === this.hubProvider.chainConfig.chain.id) {\n if (\n token.toLowerCase() ===\n this.configService.spokeChainConfig[this.hubProvider.chainConfig.chain.id].nativeToken.toLowerCase()\n ) {\n const withdrawToCall = {\n address: assetAddress,\n value: 0n,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'withdrawTo',\n args: [to, translatedAmountOut],\n }),\n };\n calls.push(withdrawToCall);\n } else {\n calls.push(Erc20Service.encodeTransfer(assetAddress, to, translatedAmountOut));\n }\n } else {\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetAddress,\n to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Build transaction data for repaying to the money market pool\n * @param token - The address of the token to repay\n * @param to - The user wallet address on the hub chain\n * @param amount - The amount to repay\n * @param spokeChainId - The chain ID of the spoke chain\n * @returns {Hex} The transaction data.\n */\n public buildRepayData(token: string, to: Address, amount: bigint, spokeChainId: SpokeChainId): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(spokeChainId, token);\n\n if (!assetConfig) {\n throw new Error('[buildRepayData] Hub asset not found');\n }\n\n const assetAddress = assetConfig.asset;\n const vaultAddress = assetConfig.vault;\n const bnUSDVault = this.config.bnUSDVault;\n const bnUSD = this.config.bnUSD;\n\n calls.push(Erc20Service.encodeApprove(assetAddress, vaultAddress, amount));\n calls.push(EvmVaultTokenService.encodeDeposit(vaultAddress, assetAddress, amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, amount);\n\n let repayToken = vaultAddress;\n if (bnUSDVault && bnUSD && bnUSDVault.toLowerCase() === vaultAddress.toLowerCase()) {\n repayToken = bnUSD;\n calls.push(EvmVaultTokenService.encodeWithdraw(bnUSDVault, bnUSD, translatedAmount));\n }\n\n calls.push(Erc20Service.encodeApprove(repayToken, this.config.lendingPool, translatedAmount));\n calls.push(\n MoneyMarketService.encodeRepay(\n { asset: repayToken, amount: translatedAmount, interestRateMode: 2n, onBehalfOf: to },\n this.config.lendingPool,\n ),\n );\n return encodeContractCalls(calls);\n }\n\n /**\n * Calculate aToken amount from actual amount using liquidityIndex\n * @param amount - The actual amount\n * @param normalizedIncome - The current normalized income from reserve data\n * @returns {bigint} The equivalent aToken amount\n */\n static calculateATokenAmount(amount: bigint, normalizedIncome: bigint): bigint {\n return (amount * 10n ** 27n) / normalizedIncome + 1n;\n }\n\n /**\n * Encodes a supply transaction for a money market pool.\n * @param {MoneyMarketEncodeWithdrawParams} params - The parameters for the supply transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeSupply(params: MoneyMarketEncodeSupplyParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'supply',\n args: [params.asset, params.amount, params.onBehalfOf, params.referralCode],\n }),\n };\n }\n\n /**\n * Encodes a withdraw transaction from a pool.\n * @param {MoneyMarketEncodeWithdrawParams} params - The parameters for the withdraw transaction.\n * @param {Address} params.asset - The address of the asset to withdraw.\n * @param {bigint} params.amount - The amount of the asset to withdraw.\n * @param {Address} params.to - The address that will receive the withdrawn assets.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeWithdraw(params: MoneyMarketEncodeWithdrawParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'withdraw',\n args: [params.asset, params.amount, params.to],\n }),\n };\n }\n\n /**\n * Encodes a borrow transaction from a pool.\n * @param {MoneyMarketEncodeBorrowParams} params - The parameters for the borrow transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeBorrow(params: MoneyMarketEncodeBorrowParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'borrow',\n args: [params.asset, params.amount, params.interestRateMode, params.referralCode, params.onBehalfOf],\n }),\n };\n }\n\n /**\n * Encodes a repay transaction for a pool.\n * @param {MoneyMarketEncodeRepayParams} params - The parameters for the repay transaction.\n * @param {Address} params.asset - The address of the borrowed asset to repay.\n * @param {bigint} params.amount - The amount to repay. Use type(uint256).max to repay the entire debt.\n * @param {number} params.interestRateMode - The interest rate mode (2 for Variable).\n * @param {Address} params.onBehalfOf - The address of the user who will get their debt reduced/removed.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeRepay(params: MoneyMarketEncodeRepayParams, lendingPool: Address): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'repay',\n args: [params.asset, params.amount, params.interestRateMode, params.onBehalfOf],\n }),\n };\n }\n\n /**\n * Encodes a repayWithATokens transaction for a pool.\n * @param {MoneyMarketEncodeRepayWithATokensParams} params - The parameters for the repayWithATokens transaction.\n * @param {Address} lendingPool - The address of the lending pool contract.\n * @returns {EvmContractCall} The encoded contract call.\n */\n public static encodeRepayWithATokens(\n params: MoneyMarketEncodeRepayWithATokensParams,\n lendingPool: Address,\n ): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'repayWithATokens',\n args: [params.asset, params.amount, params.interestRateMode],\n }),\n };\n }\n\n /**\n * Encodes a setUserUseReserveAsCollateral transaction.\n * @param asset - The address of the underlying asset to be used as collateral.\n * @param useAsCollateral - True to enable the asset as collateral, false to disable.\n * @param lendingPool - The address of lending pool contract\n * @returns The encoded contract call.\n */\n public static encodeSetUserUseReserveAsCollateral(\n asset: Address,\n useAsCollateral: boolean,\n lendingPool: Address,\n ): EvmContractCall {\n return {\n address: lendingPool,\n value: 0n,\n data: encodeFunctionData({\n abi: poolAbi,\n functionName: 'setUserUseReserveAsCollateral',\n args: [asset, useAsCollateral],\n }),\n };\n }\n\n /**\n * Get the list of all supported money market tokens (supply / borrow tokens) for a given spoke chain ID\n * @param chainId The chain ID\n * @returns {readonly Token[]} - Array of supported tokens\n */\n public getSupportedTokensByChainId(chainId: SpokeChainId): readonly Token[] {\n return this.configService.getSupportedMoneyMarketTokensByChainId(chainId);\n }\n\n /**\n * Get the list of all supported money market tokens (supply / borrow tokens)\n * @returns {GetMoneyMarketTokensApiResponse} - Object containing all supported tokens\n */\n public getSupportedTokens(): GetMoneyMarketTokensApiResponse {\n return this.configService.getSupportedMoneyMarketTokens();\n }\n\n /**\n * Get the list of all supported money market reserves (supply / borrow reserves)\n * NOTE: reserve addresses are on the hub chain and can be of type vault, erc20, etc.\n * @returns {readonly Address[]} - Array of supported reserves\n */\n public getSupportedReserves(): readonly Address[] {\n return this.configService.getMoneyMarketReserveAssets();\n }\n}\n","import { DEFAULT_RELAYER_API_ENDPOINT } from '../constants.js';\nimport { SwapService, MigrationService, BackendApiService, BridgeService, StakingService } from '../../index.js';\nimport { MoneyMarketService } from '../../moneyMarket/MoneyMarketService.js';\nimport type { HttpUrl } from '@sodax/types';\nimport type {\n SolverConfigParams,\n MoneyMarketConfigParams,\n MigrationServiceConfig,\n BridgeServiceConfig,\n BackendApiConfig,\n Result,\n} from '../types.js';\nimport { EvmHubProvider, type EvmHubProviderConfig } from './Providers.js';\nimport { ConfigService } from '../config/index.js';\n\nexport type SodaxConfig = {\n swap?: SolverConfigParams; // optional Solver service enabling intent based swaps\n moneyMarket?: MoneyMarketConfigParams; // optional Money Market service enabling cross-chain lending and borrowing\n migration?: MigrationServiceConfig; // optional Migration service enabling ICX migration to SODA\n bridge?: BridgeServiceConfig; // optional Bridge service enabling cross-chain transfers\n hubProviderConfig?: EvmHubProviderConfig; // hub provider for the hub chain (e.g. Sonic mainnet)\n relayerApiEndpoint?: HttpUrl; // relayer API endpoint used to relay intents/user actions to the hub and vice versa\n backendApiConfig?: BackendApiConfig; // backend API config used to interact with the backend API\n};\n\n/**\n * Sodax class is used to interact with the Sodax.\n *\n * @see https://docs.sodax.com\n */\nexport class Sodax {\n public readonly instanceConfig?: SodaxConfig;\n\n public readonly swap: SwapService; // Solver service enabling intent based swaps\n public readonly moneyMarket: MoneyMarketService; // Money Market service enabling cross-chain lending and borrowing\n public readonly migration: MigrationService; // ICX migration service enabling ICX migration to SODA\n public readonly backendApi: BackendApiService; // backend API service enabling backend API endpoints\n public readonly bridge: BridgeService; // Bridge service enabling cross-chain transfers\n public readonly staking: StakingService; // Staking service enabling SODA staking operations\n public readonly config: ConfigService; // Config service enabling configuration data fetching from the backend API or fallbacking to default values\n\n public readonly hubProvider: EvmHubProvider; // hub provider for the hub chain (e.g. Sonic mainnet)\n public readonly relayerApiEndpoint: HttpUrl; // relayer API endpoint used to relay intents/user actions to the hub and vice versa\n\n constructor(config?: SodaxConfig) {\n this.instanceConfig = config;\n this.relayerApiEndpoint = config?.relayerApiEndpoint ?? DEFAULT_RELAYER_API_ENDPOINT;\n this.backendApi = new BackendApiService(config?.backendApiConfig);\n this.config = new ConfigService({\n backendApiService: this.backendApi,\n config: {\n backendApiUrl: config?.backendApiConfig?.baseURL,\n timeout: config?.backendApiConfig?.timeout,\n },\n });\n this.hubProvider = new EvmHubProvider({ config: config?.hubProviderConfig, configService: this.config }); // default to Sonic mainnet\n this.swap =\n config && config.swap\n ? new SwapService({\n config: config.swap,\n configService: this.config,\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n })\n : new SwapService({\n config: undefined,\n configService: this.config,\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n }); // default to mainnet config\n\n this.moneyMarket =\n config && config.moneyMarket\n ? new MoneyMarketService({\n config: config.moneyMarket,\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n configService: this.config,\n })\n : new MoneyMarketService({\n config: undefined,\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n configService: this.config,\n }); // default to mainnet config\n\n this.migration =\n config && config.migration\n ? new MigrationService({\n relayerApiEndpoint: this.relayerApiEndpoint,\n hubProvider: this.hubProvider,\n configService: this.config,\n })\n : new MigrationService({\n relayerApiEndpoint: this.relayerApiEndpoint,\n hubProvider: this.hubProvider,\n configService: this.config,\n });\n\n this.bridge =\n config && config.bridge\n ? new BridgeService({\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n config: config.bridge,\n configService: this.config,\n })\n : new BridgeService({\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n config: undefined,\n configService: this.config,\n });\n this.staking = new StakingService({\n hubProvider: this.hubProvider,\n relayerApiEndpoint: this.relayerApiEndpoint,\n configService: this.config,\n });\n }\n\n /**\n * Initializes the Sodax instance with dynamic configuration.\n * You should use this option if you do not want to update package versions when new chains and tokens are added.\n * NOTE: Default configuration will be used if initialization fails.\n * @param sodax - The Sodax instance to initialize.\n */\n public async initialize(): Promise<Result<void>> {\n try {\n await this.config.initialize();\n\n return {\n ok: true,\n value: undefined,\n };\n } catch (error) {\n return {\n ok: false,\n error,\n };\n }\n }\n}\n","import type { Address } from '@sodax/types';\nimport { SonicSpokeProvider, type EvmHubProvider, type SpokeProvider } from '../../entities/index.js';\nimport { encodeAddress, EvmWalletAbstraction, SonicSpokeService } from '../../../index.js';\n\n/**\n * Service to get valid hub wallet address which may differ based on the spoke chain.\n */\n\nexport class WalletAbstractionService {\n /**\n * Gets the hub wallet address for a user based on their spoke chain address.\n * @param address - The user's address on the spoke chain\n * @param spokeProvider - The provider for interacting with the spoke chain\n * @param hubProvider - The provider for interacting with the hub chain\n * @returns The user's hub wallet address\n */\n public static async getUserAbstractedWalletAddress(\n address: string,\n spokeProvider: SpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<Address> {\n const encodedAddress = encodeAddress(spokeProvider.chainConfig.chain.id, address);\n // if spoke chain id is the same as the hub chain id, use the user router (sonic)\n if (spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id) {\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.getUserRouter(encodedAddress, spokeProvider);\n }\n\n throw new Error(\n '[getUserHubWalletAddress] Invalid spoke provider for matching hub id. Sonic spoke provider is required.',\n );\n }\n\n return EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n encodedAddress,\n hubProvider,\n );\n }\n}\n","import { WalletAbstractionService } from '../services/hub/WalletAbstractionService.js';\nimport invariant from 'tiny-invariant';\nimport {\n DEFAULT_MAX_RETRY,\n DEFAULT_RETRY_DELAY_MS,\n type EvmHubProvider,\n FEE_PERCENTAGE_SCALE,\n isPartnerFeeAmount,\n isPartnerFeePercentage,\n type PartnerFee,\n type QuoteType,\n type SpokeProvider,\n} from '../../index.js';\nimport type { SpokeChainId, Address, Hex } from '@sodax/types';\nimport { toHex } from 'viem';\nimport { bcs } from '@mysten/sui/bcs';\nimport { PublicKey } from '@solana/web3.js';\nimport { Address as StellarAddress } from '@stellar/stellar-sdk';\n\nexport async function retry<T>(\n action: (retryCount: number) => Promise<T>,\n retryCount: number = DEFAULT_MAX_RETRY,\n delayMs = DEFAULT_RETRY_DELAY_MS,\n): Promise<T> {\n do {\n try {\n return await action(retryCount);\n } catch (e) {\n retryCount--;\n\n if (retryCount <= 0) {\n console.error(`Failed to perform operation even after ${DEFAULT_MAX_RETRY} attempts.. Throwing origin error..`);\n throw e;\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, delayMs));\n } while (retryCount > 0);\n\n throw new Error(`Retry exceeded MAX_RETRY_DEFAULT=${DEFAULT_MAX_RETRY}`);\n}\n\nexport function getRandomBytes(length: number): Uint8Array {\n const array = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n array[i] = Math.floor(Math.random() * 256);\n }\n return array;\n}\n\nexport function randomUint256(): bigint {\n const bytes = getRandomBytes(32); // 256 bits\n let hex = '';\n\n for (const byte of bytes) {\n hex += byte.toString(16).padStart(2, '0') ?? '';\n }\n\n return BigInt(`0x${hex}`);\n}\n\n/**\n * Calculate the fee amount as a percentage of the input amount\n * @param {bigint} amount - The amount to calculate the fee for\n * @param {number} percentage - The percentage of the fee in basis points (e.g. 100 = 1%, 10000 = 100%)\n * @returns {bigint} The fee amount\n */\nexport function calculatePercentageFeeAmount(amount: bigint, percentage: number) {\n // Calculate fee as a percentage of the input amount\n return (amount * BigInt(percentage)) / FEE_PERCENTAGE_SCALE;\n}\n\n/**\n * Calculate the fee amount for a given input amount and fee\n * @param {bigint} inputAmount - The amount of input tokens\n * @param {PartnerFee} fee - The fee to calculate\n * @returns {bigint} The fee amount\n */\nexport function calculateFeeAmount(inputAmount: bigint, fee: PartnerFee | undefined): bigint {\n if (!fee) {\n return 0n;\n }\n\n invariant(inputAmount > 0n, 'Input amount must be greater than 0');\n\n let feeAmount = 0n;\n\n if (isPartnerFeeAmount(fee)) {\n invariant(\n fee.amount >= 0 && fee.amount <= inputAmount,\n `Fee amount must be greater than 0 and less than or equal to the input amount: ${fee.amount}`,\n );\n feeAmount = fee.amount;\n } else if (isPartnerFeePercentage(fee)) {\n invariant(\n fee.percentage >= 0 && fee.percentage <= FEE_PERCENTAGE_SCALE,\n `Fee percentage must be between 0 and ${FEE_PERCENTAGE_SCALE}}`,\n );\n\n feeAmount = calculatePercentageFeeAmount(inputAmount, fee.percentage);\n }\n\n return feeAmount;\n}\n\n/**\n * Adjust the amount by the fee amount based on the quote type\n * @param {bigint} amount - The amount to adjust\n * @param {PartnerFee | undefined} fee - The fee to adjust\n * @param {QuoteType} quoteType - The quote type\n * @returns {bigint} The adjusted amount\n */\nexport function adjustAmountByFee(amount: bigint, fee: PartnerFee | undefined, quoteType: QuoteType): bigint {\n invariant(amount > 0n, 'Amount must be greater than 0');\n invariant(quoteType === 'exact_input' || quoteType === 'exact_output', 'Invalid quote type');\n\n if (quoteType === 'exact_input') {\n return amount - calculateFeeAmount(amount, fee);\n }\n if (quoteType === 'exact_output') {\n return amount + calculateFeeAmount(amount, fee);\n }\n\n throw new Error('Invalid quote type');\n}\n\nexport function BigIntToHex(value: bigint): Hex {\n return `0x${value.toString(16)}`;\n}\n\nexport function encodeAddress(spokeChainId: SpokeChainId, address: string): Hex {\n switch (spokeChainId) {\n case '0xa86a.avax':\n case '0x2105.base':\n case '0xa.optimism':\n case '0x38.bsc':\n case '0x89.polygon':\n case '0xa4b1.arbitrum':\n case 'sonic':\n return address as Hex;\n\n case 'injective-1':\n return toHex(Buffer.from(address, 'utf-8'));\n\n case '0x1.icon':\n return toHex(Buffer.from(address.replace('cx', '01').replace('hx', '00') ?? 'f8', 'hex'));\n\n case 'sui':\n return toHex(bcs.Address.serialize(address).toBytes());\n\n case 'solana':\n return toHex(Buffer.from(new PublicKey(address).toBytes()));\n\n case 'stellar':\n return `0x${StellarAddress.fromString(address).toScVal().toXDR('hex')}`;\n\n default:\n return address as Hex;\n }\n}\n\n/**\n * Convert a valid hexadecimal string (with or without \"0x\") to BigInt.\n * Throws on invalid hex.\n */\nexport function hexToBigInt(hex: string): bigint {\n const trimmed = hex.trim().toLowerCase();\n\n // Validate hex: only digits 0-9 and letters a-f, optional 0x prefix\n const isValid = /^(0x)?[0-9a-f]+$/.test(trimmed);\n if (!isValid) {\n throw new Error(`Invalid hex string: \"${hex}\"`);\n }\n\n // Normalize with 0x prefix to make BigInt parse it as hexadecimal\n const normalized = trimmed.startsWith('0x') ? trimmed : `0x${trimmed}`;\n return BigInt(normalized);\n}\n\n/**\n * Derive user hub abstracted wallet address. Original address is used if spoke equals hub chain.\n * @param spokeProvider - Spoke provider instance for origin chain\n * @param hubProvider - Hub spoke provider\n * @param walletAddress - user original address on spoke chain\n * @returns Abstracted user wallet address for spoke chains with different chain id than hub or original\n */\nexport async function deriveUserWalletAddress(\n spokeProvider: SpokeProvider,\n hubProvider: EvmHubProvider,\n walletAddress?: string,\n): Promise<Address> {\n const address = (walletAddress ?? (await spokeProvider.walletProvider.getWalletAddress())) as Address;\n return spokeProvider.chainConfig.chain.id === hubProvider.chainConfig.chain.id // on hub chain, use real user wallet address\n ? address\n : await WalletAbstractionService.getUserAbstractedWalletAddress(address, spokeProvider, hubProvider);\n}\n\nexport function parseToStroops(amount: string): bigint {\n // Scale decimal string to integer stroops (1e7 multiplier)\n return BigInt(Math.round(Number.parseFloat(amount) * 1e7));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import { type Address, encodeFunctionData } from 'viem';\nimport { erc20Abi, spokeAssetManagerAbi } from '../../abis/index.js';\nimport type { EvmHubProvider, EvmSpokeProvider } from '../../entities/index.js';\nimport { connectionAbi } from '../../../index.js';\nimport type {\n DepositSimulationParams,\n EvmReturnType,\n EvmTransferToHubParams,\n PromiseEvmTxReturnType,\n TxReturnType,\n} from '../../types.js';\nimport { type EvmRawTransaction, type Hex, type HubAddress, getIntentRelayChainId } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport { encodeAddress } from '../../utils/shared-utils.js';\n\nexport type EvmSpokeDepositParams = {\n from: Address; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: Hex; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport class EvmSpokeService {\n private constructor() {}\n\n /**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param {EvmRawTransaction} rawTx - The raw transaction to estimate the gas for.\n * @param {EvmSpokeProvider} spokeProvider - The EVM spoke provider.\n * @returns {Promise<bigint>} Estimated gas for the transaction.\n *\n * @example\n *\n * const rawTx: EvmRawTransaction = {\n * from: '0x1234...abcd', // sender address\n * to: '0xabcd...1234', // recipient address\n * value: 1000000000000000000n, // 1 ETH in wei\n * data: '0x', // no calldata\n * };\n *\n * // Assume spokeProvider is an initialized EvmSpokeProvider\n * const estimatedGas = await EvmSpokeService.estimateGas(rawTx, spokeProvider);\n * console.log(`Estimated gas: ${estimatedGas}`);\n */\n public static async estimateGas(rawTx: EvmRawTransaction, spokeProvider: EvmSpokeProvider): Promise<bigint> {\n // Use viem's estimateGas with explicit parameter types\n return spokeProvider.publicClient.estimateGas({\n account: rawTx.from,\n to: rawTx.to,\n value: rawTx.value,\n data: rawTx.data,\n });\n }\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {EvmSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async deposit<R extends boolean = false>(\n params: EvmSpokeDepositParams,\n spokeProvider: EvmSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return EvmSpokeService.transfer(\n {\n token: params.token,\n recipient: to,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {EvmSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: Address, spokeProvider: EvmSpokeProvider): Promise<bigint> {\n return spokeProvider.publicClient.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [spokeProvider.chainConfig.addresses.assetManager],\n });\n }\n\n /**\n * Generate simulation parameters for deposit from EvmSpokeDepositParams.\n * @param {EvmSpokeDepositParams} params - The deposit parameters.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: EvmSpokeDepositParams,\n spokeProvider: EvmSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n params.from,\n hubProvider,\n ));\n\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: encodeAddress(spokeProvider.chainConfig.chain.id, params.token),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n spokeProvider.chainConfig.addresses.assetManager as `0x${string}`,\n ),\n };\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: EvmSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): Promise<TxReturnType<EvmSpokeProvider, R>> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n const result = await EvmSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n\n return result satisfies TxReturnType<EvmSpokeProvider, R>;\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {EvmTransferToHubParams} params - The parameters for the transfer, including:\n * - {Address} token: The address of the token to transfer (use address(0) for native token).\n * - {Address} recipient: The recipient address on the hub chain.\n * - {bigint} amount: The amount to transfer.\n * - {Hex} [data=\"0x\"]: Additional data for the transfer.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: EvmTransferToHubParams,\n spokeProvider: EvmSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const txPayload = {\n address: spokeProvider.chainConfig.addresses.assetManager,\n abi: spokeAssetManagerAbi,\n functionName: 'transfer',\n args: [token, recipient, amount, data],\n value: token.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase() ? amount : undefined,\n } as const;\n\n const from = await spokeProvider.walletProvider.getWalletAddress();\n const rawTx = {\n from,\n to: txPayload.address,\n value: txPayload.value ?? 0n,\n data: encodeFunctionData({\n abi: spokeAssetManagerAbi,\n functionName: 'transfer',\n args: [token, recipient, amount, data],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {Address} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {EvmSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseEvmTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: EvmSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const txPayload = {\n address: spokeProvider.chainConfig.addresses.connection,\n abi: connectionAbi,\n functionName: 'sendMessage',\n args: [dstChainId, dstAddress, payload],\n } as const;\n\n const from = await spokeProvider.walletProvider.getWalletAddress();\n const rawTx = {\n from,\n to: txPayload.address,\n value: 0n,\n data: encodeFunctionData({\n abi: connectionAbi,\n functionName: 'sendMessage',\n args: [dstChainId, dstAddress, payload],\n }),\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return rawTx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(rawTx) as PromiseEvmTxReturnType<R>;\n }\n}\n","import { type Address, type Hex, toHex } from 'viem';\nimport { InjectiveSpokeProvider } from '../../entities/injective/InjectiveSpokeProvider.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport {\n type DepositSimulationParams,\n type InjectiveGasEstimate,\n type PromiseInjectiveTxReturnType,\n encodeAddress,\n} from '../../../index.js';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport { CosmosTxV1Beta1Tx } from '@injectivelabs/core-proto-ts';\nimport { getIntentRelayChainId, type HubAddress, type InjectiveRawTransaction } from '@sodax/types';\n\nexport type InjectiveSpokeDepositParams = {\n from: string; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type InjectiveTransferToHubParams = {\n token: string;\n recipient: Address;\n amount: string;\n data: Hex;\n};\n\n/**\n * InjectiveSpokeService provides methods for interacting with the Injective spoke chain,\n * specifically for managing token deposits and transfers between the spoke chain and hub chain.\n * It handles the cross-chain communication and token bridging functionality, allowing users to:\n * - Deposit tokens from Injective to the hub chain\n * - Check token balances on the spoke chain\n * - Transfer tokens with custom data payloads\n */\n\nexport class InjectiveSpokeService {\n private constructor() {}\n\n /**\n * Estimate the gas for a transaction.\n * @param {InjectiveRawTransaction} rawTx - The raw transaction to estimate the gas for.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Promise<InjectiveGasEstimate>} The estimated gas for the transaction.\n */\n public static async estimateGas(\n rawTx: InjectiveRawTransaction,\n spokeProvider: InjectiveSpokeProvider,\n ): Promise<InjectiveGasEstimate> {\n const txRaw = CosmosTxV1Beta1Tx.TxRaw.fromPartial({\n bodyBytes: rawTx.signedDoc.bodyBytes,\n authInfoBytes: rawTx.signedDoc.authInfoBytes,\n signatures: [], // not required for simulation\n });\n\n const { gasInfo } = await spokeProvider.txClient.simulate(txRaw);\n\n return {\n gasWanted: gasInfo.gasWanted,\n gasUsed: gasInfo.gasUsed,\n } satisfies InjectiveGasEstimate;\n }\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {InjectiveSpokeDepositParams} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseInjectiveTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async deposit<R extends boolean = false>(\n params: InjectiveSpokeDepositParams,\n spokeProvider: InjectiveSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n toHex(Buffer.from(params.from, 'utf-8')),\n hubProvider,\n ));\n\n return InjectiveSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount.toString(),\n data: params.data,\n },\n spokeProvider,\n raw,\n );\n }\n\n /**\n * Generate simulation parameters for deposit from InjectiveSpokeDepositParams.\n * @param {InjectiveSpokeDepositParams} params - The deposit parameters.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: InjectiveSpokeDepositParams,\n spokeProvider: InjectiveSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n toHex(Buffer.from(params.from, 'utf-8')),\n hubProvider,\n ));\n\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: encodeAddress(spokeProvider.chainConfig.chain.id, params.token),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n spokeProvider.chainConfig.addresses.assetManager as `0x${string}`,\n ),\n };\n }\n\n /**\n * Get the balance of the token that deposited in the spoke chain Asset Manager.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {InjectiveSpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static async getDeposit(token: String, spokeProvider: InjectiveSpokeProvider): Promise<bigint> {\n const bal = await spokeProvider.getBalance(token);\n return BigInt(bal);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {PromiseInjectiveTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: InjectiveSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return InjectiveSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Transfers tokens to the hub chain.\n * @param {InjectiveTransferToHubParams} params - The parameters for the transfer, including:\n * - {string} token: The address of the token to transfer (use address(0) for native token).\n * - {Uint8Array} recipient: The recipient address on the hub chain.\n * - {string} amount: The amount to transfer.\n * - {Uint8Array} [data=new Uint8Array([])]: Additional data for the transfer.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {PromiseInjectiveTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data = '0x' }: InjectiveTransferToHubParams,\n spokeProvider: InjectiveSpokeProvider,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const sender = await spokeProvider.walletProvider.getWalletAddress();\n return InjectiveSpokeProvider.deposit(sender, token, recipient, amount, data, spokeProvider, raw);\n }\n\n /**\n * Sends a message to the hub chain.\n * @param {bigint} dstChainId - The chain ID of the hub chain.\n * @param {Address} dstAddress - The address on the hub chain.\n * @param {Hex} payload - The payload to send.\n * @param {InjectiveSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {PromiseInjectiveTxReturnType<R>} A promise that resolves to the transaction hash.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: Hex,\n payload: Hex,\n spokeProvider: InjectiveSpokeProvider,\n raw?: R,\n ): PromiseInjectiveTxReturnType<R> {\n const sender = await spokeProvider.walletProvider.getWalletAddress();\n return spokeProvider.send_message(sender, dstChainId.toString(), dstAddress, payload, raw);\n }\n}\n","import type { HttpUrl } from '@sodax/types';\nimport type { IconRawTransaction } from '../types.js';\nimport { hexToBigInt } from './shared-utils.js';\n\nexport async function estimateStepCost(rawTx: IconRawTransaction, debugRpcUrl: HttpUrl): Promise<bigint> {\n try {\n const tmpRawTx = { ...rawTx };\n delete tmpRawTx['stepLimit'];\n\n const response = await fetch(debugRpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n method: 'debug_estimateStep',\n id: 1234,\n params: tmpRawTx,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch step cost: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return hexToBigInt(data.result);\n } catch (e) {\n console.error('estimateStepCost error:', e);\n throw e;\n }\n}\n","import * as IconSdkRaw from 'icon-sdk-js';\nconst IconSdk = ('default' in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nconst { Converter, CallTransactionBuilder, CallBuilder } = IconSdk;\nimport * as rlp from 'rlp';\nimport type { Address, Hex } from 'viem';\nimport type { IconSpokeProvider } from '../../entities/icon/IconSpokeProvider.js';\nimport { getIconAddressBytes } from '../../entities/icon/utils.js';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { BigIntToHex, type ConfigService, encodeAddress } from '../../../index.js';\nimport type {\n DepositSimulationParams,\n IconGasEstimate,\n IconRawTransaction,\n IconReturnType,\n PromiseIconTxReturnType,\n} from '../../types.js';\nimport { type HubAddress, type IconAddress, getIntentRelayChainId } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport { estimateStepCost } from '../../utils/icon-utils.js';\n\nexport type IconSpokeDepositParams = {\n from: IconAddress; // The address of the user on the spoke chain\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: string; // The address of the token to deposit\n amount: bigint; // The amount of tokens to deposit\n data: Hex; // The data to send with the deposit\n};\n\nexport type IconTransferToHubParams = {\n token: string;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport class IconSpokeService {\n private constructor() {}\n\n public static async estimateGas(\n rawTx: IconRawTransaction,\n spokeProvider: IconSpokeProvider,\n ): Promise<IconGasEstimate> {\n return estimateStepCost(rawTx, spokeProvider.debugRpcUrl);\n }\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {IconSpokeDepositParams} params - The parameters for the deposit\n * @param {IconWalletProvider} spokeProvider - The provider for the spoke chain\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {Promise<Result<string>>} A promise that resolves to the transaction hash\n */\n public static async deposit<R extends boolean = false>(\n params: IconSpokeDepositParams,\n spokeProvider: IconSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n getIconAddressBytes(params.from),\n hubProvider,\n ));\n\n return IconSpokeService.transfer(\n {\n token: params.token,\n recipient: userWallet,\n amount: params.amount,\n data: params.data,\n },\n spokeProvider,\n hubProvider.configService,\n raw,\n );\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {string} token - The address of the token to get the balance of\n * @param {IconWalletProvider} spokeProvider - The spoke provider\n * @returns {Promise<bigint>} The balance of the token\n */\n public static async getDeposit(token: string, spokeProvider: IconSpokeProvider): Promise<bigint> {\n const transaction = new CallBuilder()\n .to(token)\n .method('balanceOf')\n .params({ _owner: spokeProvider.chainConfig.addresses.assetManager })\n .build();\n const result = await spokeProvider.iconService.call(transaction).execute();\n return BigInt(result.value);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain\n * @param {Hex} payload - The payload to send to the contract\n * @param {IconWalletProvider} spokeProvider - The provider for the spoke chain\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain\n * @param {boolean} raw - The return type raw or just transaction hash\n * @returns {Promise<Result<string>>} A promise that resolves to the transaction hash\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: IconSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return IconSpokeService.call(BigInt(relayId), from, payload, spokeProvider, raw);\n }\n\n /**\n * Generate simulation parameters for deposit from IconSpokeDepositParams.\n * @param {IconSpokeDepositParams} params - The deposit parameters.\n * @param {IconSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: IconSpokeDepositParams,\n spokeProvider: IconSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n getIconAddressBytes(params.from),\n hubProvider,\n ));\n\n const token = hubProvider.configService.isNativeToken(spokeProvider.chainConfig.chain.id, params.token)\n ? spokeProvider.chainConfig.addresses.wICX\n : params.token;\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: encodeAddress(spokeProvider.chainConfig.chain.id, token),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n spokeProvider.chainConfig.addresses.assetManager as `0x${string}`,\n ),\n };\n }\n\n /**\n * Transfers tokens to the hub chain.\n */\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data }: IconTransferToHubParams,\n spokeProvider: IconSpokeProvider,\n configService: ConfigService,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const rlpInput: rlp.Input = [data, recipient];\n const rlpEncodedData = rlp.encode(rlpInput);\n const hexData = `0x${Buffer.from(rlpEncodedData).toString('hex')}`;\n const params = {\n _to: spokeProvider.chainConfig.addresses.assetManager,\n _value: BigIntToHex(amount),\n _data: hexData,\n };\n\n const value: Hex = configService.isNativeToken(spokeProvider.chainConfig.chain.id, token)\n ? BigIntToHex(amount)\n : '0x0';\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const to = configService.isNativeToken(spokeProvider.chainConfig.chain.id, token)\n ? spokeProvider.chainConfig.addresses.wICX\n : token;\n\n const rawTransaction = Converter.toRawTransaction(\n new CallTransactionBuilder()\n .from(walletAddress)\n .to(to)\n .stepLimit(Converter.toBigNumber('2000000'))\n .nid(spokeProvider.chainConfig.nid)\n .version('0x3')\n .timestamp(new Date().getTime() * 1000)\n .value(value)\n .method('transfer')\n .params(params)\n .build(),\n );\n\n if (raw) {\n return rawTransaction satisfies IconReturnType<true> as IconReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction({\n from: walletAddress,\n to: to,\n value: value,\n nid: spokeProvider.chainConfig.nid,\n method: 'transfer',\n params: params,\n }) satisfies PromiseIconTxReturnType<false> as PromiseIconTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: IconSpokeProvider,\n raw?: R,\n ): PromiseIconTxReturnType<R> {\n const params = {\n dstChainId: dstChainId.toString(),\n dstAddress: dstAddress,\n payload: payload,\n };\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n const transaction = new CallTransactionBuilder()\n .from(walletAddress)\n .to(spokeProvider.chainConfig.addresses.connection)\n .stepLimit(Converter.toBigNumber('2000000'))\n .nid(spokeProvider.chainConfig.nid)\n .version('0x3')\n .timestamp(new Date().getTime() * 1000)\n .method('sendMessage')\n .params(params)\n .build();\n\n if (raw) {\n return Converter.toRawTransaction(transaction) as IconReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction({\n from: walletAddress,\n to: spokeProvider.chainConfig.addresses.connection,\n nid: spokeProvider.chainConfig.nid,\n value: '0x0',\n method: 'sendMessage',\n params: params,\n }) satisfies PromiseIconTxReturnType<false> as PromiseIconTxReturnType<R>;\n }\n}\n","import * as anchor from '@coral-xyz/anchor';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport type { AssetManager } from './types/asset_manager.js';\nimport type { Connection as ConnectionContract } from './types/connection.js';\nexport async function getProvider(base58PublicKey: string, rpcUrl: string): Promise<anchor.AnchorProvider> {\n const wallet = {\n publicKey: new PublicKey(base58PublicKey),\n signTransaction: () => Promise.reject(),\n signAllTransactions: () => Promise.reject(),\n };\n const connection = new Connection(rpcUrl);\n return new anchor.AnchorProvider(connection, wallet, { commitment: 'confirmed' });\n}\n\nexport async function getAssetManagerIdl(assetManager: string, provider: anchor.AnchorProvider) {\n try {\n const idl = await anchor.Program.fetchIdl(new PublicKey(assetManager), provider);\n\n if (!idl) {\n throw new Error('asset manager idl not available');\n }\n\n return idl;\n } catch (err) {\n console.error('Failed to fetch Program IDl:', err);\n throw err;\n }\n}\n\nexport async function getConnectionIdl(connection: string, provider: anchor.AnchorProvider) {\n try {\n const idl = await anchor.Program.fetchIdl(new PublicKey(connection), provider);\n\n if (!idl) {\n throw new Error('asset manager idl not available');\n }\n\n return idl;\n } catch (err) {\n console.log('Failed to fetch Program IDl:', err);\n throw err;\n }\n}\n\nexport async function getAssetManagerProgram(\n base58PublicKey: string,\n rpcUrl: string,\n assetManager: string,\n): Promise<anchor.Program<AssetManager>> {\n const provider = await getProvider(base58PublicKey, rpcUrl);\n const idl = await getAssetManagerIdl(assetManager, provider);\n\n return new anchor.Program(idl, provider) as unknown as anchor.Program<AssetManager>;\n}\n\nexport async function getConnectionProgram(\n base58PublicKey: string,\n rpcUrl: string,\n connection: string,\n): Promise<anchor.Program<ConnectionContract>> {\n const provider = await getProvider(base58PublicKey, rpcUrl);\n const idl = await getConnectionIdl(connection, provider);\n\n return new anchor.Program(idl, provider) as unknown as anchor.Program<ConnectionContract>;\n}\n","import { PublicKey } from '@solana/web3.js';\nimport type BN from 'bn.js';\n\nexport const RateLimitPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('rmconfig')], programId);\n return { bump, pda };\n },\n\n rateLimitAccount(programId: PublicKey, token: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('limit'), token.toBuffer()], programId);\n return { bump, pda };\n },\n};\n\nexport const ConnectionConfigPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('config')], programId);\n\n return { bump, pda };\n },\n\n receipt(programId: PublicKey, srcChainId: BN, connectionSn: BN) {\n const [pda, bump] = PublicKey.findProgramAddressSync(\n [Buffer.from('receipt'), srcChainId.toBuffer(), connectionSn.toBuffer()],\n programId,\n );\n\n return { bump, pda };\n },\n};\n\nexport const AssetManagerPDA = {\n config(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('config-seed')], programId);\n\n return { bump, pda };\n },\n\n vault_token(programId: PublicKey, mint: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('vault_seed'), mint.toBuffer()], programId);\n\n return { bump, pda };\n },\n\n vault_native(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('vault_native')], programId);\n\n return { bump, pda };\n },\n\n authority(programId: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync([Buffer.from('dapp_authority')], programId);\n\n return { bump, pda };\n },\n\n ta_creation_fee_account_pda(programId: PublicKey, mint: PublicKey) {\n const [pda, bump] = PublicKey.findProgramAddressSync(\n [Buffer.from('ta_creation_account_seed'), mint.toBuffer()],\n programId,\n );\n\n return { bump, pda };\n },\n};\n","import { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport {\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n SystemProgram,\n VersionedTransaction,\n type Finality,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport { keccak256, type Address, type Hex } from 'viem';\nimport type { EvmHubProvider } from '../../entities/index.js';\nimport { getAssetManagerProgram, getConnectionProgram } from '../../entities/solana/Configs.js';\nimport type { SolanaSpokeProvider } from '../../entities/solana/SolanaSpokeProvider.js';\nimport { AssetManagerPDA, ConnectionConfigPDA } from '../../entities/solana/pda/pda.js';\nimport { convertTransactionInstructionToRaw, isNative } from '../../entities/solana/utils/utils.js';\nimport type {\n DepositSimulationParams,\n PromiseSolanaTxReturnType,\n Result,\n SolanaGasEstimate,\n SolanaRawTransaction,\n SolanaReturnType,\n} from '../../types.js';\nimport { getIntentRelayChainId, type HubAddress, type SolanaBase58PublicKey } from '@sodax/types';\nimport { EvmWalletAbstraction } from '../hub/index.js';\nimport BN from 'bn.js';\nimport { encodeAddress } from '../../utils/shared-utils.js';\n\nexport type SolanaSpokeDepositParams = {\n from: SolanaBase58PublicKey;\n to?: HubAddress; // The address of the user on the hub chain (wallet abstraction address)\n token: SolanaBase58PublicKey;\n amount: bigint;\n data: Hex;\n};\n\nexport type SolanaTransferToHubParams = {\n token: PublicKey;\n recipient: string;\n amount: string;\n data: Hex;\n};\n\nexport class SolanaSpokeService {\n private constructor() {}\n\n /**\n * Estimate the gas for a transaction.\n * @param {SolanaRawTransaction} rawTx - The raw transaction to estimate the gas for.\n * @param {SolanaSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Promise<number | undefined>} The units consumed for the transaction.\n */\n public static async estimateGas(\n rawTx: SolanaRawTransaction,\n spokeProvider: SolanaSpokeProvider,\n ): Promise<SolanaGasEstimate> {\n const connection = new Connection(spokeProvider.chainConfig.rpcUrl, 'confirmed');\n\n const serializedTxBytes = Buffer.from(rawTx.data, 'base64');\n const versionedTx = VersionedTransaction.deserialize(serializedTxBytes);\n\n const { value } = await connection.simulateTransaction(versionedTx);\n\n if (value.err) {\n throw new Error(`Failed to simulate transaction: ${JSON.stringify(value.err, null, 2)}`);\n }\n\n return value.unitsConsumed;\n }\n\n public static async deposit<R extends boolean = false>(\n params: SolanaSpokeDepositParams,\n spokeProvider: SolanaSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const userWallet: Address =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n hubProvider,\n ));\n\n return SolanaSpokeService.transfer(\n {\n token: new PublicKey(params.token),\n recipient: userWallet,\n amount: params.amount.toString(),\n data: keccak256(params.data),\n },\n spokeProvider,\n raw,\n );\n }\n\n public static async getDeposit(token: string, spokeProvider: SolanaSpokeProvider): Promise<bigint> {\n const assetManagerProgramId = new PublicKey(spokeProvider.chainConfig.addresses.assetManager);\n const solToken = new PublicKey(token);\n\n if (isNative(new PublicKey(solToken))) {\n const vaultNative = AssetManagerPDA.vault_native(assetManagerProgramId);\n const balance = await spokeProvider.walletProvider.getBalance(vaultNative.pda.toBase58());\n return BigInt(balance);\n }\n\n const vaultToken = AssetManagerPDA.vault_token(assetManagerProgramId, new PublicKey(solToken));\n const tokenAccount = await spokeProvider.walletProvider.getTokenAccountBalance(vaultToken.pda.toBase58());\n\n return BigInt(tokenAccount.value.amount);\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param from - The address of the user on the hub chain.\n * @param payload - The payload to send to the contract.\n * @param spokeProvider - The spoke provider.\n * @param hubProvider - The hub provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n public static async callWallet<R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: SolanaSpokeProvider,\n hubProvider: EvmHubProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const relayId = getIntentRelayChainId(hubProvider.chainConfig.chain.id);\n return SolanaSpokeService.call(BigInt(relayId), from, keccak256(payload), spokeProvider, raw);\n }\n\n /**\n * Generate simulation parameters for deposit from SolanaSpokeDepositParams.\n * @param {SolanaSpokeDepositParams} params - The deposit parameters.\n * @param {SolanaSpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<DepositSimulationParams>} The simulation parameters.\n */\n public static async getSimulateDepositParams(\n params: SolanaSpokeDepositParams,\n spokeProvider: SolanaSpokeProvider,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n const to =\n params.to ??\n (await EvmWalletAbstraction.getUserHubWalletAddress(\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n hubProvider,\n ));\n\n return {\n spokeChainID: spokeProvider.chainConfig.chain.id,\n token: encodeAddress(spokeProvider.chainConfig.chain.id, params.token),\n from: encodeAddress(spokeProvider.chainConfig.chain.id, params.from),\n to,\n amount: params.amount,\n data: params.data,\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n spokeProvider.chainConfig.addresses.assetManager as `0x${string}`,\n ),\n };\n }\n\n private static async transfer<R extends boolean = false>(\n { token, recipient, amount, data }: SolanaTransferToHubParams,\n spokeProvider: SolanaSpokeProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n let depositInstruction: TransactionInstruction;\n const amountBN = new BN(amount);\n const { walletProvider, chainConfig } = spokeProvider;\n const { rpcUrl, addresses } = chainConfig;\n const walletPublicKey = new PublicKey(walletProvider.getWalletBase58PublicKey());\n\n const assetManagerProgram = await getAssetManagerProgram(\n walletProvider.getWalletBase58PublicKey(),\n rpcUrl,\n addresses.assetManager,\n );\n\n const connectionProgram = await getConnectionProgram(\n walletProvider.getWalletBase58PublicKey(),\n rpcUrl,\n addresses.connection,\n );\n\n if (isNative(token)) {\n depositInstruction = await assetManagerProgram.methods\n .transfer(amountBN, Buffer.from(recipient.slice(2), 'hex'), Buffer.from(data.slice(2), 'hex'))\n .accountsStrict({\n signer: walletPublicKey,\n systemProgram: SystemProgram.programId,\n config: AssetManagerPDA.config(assetManagerProgram.programId).pda,\n nativeVaultAccount: AssetManagerPDA.vault_native(assetManagerProgram.programId).pda,\n tokenVaultAccount: null,\n signerTokenAccount: null,\n authority: AssetManagerPDA.authority(assetManagerProgram.programId).pda,\n mint: null,\n connection: connectionProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts([\n {\n pubkey: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n isSigner: false,\n isWritable: true,\n },\n ])\n .instruction();\n } else {\n const signerTokenAccount = await spokeProvider.walletProvider.getAssociatedTokenAddress(token.toBase58());\n depositInstruction = await assetManagerProgram.methods\n .transfer(amountBN, Buffer.from(recipient.slice(2), 'hex'), Buffer.from(data.slice(2), 'hex'))\n .accountsStrict({\n signer: walletPublicKey,\n systemProgram: SystemProgram.programId,\n config: AssetManagerPDA.config(assetManagerProgram.programId).pda,\n nativeVaultAccount: null,\n tokenVaultAccount: AssetManagerPDA.vault_token(assetManagerProgram.programId, token).pda,\n signerTokenAccount: signerTokenAccount,\n authority: AssetManagerPDA.authority(assetManagerProgram.programId).pda,\n mint: token,\n connection: connectionProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts([\n {\n pubkey: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n isSigner: false,\n isWritable: true,\n },\n ])\n .instruction();\n }\n\n const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n units: 1_400_000,\n });\n\n const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 0,\n });\n\n const serializedTransaction = await spokeProvider.walletProvider.buildV0Txn([\n convertTransactionInstructionToRaw(modifyComputeUnits),\n convertTransactionInstructionToRaw(addPriorityFee),\n convertTransactionInstructionToRaw(depositInstruction),\n ]);\n\n if (raw) {\n return {\n from: walletPublicKey.toBase58(),\n to: assetManagerProgram.programId.toBase58(),\n value: BigInt(amountBN.toString()),\n data: Buffer.from(serializedTransaction).toString('base64'),\n } satisfies SolanaReturnType<true> as SolanaReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(serializedTransaction) as PromiseSolanaTxReturnType<R>;\n }\n\n /**\n * Sends a message to the hub chain.\n * @param dstChainId - The chain ID of the hub chain.\n * @param dstAddress - The address on the hub chain.\n * @param payload - The payload to send.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction data.\n * @returns The transaction result.\n */\n private static async call<R extends boolean = false>(\n dstChainId: bigint,\n dstAddress: HubAddress,\n payload: Hex,\n spokeProvider: SolanaSpokeProvider,\n raw?: R,\n ): PromiseSolanaTxReturnType<R> {\n const { walletProvider, chainConfig } = spokeProvider;\n const { rpcUrl, addresses } = chainConfig;\n const walletPublicKey = new PublicKey(walletProvider.getWalletBase58PublicKey());\n\n const connectionProgram = await getConnectionProgram(\n walletProvider.getWalletBase58PublicKey(),\n rpcUrl,\n addresses.connection,\n );\n\n const sendMessageInstruction = await connectionProgram.methods\n .sendMessage(\n new BN(dstChainId.toString()),\n Buffer.from(dstAddress.slice(2), 'hex'),\n Buffer.from(payload.slice(2), 'hex'),\n )\n .accountsStrict({\n signer: walletPublicKey,\n dapp: null,\n config: ConnectionConfigPDA.config(connectionProgram.programId).pda,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n\n const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({\n units: 1000000,\n });\n\n const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: 0,\n });\n\n const serializedTransaction = await spokeProvider.walletProvider.buildV0Txn([\n convertTransactionInstructionToRaw(modifyComputeUnits),\n convertTransactionInstructionToRaw(addPriorityFee),\n convertTransactionInstructionToRaw(sendMessageInstruction),\n ]);\n\n if (raw) {\n return {\n from: walletPublicKey.toBase58(),\n to: connectionProgram.programId.toBase58(),\n value: 0n,\n data: Buffer.from(serializedTransaction).toString('base64'),\n } satisfies SolanaReturnType<true> as SolanaReturnType<R>;\n }\n return spokeProvider.walletProvider.sendTransaction(serializedTransaction) as PromiseSolanaTxReturnType<R>;\n }\n\n public static async waitForConfirmation(\n spokeProvider: SolanaSpokeProvider,\n signature: string,\n commitment: Finality = 'finalized',\n timeoutMs = 60_000, // total time to wait\n ): Promise<Result<boolean>> {\n const connection = new Connection(spokeProvider.chainConfig.rpcUrl, commitment);\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n const tx = await connection.getTransaction(signature, { commitment, maxSupportedTransactionVersion: 0 });\n if (tx) {\n if (tx.meta?.err) {\n return { ok: false, error: new Error(JSON.stringify(tx.meta.err)) };\n }\n return { ok: true, value: true };\n }\n } catch {\n // ignore transient RPC errors and keep polling\n }\n await new Promise(r => setTimeout(r, 750)); // linear 750ms retry\n }\n\n return {\n ok: false,\n error: new Error(`Timed out after ${timeoutMs}ms waiting for ${commitment} confirmation for ${signature}`),\n };\n }\n}\n","import type {\n JsonRpcPayloadResponse,\n ResponseAddressType,\n ResponseSigningType,\n} from './entities/icon/HanaWalletConnector.js';\nimport {\n InjectiveSpokeProvider,\n IconSpokeProvider,\n SolanaSpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n type EvmUninitializedConfig,\n type EvmInitializedConfig,\n type EvmUninitializedPrivateKeyConfig,\n type EvmUninitializedBrowserConfig,\n type SpokeProvider,\n EvmSpokeProvider,\n SonicSpokeProvider,\n} from './entities/index.js';\nimport type {\n EvmHubChainConfig,\n HubChainConfig,\n IntentError,\n MoneyMarketConfigParams,\n Optional,\n PartnerFeeAmount,\n PartnerFeeConfig,\n PartnerFeePercentage,\n Prettify,\n SolverConfigParams,\n MoneyMarketError,\n MoneyMarketUnknownError,\n IcxMigrateParams,\n UnifiedBnUSDMigrateParams,\n BalnMigrateParams,\n IcxCreateRevertMigrationParams,\n} from '../index.js';\nimport {\n type EvmSpokeChainConfig,\n type SpokeChainConfig,\n type SolverConfig,\n type MoneyMarketConfig,\n type IconAddress,\n type IntentRelayChainId,\n SONIC_MAINNET_CHAIN_ID,\n ChainIdToIntentRelayChainId,\n} from '@sodax/types';\n\nexport function isEvmHubChainConfig(value: HubChainConfig): value is EvmHubChainConfig {\n return typeof value === 'object' && value.chain.type === 'EVM';\n}\n\nexport function isEvmSpokeChainConfig(value: SpokeChainConfig): value is EvmSpokeChainConfig {\n return typeof value === 'object' && value.chain.type === 'EVM';\n}\n\nexport function isEvmUninitializedConfig(\n value: EvmUninitializedConfig | EvmInitializedConfig,\n): value is EvmUninitializedConfig {\n return typeof value === 'object' && 'chain' in value;\n}\n\nexport function isEvmInitializedConfig(\n value: EvmUninitializedConfig | EvmInitializedConfig,\n): value is EvmInitializedConfig {\n return typeof value === 'object' && 'walletClient' in value && 'publicClient' in value;\n}\n\nexport function isEvmUninitializedBrowserConfig(value: EvmUninitializedConfig): value is EvmUninitializedBrowserConfig {\n return typeof value === 'object' && 'userAddress' in value && 'chain' in value && 'provider' in value;\n}\n\nexport function isEvmUninitializedPrivateKeyConfig(\n value: EvmUninitializedConfig,\n): value is EvmUninitializedPrivateKeyConfig {\n return typeof value === 'object' && 'chain' in value && 'privateKey' in value;\n}\n\nexport function isIconAddress(value: unknown): value is IconAddress {\n return typeof value === 'string' && /^hx[a-f0-9]{40}$|^cx[a-f0-9]{40}$/.test(value);\n}\nexport function isResponseAddressType(value: unknown): value is ResponseAddressType {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'payload' in value &&\n value.type === 'RESPONSE_ADDRESS' &&\n isIconAddress(value.payload)\n );\n}\n\nexport function isResponseSigningType(value: unknown): value is ResponseSigningType {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'payload' in value &&\n value.type === 'RESPONSE_SIGNING' &&\n typeof value.payload === 'string'\n );\n}\n\nexport function isJsonRpcPayloadResponse(value: unknown): value is JsonRpcPayloadResponse {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'id' in value &&\n 'result' in value &&\n typeof value.result === 'string'\n );\n}\n\nexport function isIntentRelayChainId(value: bigint): value is IntentRelayChainId {\n return (\n typeof value === 'bigint' &&\n value >= 0n &&\n Object.values(ChainIdToIntentRelayChainId).includes(value as IntentRelayChainId)\n );\n}\n\nexport function isPartnerFeeAmount(value: unknown): value is PartnerFeeAmount {\n return typeof value === 'object' && value !== null && 'address' in value && 'amount' in value;\n}\n\nexport function isPartnerFeePercentage(value: unknown): value is PartnerFeePercentage {\n return typeof value === 'object' && value !== null && 'address' in value && 'percentage' in value;\n}\n\nexport function isEvmSpokeProvider(value: SpokeProvider): value is EvmSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof EvmSpokeProvider &&\n value.chainConfig.chain.type === 'EVM'\n );\n}\n\nexport function isSonicSpokeProvider(value: SpokeProvider): value is SonicSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SonicSpokeProvider &&\n value.chainConfig.chain.type === 'EVM' &&\n value.chainConfig.chain.id === SONIC_MAINNET_CHAIN_ID\n );\n}\n\nexport function isSolanaSpokeProvider(value: SpokeProvider): value is SolanaSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SolanaSpokeProvider &&\n value.chainConfig.chain.type === 'SOLANA'\n );\n}\n\nexport function isStellarSpokeProvider(value: SpokeProvider): value is StellarSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof StellarSpokeProvider &&\n value.chainConfig.chain.type === 'STELLAR'\n );\n}\n\nexport function isInjectiveSpokeProvider(value: SpokeProvider): value is InjectiveSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof InjectiveSpokeProvider &&\n value.chainConfig.chain.type === 'INJECTIVE'\n );\n}\n\nexport function isIconSpokeProvider(value: SpokeProvider): value is IconSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof IconSpokeProvider &&\n value.chainConfig.chain.type === 'ICON'\n );\n}\n\nexport function isSuiSpokeProvider(value: SpokeProvider): value is SuiSpokeProvider {\n return (\n typeof value === 'object' &&\n value !== null &&\n value instanceof SuiSpokeProvider &&\n value.chainConfig.chain.type === 'SUI'\n );\n}\n\nexport function isConfiguredSolverConfig(\n value: SolverConfigParams,\n): value is Prettify<SolverConfig & Optional<PartnerFeeConfig, 'partnerFee'>> {\n return typeof value === 'object' && value !== null && 'intentsContract' in value && 'solverApiEndpoint' in value;\n}\n\nexport function isConfiguredMoneyMarketConfig(\n value: MoneyMarketConfigParams,\n): value is Prettify<MoneyMarketConfig & Optional<PartnerFeeConfig, 'partnerFee'>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'lendingPool' in value &&\n 'uiPoolDataProvider' in value &&\n 'poolAddressesProvider' in value &&\n 'bnUSD' in value &&\n 'bnUSDVault' in value\n );\n}\n\nexport function isIntentCreationFailedError(error: unknown): error is IntentError<'CREATION_FAILED'> {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'CREATION_FAILED' &&\n 'data' in error &&\n typeof error.data === 'object' &&\n error.data !== null &&\n 'payload' in error.data &&\n 'error' in error.data\n );\n}\n\nexport function isIntentSubmitTxFailedError(error: unknown): error is IntentError<'SUBMIT_TX_FAILED'> {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'SUBMIT_TX_FAILED' &&\n 'data' in error &&\n typeof error.data === 'object' &&\n error.data !== null &&\n 'payload' in error.data &&\n 'error' in error.data\n );\n}\n\nexport function isIntentPostExecutionFailedError(error: unknown): error is IntentError<'POST_EXECUTION_FAILED'> {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'POST_EXECUTION_FAILED' &&\n 'data' in error &&\n typeof error.data === 'object' &&\n error.data !== null &&\n 'detail' in error.data\n );\n}\n\nexport function isWaitUntilIntentExecutedFailed(error: unknown): error is IntentError<'RELAY_TIMEOUT'> {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'RELAY_TIMEOUT' &&\n 'data' in error &&\n typeof error.data === 'object' &&\n error.data !== null &&\n 'payload' in error.data &&\n 'error' in error.data\n );\n}\n\nexport function isIntentCreationUnknownError(error: unknown): error is IntentError<'UNKNOWN'> {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === 'UNKNOWN' &&\n 'data' in error &&\n typeof error.data === 'object' &&\n error.data !== null &&\n 'payload' in error.data &&\n 'error' in error.data\n );\n}\n\nexport function isMoneyMarketSubmitTxFailedError(error: unknown): error is MoneyMarketError<'SUBMIT_TX_FAILED'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'SUBMIT_TX_FAILED';\n}\n\nexport function isMoneyMarketRelayTimeoutError(error: unknown): error is MoneyMarketError<'RELAY_TIMEOUT'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'RELAY_TIMEOUT';\n}\n\nexport function isMoneyMarketCreateSupplyIntentFailedError(\n error: unknown,\n): error is MoneyMarketError<'CREATE_SUPPLY_INTENT_FAILED'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'CREATE_SUPPLY_INTENT_FAILED';\n}\n\nexport function isMoneyMarketCreateBorrowIntentFailedError(\n error: unknown,\n): error is MoneyMarketError<'CREATE_BORROW_INTENT_FAILED'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'CREATE_BORROW_INTENT_FAILED';\n}\n\nexport function isMoneyMarketCreateWithdrawIntentFailedError(\n error: unknown,\n): error is MoneyMarketError<'CREATE_WITHDRAW_INTENT_FAILED'> {\n return (\n typeof error === 'object' && error !== null && 'code' in error && error.code === 'CREATE_WITHDRAW_INTENT_FAILED'\n );\n}\n\nexport function isMoneyMarketCreateRepayIntentFailedError(\n error: unknown,\n): error is MoneyMarketError<'CREATE_REPAY_INTENT_FAILED'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'CREATE_REPAY_INTENT_FAILED';\n}\n\nexport function isMoneyMarketSupplyUnknownError(\n error: unknown,\n): error is MoneyMarketUnknownError<'SUPPLY_UNKNOWN_ERROR'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'SUPPLY_UNKNOWN_ERROR';\n}\n\nexport function isMoneyMarketBorrowUnknownError(\n error: unknown,\n): error is MoneyMarketUnknownError<'BORROW_UNKNOWN_ERROR'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'BORROW_UNKNOWN_ERROR';\n}\n\nexport function isMoneyMarketWithdrawUnknownError(\n error: unknown,\n): error is MoneyMarketUnknownError<'WITHDRAW_UNKNOWN_ERROR'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'WITHDRAW_UNKNOWN_ERROR';\n}\n\nexport function isMoneyMarketRepayUnknownError(\n error: unknown,\n): error is MoneyMarketUnknownError<'REPAY_UNKNOWN_ERROR'> {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'REPAY_UNKNOWN_ERROR';\n}\n\nexport function isIcxMigrateParams(value: unknown): value is IcxMigrateParams {\n return typeof value === 'object' && value !== null && 'address' in value && 'amount' in value && 'to' in value;\n}\n\nexport function isUnifiedBnUSDMigrateParams(value: unknown): value is UnifiedBnUSDMigrateParams {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'srcChainId' in value &&\n 'srcbnUSD' in value &&\n 'dstChainId' in value &&\n 'dstbnUSD' in value &&\n 'amount' in value &&\n 'to' in value\n );\n}\n\nexport function isBalnMigrateParams(value: unknown): value is BalnMigrateParams {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'amount' in value &&\n 'lockupPeriod' in value &&\n 'to' in value &&\n 'stake' in value\n );\n}\n\nexport function isIcxCreateRevertMigrationParams(value: unknown): value is IcxCreateRevertMigrationParams {\n return typeof value === 'object' && value !== null && 'amount' in value && 'to' in value;\n}\n","import { InjectiveSpokeProvider } from '../../entities/injective/InjectiveSpokeProvider.js';\nimport { IconSpokeProvider } from '../../entities/icon/IconSpokeProvider.js';\nimport {\n type EvmHubProvider,\n EvmSpokeProvider,\n SolanaSpokeProvider,\n SonicSpokeProvider,\n type SpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n} from '../../entities/index.js';\nimport type {\n GetEstimateGasReturnType,\n GetSpokeDepositParamsType,\n PromiseTxReturnType,\n TxReturnType,\n DepositSimulationParams,\n WalletSimulationParams,\n Result,\n} from '../../types.js';\nimport { getIntentRelayChainId, type Address, type Hex, type HubAddress } from '@sodax/types';\nimport { InjectiveSpokeService } from './InjectiveSpokeService.js';\nimport { EvmSpokeService } from './EvmSpokeService.js';\nimport { IconSpokeService } from './IconSpokeService.js';\nimport { SolanaSpokeService } from './SolanaSpokeService.js';\nimport { StellarSpokeService } from './StellarSpokeService.js';\nimport { SuiSpokeService } from './SuiSpokeService.js';\nimport { SonicSpokeService, type SonicSpokeDepositParams } from './SonicSpokeService.js';\nimport {\n isInjectiveSpokeProvider,\n isEvmSpokeProvider,\n isIconSpokeProvider,\n isSolanaSpokeProvider,\n isSonicSpokeProvider,\n isStellarSpokeProvider,\n isSuiSpokeProvider,\n} from '../../guards.js';\nimport * as rlp from 'rlp';\nimport { encodeFunctionData } from 'viem';\nimport { encodeAddress } from '../../utils/shared-utils.js';\n\n/**\n * SpokeService is a main class that provides functionalities for dealing with spoke chains.\n * It uses command pattern to execute different spoke chain operations.\n */\n\nexport class SpokeService {\n private constructor() {}\n\n /**\n * Estimate the gas for a raw transaction.\n * @param {TxReturnType<T, true>} params - The parameters for the raw transaction.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @returns {Promise<GetEstimateGasReturnType<T>>} A promise that resolves to the gas.\n */\n public static async estimateGas<T extends SpokeProvider = SpokeProvider>(\n params: TxReturnType<T, true>,\n spokeProvider: T,\n ): Promise<GetEstimateGasReturnType<T>> {\n if (spokeProvider instanceof EvmSpokeProvider) {\n return EvmSpokeService.estimateGas(\n params as TxReturnType<EvmSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<EvmSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.estimateGas(\n params as TxReturnType<SonicSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<SonicSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof InjectiveSpokeProvider) {\n return InjectiveSpokeService.estimateGas(\n params as TxReturnType<InjectiveSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<InjectiveSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n return IconSpokeService.estimateGas(\n params as TxReturnType<IconSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<IconSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof SuiSpokeProvider) {\n return SuiSpokeService.estimateGas(\n params as TxReturnType<SuiSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<SuiSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof SolanaSpokeProvider) {\n return SolanaSpokeService.estimateGas(\n params as TxReturnType<SolanaSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<SolanaSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n return StellarSpokeService.estimateGas(\n params as TxReturnType<StellarSpokeProvider, true>,\n spokeProvider,\n ) satisfies Promise<GetEstimateGasReturnType<StellarSpokeProvider>> as Promise<GetEstimateGasReturnType<T>>;\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n /**\n\n * Encodes transfer data using RLP encoding to match Solidity Transfer struct.\n * @param {Hex} token - The token contract address.\n * @param {Hex} from - The sender address.\n * @param {Hex} to - The recipient address.\n * @param {bigint} amount - The transfer amount.\n * @param {Hex} data - The encoded data payload.\n * @returns {Promise<Hex>} A promise that resolves to the RLP encoded transfer data.\n */\n public static encodeTransfer(token: Hex, from: Hex, to: Hex, amount: bigint, data: Hex): Hex {\n // Create RLP input array matching Solidity Transfer struct:\n // bytes token, bytes from, bytes to, uint256 amount, bytes data\n const rlpInput: rlp.Input = [\n token, // token (bytes)\n from, // from (bytes)\n to, // to (bytes)\n amount, // amount (uint256)\n data, // data (bytes)\n ];\n\n const rlpEncodedData = rlp.encode(rlpInput);\n\n return `0x${Buffer.from(rlpEncodedData).toString('hex')}`;\n }\n public static async simulateDeposit(\n params: DepositSimulationParams,\n hubProvider: EvmHubProvider,\n ): Promise<{ success: boolean; error?: string }> {\n const chainId = getIntentRelayChainId(params.spokeChainID);\n const hubAssetManager = hubProvider.chainConfig.addresses.assetManager;\n const payload = SpokeService.encodeTransfer(params.token, params.from, params.to, params.amount, params.data);\n\n return SpokeService.simulateRecvMessage(\n { target: hubAssetManager, srcChainId: chainId, srcAddress: params.srcAddress, payload },\n hubProvider,\n );\n }\n\n /**\n * Simulates receiving a message without signature verification.\n * This function calls simulateRecvMessage which always reverts with 'Simulation completed'.\n * @param {bigint} srcChainId - The chain ID of the originating chain.\n * @param {Hex} srcAddress - The address of the sender on the originating chain.\n * @param {Hex} payload - The encoded payload containing call data (from encodeTransfer).\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<{ success: boolean; error?: string }>} Result of the simulation.\n */\n public static async simulateRecvMessage(\n params: WalletSimulationParams,\n hubProvider: EvmHubProvider,\n ): Promise<{ success: boolean; error?: string }> {\n try {\n // Call simulateRecvMessage using staticCall (read-only)\n const result = await hubProvider.publicClient.call({\n to: params.target,\n data: encodeFunctionData({\n abi: [\n {\n name: 'simulateRecvMessage',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'srcChainId', type: 'uint256' },\n { name: 'srcAddress', type: 'bytes' },\n { name: 'payload', type: 'bytes' },\n ],\n outputs: [],\n },\n ],\n functionName: 'simulateRecvMessage',\n args: [params.srcChainId, params.srcAddress, params.payload],\n }),\n });\n\n // If we get here, the function didn't revert as expected\n console.warn('simulateRecvMessage did not revert as expected', { result });\n return {\n success: false,\n error: 'Function should have reverted with \"Simulation completed\"',\n };\n } catch (error: unknown) {\n // Check if it's the expected revert\n if (error instanceof Error && error.message?.includes('Simulation completed')) {\n console.warn('simulateRecvMessage completed successfully with expected revert');\n return { success: true };\n }\n\n // Handle other contract errors\n console.error('simulateRecvMessage failed with unexpected error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message || 'Unknown simulation error' : 'Unknown simulation error',\n };\n }\n }\n\n /**\n * Deposit tokens to the spoke chain.\n * @param {GetSpokeDepositParamsType<T extends SpokeProvider>} params - The parameters for the deposit, including the user's address, token address, amount, and additional data.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @param {boolean} raw - Whether to return raw transaction data.\n * @param {boolean} skipSimulation - Whether to skip deposit simulation (optional, defaults to false).\n * @returns {Promise<Hash>} A promise that resolves to the transaction hash.\n */\n public static async deposit<T extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n params: GetSpokeDepositParamsType<T>,\n spokeProvider: T,\n hubProvider: EvmHubProvider,\n raw?: R,\n skipSimulation = false,\n ): Promise<PromiseTxReturnType<T, R>> {\n if (spokeProvider instanceof SonicSpokeProvider) {\n const _params: SonicSpokeDepositParams = params as GetSpokeDepositParamsType<SonicSpokeProvider>;\n return SonicSpokeService.deposit(_params, spokeProvider, raw) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof EvmSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return EvmSpokeService.deposit(\n params as GetSpokeDepositParamsType<EvmSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof InjectiveSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return InjectiveSpokeService.deposit(params, spokeProvider, hubProvider, raw) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return IconSpokeService.deposit(\n params as GetSpokeDepositParamsType<IconSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n if (spokeProvider instanceof SuiSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return SuiSpokeService.deposit(\n params as GetSpokeDepositParamsType<SuiSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n if (spokeProvider instanceof SolanaSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return SolanaSpokeService.deposit(\n params as GetSpokeDepositParamsType<SolanaSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n await SpokeService.verifyDepositSimulation(params, spokeProvider, hubProvider, skipSimulation);\n return StellarSpokeService.deposit(\n params as GetSpokeDepositParamsType<StellarSpokeProvider>,\n spokeProvider,\n hubProvider,\n raw,\n ) as PromiseTxReturnType<T, R>;\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n public static getSimulateDepositParams<S extends SpokeProvider>(\n params: GetSpokeDepositParamsType<S>,\n spokeProvider: S,\n hubProvider: EvmHubProvider,\n ): Promise<DepositSimulationParams> {\n if (spokeProvider instanceof EvmSpokeProvider) {\n return EvmSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<EvmSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n if (spokeProvider instanceof InjectiveSpokeProvider) {\n return InjectiveSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<InjectiveSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n return IconSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<IconSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n if (spokeProvider instanceof SuiSpokeProvider) {\n return SuiSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<SuiSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n if (spokeProvider instanceof SolanaSpokeProvider) {\n return SolanaSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<SolanaSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n return StellarSpokeService.getSimulateDepositParams(\n params as GetSpokeDepositParamsType<StellarSpokeProvider>,\n spokeProvider,\n hubProvider,\n );\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n public static async verifyDepositSimulation<S extends SpokeProvider>(\n params: GetSpokeDepositParamsType<S>,\n spokeProvider: S,\n hubProvider: EvmHubProvider,\n skipSimulation: boolean,\n ): Promise<void> {\n if (!skipSimulation) {\n const simulationParams = await SpokeService.getSimulateDepositParams(params, spokeProvider, hubProvider);\n const result = await SpokeService.simulateDeposit(simulationParams, hubProvider);\n\n if (!result.success) {\n throw new Error('Simulation failed', { cause: result });\n }\n }\n }\n\n /**\n * Get the balance of the token in the spoke chain.\n * @param {Address} token - The address of the token to get the balance of.\n * @param {SpokeProvider} spokeProvider - The spoke provider.\n * @returns {Promise<bigint>} The balance of the token.\n */\n public static getDeposit(token: Address, spokeProvider: SpokeProvider): Promise<bigint> {\n if (spokeProvider instanceof EvmSpokeProvider) {\n return EvmSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof InjectiveSpokeProvider) {\n return InjectiveSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof StellarSpokeProvider) {\n return StellarSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SuiSpokeProvider) {\n return SuiSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof IconSpokeProvider) {\n return IconSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SolanaSpokeProvider) {\n return SolanaSpokeService.getDeposit(token, spokeProvider);\n }\n if (spokeProvider instanceof SonicSpokeProvider) {\n return SonicSpokeService.getDeposit(token, spokeProvider);\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n /**\n * Calls a contract on the spoke chain using the user's wallet.\n * @param {HubAddress} from - The address of the user on the hub chain.\n * @param {Hex} payload - The payload to send to the contract.\n * @param {SpokeProvider} spokeProvider - The provider for the spoke chain.\n * @param {EvmHubProvider} hubProvider - The provider for the hub chain.\n * @returns {Promise<Hash>} A promise that resolves to the transaction hash.\n */\n public static async callWallet<T extends SpokeProvider = SpokeProvider, R extends boolean = false>(\n from: HubAddress,\n payload: Hex,\n spokeProvider: T,\n hubProvider: EvmHubProvider,\n raw?: R,\n skipSimulation = false,\n ): Promise<TxReturnType<T, R>> {\n if (isSonicSpokeProvider(spokeProvider)) {\n return (await SonicSpokeService.callWallet(\n payload,\n spokeProvider as SonicSpokeProvider,\n raw,\n )) satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<T, R>;\n }\n\n if (!skipSimulation) {\n const result = await SpokeService.simulateRecvMessage(\n {\n target: from,\n srcChainId: getIntentRelayChainId(spokeProvider.chainConfig.chain.id),\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n await spokeProvider.walletProvider.getWalletAddress(),\n ),\n payload,\n },\n hubProvider,\n );\n if (!result.success) {\n throw new Error('Simulation failed', { cause: result });\n }\n }\n if (isEvmSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await EvmSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n EvmSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isInjectiveSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await InjectiveSpokeService.callWallet(\n from,\n payload,\n spokeProvider,\n hubProvider,\n raw,\n )) satisfies TxReturnType<InjectiveSpokeProvider, R> as TxReturnType<T, R>;\n }\n if (isIconSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await IconSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n IconSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isSuiSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await SuiSpokeService.callWallet(from, payload, spokeProvider, hubProvider, raw)) satisfies TxReturnType<\n SuiSpokeProvider,\n R\n > as TxReturnType<T, R>;\n }\n if (isSolanaSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await SolanaSpokeService.callWallet(\n from,\n payload,\n spokeProvider,\n hubProvider,\n raw,\n )) satisfies TxReturnType<SolanaSpokeProvider, R> as TxReturnType<T, R>;\n }\n if (isStellarSpokeProvider(spokeProvider)) {\n await SpokeService.verifySimulation(from, payload, spokeProvider, hubProvider, skipSimulation);\n return (await StellarSpokeService.callWallet(\n from,\n payload,\n spokeProvider,\n hubProvider,\n raw,\n )) satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<T, R>;\n }\n\n throw new Error('Invalid spoke provider');\n }\n\n public static async verifySimulation(\n from: HubAddress,\n payload: Hex,\n spokeProvider: SpokeProvider,\n hubProvider: EvmHubProvider,\n skipSimulation: boolean,\n ): Promise<void> {\n if (!skipSimulation) {\n const result = await SpokeService.simulateRecvMessage(\n {\n target: from,\n srcChainId: getIntentRelayChainId(spokeProvider.chainConfig.chain.id),\n srcAddress: encodeAddress(\n spokeProvider.chainConfig.chain.id,\n await spokeProvider.walletProvider.getWalletAddress(),\n ),\n payload,\n },\n hubProvider,\n );\n\n if (!result.success) {\n throw new Error('Simulation failed', { cause: result });\n }\n }\n }\n\n /**\n * Verifies the transaction hash for the spoke chain to exist on chain.\n * Only stellar and solana need to be verified. For other chains, we assume the transaction exists on chain.\n * @param txHash - The transaction hash to verify.\n * @param spokeProvider - The spoke provider.\n * @returns {Promise<Result<boolean>>} A promise that resolves to the result of the verification.\n */\n public static async verifyTxHash(txHash: string, spokeProvider: SpokeProvider): Promise<Result<boolean>> {\n if (isSolanaSpokeProvider(spokeProvider)) {\n return SolanaSpokeService.waitForConfirmation(spokeProvider, txHash);\n }\n if (isStellarSpokeProvider(spokeProvider)) {\n return StellarSpokeService.waitForTransaction(spokeProvider, txHash);\n }\n\n // only stellar and solana need to be verified\n return {\n ok: true,\n value: true,\n };\n }\n}\n","import { type HttpUrl, type SpokeChainId, getIntentRelayChainId } from '@sodax/types';\nimport type { Result } from '../../types.js';\nimport invariant from 'tiny-invariant';\nimport { retry } from '../../utils/shared-utils.js';\nimport type { IntentError } from '../../../swap/SwapService.js';\nimport { DEFAULT_RELAY_TX_TIMEOUT } from '../../constants.js';\nimport type { SpokeProvider } from '../../entities/Providers.js';\nimport type { Hex } from 'viem';\n\n/**\n * The action type for the intent relay service.\n * submit - submit a transaction to the intent relay service\n * get_transaction_packets - get transaction packets from the intent relay service\n * get_packet - get a packet from the intent relay service\n */\nexport type RelayAction = 'submit' | 'get_transaction_packets' | 'get_packet';\n\n/**\n * The status of the relay transaction.\n * pending - no signatures\n * validating - not enough signatures\n * executing - enough signatures,no confirmed txn-hash\n * executed - has confirmed transaction-hash\n */\nexport type RelayTxStatus = 'pending' | 'validating' | 'executing' | 'executed';\n\nexport type RelayErrorCode = 'SUBMIT_TX_FAILED' | 'RELAY_TIMEOUT';\n\nexport type RelayError = {\n code: RelayErrorCode;\n error: unknown;\n};\n\nexport type SubmitTxParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n data?: { address: Hex; payload: Hex };\n};\n\nexport type GetTransactionPacketsParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n};\n\nexport type GetPacketParams = {\n chain_id: string; // The ID of the chain where the transaction was submitted\n tx_hash: string; // The transaction hash of the submitted transaction\n conn_sn: string; // The connection sequence number of the submitted transaction\n};\n\nexport type SubmitTxResponse = {\n success: boolean;\n message: string;\n};\n\nexport type PacketData = {\n src_chain_id: number;\n src_tx_hash: string;\n src_address: string;\n status: RelayTxStatus;\n dst_chain_id: number;\n conn_sn: number;\n dst_address: string;\n dst_tx_hash: string;\n signatures: string[];\n payload: string;\n};\n\nexport type IntentDeliveryInfo = {\n srcChainId: SpokeChainId; // The chain ID where the transaction was submitted\n srcTxHash: string; // The transaction hash of the submitted transaction\n srcAddress: string; // The wallet address which submitted the transaction\n dstChainId: SpokeChainId; // The destination chain ID\n dstTxHash: string; // The transaction hash of the submitted transaction on the destination chain\n dstAddress: string; // The destination wallet address on the destination chain\n};\n\nexport type GetTransactionPacketsResponse = {\n success: boolean;\n data: PacketData[];\n};\n\nexport type GetPacketResponse =\n | {\n success: true;\n data: PacketData;\n }\n | {\n success: false;\n message: string;\n };\n\nexport type GetRelayRequestParamType<T extends RelayAction> = T extends 'submit'\n ? SubmitTxParams\n : T extends 'get_transaction_packets'\n ? GetTransactionPacketsParams\n : T extends 'get_packet'\n ? GetPacketParams\n : never;\n\nexport type GetRelayResponse<T extends RelayAction> = T extends 'submit'\n ? SubmitTxResponse\n : T extends 'get_transaction_packets'\n ? GetTransactionPacketsResponse\n : T extends 'get_packet'\n ? GetPacketResponse\n : never;\n\nexport type IntentRelayRequestParams = SubmitTxParams | GetTransactionPacketsParams | GetPacketParams;\n\nexport type WaitUntilIntentExecutedPayload = {\n intentRelayChainId: string;\n spokeTxHash: string;\n timeout: number;\n apiUrl: HttpUrl;\n};\n\n/**\n * Represents the request payload for submitting a transaction to the intent relay service.\n * Contains the action type and parameters including chain ID and transaction hash.\n */\nexport type IntentRelayRequest<T extends RelayAction> = {\n action: T;\n params: GetRelayRequestParamType<T>;\n};\n\nasync function postRequest<T extends RelayAction>(\n payload: IntentRelayRequest<T>,\n apiUrl: string,\n): Promise<GetRelayResponse<T>> {\n const response = await retry(() =>\n fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n }),\n );\n\n return response.json();\n}\n\n/**\n * Submits a transaction to the intent relay service.\n * @param payload - The request payload containing the 'submit' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function submitTransaction(\n payload: IntentRelayRequest<'submit'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'submit'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n\n return postRequest(payload, apiUrl);\n}\n\n/**\n * Retrieves transaction packets from the intent relay service.\n * @param payload - The request payload containing the 'get_transaction_packets' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function getTransactionPackets(\n payload: IntentRelayRequest<'get_transaction_packets'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'get_transaction_packets'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n\n return postRequest(payload, apiUrl);\n}\n\n/**\n * Retrieves a packet from the intent relay service.\n * @param payload - The request payload containing the 'get_packet' action type and parameters.\n * @param apiUrl - The URL of the intent relay service.\n * @returns The response from the intent relay service.\n */\nexport async function getPacket(\n payload: IntentRelayRequest<'get_packet'>,\n apiUrl: HttpUrl,\n): Promise<GetRelayResponse<'get_packet'>> {\n invariant(payload.params.chain_id.length > 0, 'Invalid input parameters. source_chain_id empty');\n invariant(payload.params.tx_hash.length > 0, 'Invalid input parameters. tx_hash empty');\n invariant(payload.params.conn_sn.length > 0, 'Invalid input parameters. conn_sn empty');\n\n return postRequest(payload, apiUrl);\n}\n\nexport async function waitUntilIntentExecuted(\n payload: WaitUntilIntentExecutedPayload,\n): Promise<Result<PacketData, IntentError<'RELAY_TIMEOUT'>>> {\n try {\n const startTime = Date.now();\n\n while (Date.now() - startTime < payload.timeout) {\n try {\n const txPackets = await getTransactionPackets(\n {\n action: 'get_transaction_packets',\n params: {\n chain_id: payload.intentRelayChainId,\n tx_hash: payload.spokeTxHash,\n },\n },\n payload.apiUrl,\n );\n\n if (txPackets.success && txPackets.data.length > 0) {\n const packet = txPackets.data.find(\n packet => packet.src_tx_hash.toLowerCase() === payload.spokeTxHash.toLowerCase(),\n );\n\n if (txPackets.success && txPackets.data.length > 0 && packet && packet.status === 'executed') {\n return {\n ok: true,\n value: packet,\n };\n }\n }\n } catch (e) {\n console.error('Error getting transaction packets', e);\n }\n // wait two seconds before retrying\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n\n return {\n ok: false,\n error: {\n code: 'RELAY_TIMEOUT',\n data: {\n payload: payload,\n error: {\n payload: payload,\n error: undefined,\n },\n },\n },\n };\n } catch (e) {\n return {\n ok: false,\n error: {\n code: 'RELAY_TIMEOUT',\n data: {\n payload: payload,\n error: e,\n },\n },\n };\n }\n}\n\n/**\n * Submit the transaction to the Solver API and wait for it to be executed\n * @param spokeTxHash - The transaction hash to submit.\n * @param data - The additional data to submit when relaying the transaction on Solana. Due to Solana's 1232 byte transaction\n * size limit, Solana transactions are split: the on-chain tx contains only a verification hash, while the full\n * data is submitted off-chain via the relayer. Contains the to address on Hub chain and instruction data.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 20 seconds.\n * @returns The transaction hash.\n */\nexport async function relayTxAndWaitPacket<S extends SpokeProvider>(\n spokeTxHash: string,\n data: { address: Hex; payload: Hex } | undefined,\n spokeProvider: S,\n relayerApiEndpoint: HttpUrl,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n): Promise<Result<PacketData, RelayError>> {\n try {\n const intentRelayChainId = getIntentRelayChainId(spokeProvider.chainConfig.chain.id).toString();\n\n const submitPayload: IntentRelayRequest<'submit'> = {\n action: 'submit',\n params: data\n ? {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n data,\n }\n : {\n chain_id: intentRelayChainId,\n tx_hash: spokeTxHash,\n },\n };\n\n const submitResult = await submitTransaction(submitPayload, relayerApiEndpoint);\n\n if (!submitResult.success) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n error: submitResult.message,\n },\n };\n }\n\n const packet = await waitUntilIntentExecuted({\n intentRelayChainId,\n spokeTxHash,\n timeout,\n apiUrl: relayerApiEndpoint,\n });\n\n if (!packet.ok) {\n return {\n ok: false,\n error: {\n code: 'RELAY_TIMEOUT',\n error: packet.error,\n },\n };\n }\n\n return {\n ok: true,\n value: packet.value,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'SUBMIT_TX_FAILED',\n error: error,\n },\n };\n }\n}\n","import type { TransactionReceipt } from 'viem';\nimport type { InjectiveSpokeProvider } from './entities/injective/InjectiveSpokeProvider.js';\nimport type {\n EvmSpokeProvider,\n ISpokeProvider,\n IconSpokeProvider,\n SolanaSpokeProvider,\n SonicSpokeProvider,\n SpokeProvider,\n StellarSpokeProvider,\n SuiSpokeProvider,\n} from './entities/index.js';\nimport type { bnUSDLegacySpokeChainIds, bnUSDLegacyTokens, newbnUSDSpokeChainIds } from '../index.js';\nimport type { EvmSpokeDepositParams, SonicSpokeDepositParams } from './services/index.js';\nimport type { IconSpokeDepositParams } from './services/spoke/IconSpokeService.js';\nimport type { SolanaSpokeDepositParams } from './services/spoke/SolanaSpokeService.js';\nimport type { StellarSpokeDepositParams } from './services/spoke/StellarSpokeService.js';\nimport type { SuiSpokeDepositParams } from './services/spoke/SuiSpokeService.js';\nimport type {\n SpokeChainId,\n Hex,\n Address,\n EvmRawTransaction,\n StellarRawTransaction,\n InjectiveRawTransaction,\n SolanaBase58PublicKey,\n ICON_MAINNET_CHAIN_ID,\n HttpUrl,\n IconAddress,\n MoneyMarketConfig,\n SolverConfig,\n spokeChainConfig,\n} from '@sodax/types';\nimport type { InjectiveSpokeDepositParams } from './services/spoke/InjectiveSpokeService.js';\n\nexport type LegacybnUSDChainId = (typeof bnUSDLegacySpokeChainIds)[number];\nexport type LegacybnUSDTokenAddress = (typeof bnUSDLegacyTokens)[number]['address'];\nexport type LegacybnUSDToken = (typeof bnUSDLegacyTokens)[number];\nexport type NewbnUSDChainId = (typeof newbnUSDSpokeChainIds)[number];\n\nexport type MoneyMarketServiceConfig = Prettify<MoneyMarketConfig & PartnerFeeConfig & RelayerApiConfig>;\nexport type SwapServiceConfig = Prettify<SolverConfig & PartnerFeeConfig & RelayerApiConfig>;\nexport type MigrationServiceConfig = Prettify<RelayerApiConfig>;\nexport type BridgeServiceConfig = Optional<PartnerFeeConfig, 'partnerFee'>;\nexport type BackendApiConfig = {\n baseURL?: HttpUrl;\n timeout?: number;\n headers?: Record<string, string>;\n};\n\nexport type MoneyMarketConfigParams =\n | Prettify<MoneyMarketConfig & Optional<PartnerFeeConfig, 'partnerFee'>>\n | Optional<PartnerFeeConfig, 'partnerFee'>;\n\nexport type Default = {\n default: boolean;\n};\n\nexport type RelayerApiConfig = {\n relayerApiEndpoint: HttpUrl;\n};\n\nexport type EvmContractCall = {\n address: Address; // Target address of the call\n value: bigint; // Ether value to send (in wei as a string for precision)\n data: Hex; // Calldata for the call\n};\n\nexport type EvmTransferToHubParams = {\n token: Address;\n recipient: Address;\n amount: bigint;\n data: Hex;\n};\n\nexport type EvmTransferParams = {\n fromToken: Address;\n dstChainId: SpokeChainId;\n toToken: Hex;\n to: Hex;\n amount: bigint;\n data: Hex;\n};\n\nexport type UnstakeSodaRequest = {\n amount: bigint;\n startTime: bigint;\n to: Address;\n};\n\nexport type UserUnstakeInfo = {\n id: bigint;\n request: UnstakeSodaRequest;\n};\n\nexport type VaultReserves = {\n tokens: readonly Address[];\n balances: readonly bigint[];\n};\n\nexport type DepositSimulationParams = {\n spokeChainID: SpokeChainId;\n token: Hex;\n from: Hex;\n to: Hex;\n amount: bigint;\n data: Hex;\n srcAddress: Hex;\n};\n\nexport type WalletSimulationParams = {\n target: Address;\n srcChainId: bigint;\n srcAddress: Hex;\n payload: Hex;\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property amount - Optional fixed fee amount in wei.\n */\nexport type PartnerFeeAmount = {\n address: Address;\n amount: bigint;\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property percentage - Optional fee percentage in basis points (e.g., 100 = 1%). Maximum allowed is 100 (1%).\n */\nexport type PartnerFeePercentage = {\n address: Address;\n percentage: number;\n};\n\n/**\n * Fee type for transaction fees.\n * @property address - The address to which the fee is sent.\n * @property percentage - Optional fee percentage in basis points (e.g., 100 = 1%). Maximum allowed is 100 (1%).\n * @property amount - Optional fixed fee amount in wei. If both percentage and amount are provided, amount will be used.\n */\nexport type PartnerFee = PartnerFeeAmount | PartnerFeePercentage;\n\nexport type PartnerFeeConfig = {\n partnerFee: PartnerFee | undefined;\n};\n\nexport type FeeAmount = {\n feeAmount: bigint;\n};\n\nexport type OptionalFee = { fee?: PartnerFee };\n\nexport type EvmTxReturnType<T extends boolean> = T extends true ? TransactionReceipt : Hex;\n\nexport type IconContractAddress = `cx${string}`;\nexport type IcxTokenType =\n | (typeof spokeChainConfig)[typeof ICON_MAINNET_CHAIN_ID]['addresses']['wICX']\n | (typeof spokeChainConfig)[typeof ICON_MAINNET_CHAIN_ID]['nativeToken'];\nexport type Result<T, E = Error | unknown> = { ok: true; value: T } | { ok: false; error: E };\n\nexport type SpokeDepositParams = EvmSpokeDepositParams | InjectiveSpokeDepositParams | IconSpokeDepositParams;\n\nexport type GetSpokeDepositParamsType<T extends SpokeProvider> = T extends EvmSpokeProvider\n ? EvmSpokeDepositParams\n : T extends InjectiveSpokeProvider\n ? InjectiveSpokeDepositParams\n : T extends SuiSpokeProvider\n ? SuiSpokeDepositParams\n : T extends IconSpokeProvider\n ? IconSpokeDepositParams\n : T extends StellarSpokeProvider\n ? StellarSpokeDepositParams\n : T extends SolanaSpokeProvider\n ? SolanaSpokeDepositParams\n : T extends SonicSpokeProvider\n ? SonicSpokeDepositParams\n : never;\n\nexport type GetAddressType<T extends SpokeProvider> = T extends EvmSpokeProvider\n ? Address\n : T extends InjectiveSpokeProvider\n ? string\n : T extends StellarSpokeProvider\n ? Hex\n : T extends IconSpokeProvider\n ? IconAddress\n : T extends SuiSpokeProvider\n ? Hex\n : T extends SolanaSpokeProvider\n ? Hex\n : T extends SonicSpokeProvider\n ? Address\n : never;\n\nexport type SolverConfigParams =\n | Prettify<SolverConfig & Optional<PartnerFeeConfig, 'partnerFee'>>\n | Optional<PartnerFeeConfig, 'partnerFee'>;\n\nexport type QuoteType = 'exact_input' | 'exact_output';\n\nexport type SolverIntentQuoteRequest = {\n token_src: string; // Token address on the source chain\n token_src_blockchain_id: SpokeChainId; // Source chain id\n token_dst: string; // Token address on the destination chain\n token_dst_blockchain_id: SpokeChainId; // Destination chain id\n amount: bigint; // Amount to swap\n quote_type: QuoteType; // Quote type\n};\n\nexport type SolverIntentQuoteResponseRaw = {\n quoted_amount: string;\n};\n\nexport type SolverIntentQuoteResponse = {\n quoted_amount: bigint;\n};\n\nexport type SolverErrorResponse = {\n detail: {\n code: SolverIntentErrorCode;\n message: string;\n };\n};\n\nexport type SolverExecutionRequest = {\n intent_tx_hash: Hex; // Intent hash of the execution on Sonic (hub chain)\n};\n\nexport type SolverExecutionResponse = {\n answer: 'OK';\n intent_hash: Hex; // Here, the solver returns the intent_hash, might be helpful for front-end\n};\n\nexport type SolverIntentStatusRequest = {\n intent_tx_hash: Hex;\n};\n\nexport type SolverIntentStatusResponse = {\n status: SolverIntentStatusCode;\n fill_tx_hash?: string; // defined only if status is 3\n};\n\nexport enum SolverIntentStatusCode {\n NOT_FOUND = -1,\n NOT_STARTED_YET = 1, // It's in the task pool, but not started yet\n STARTED_NOT_FINISHED = 2,\n SOLVED = 3,\n FAILED = 4,\n}\n\nexport enum SolverIntentErrorCode {\n NO_PATH_FOUND = -4, // No path to swap Token X to Token Y\n NO_PRIVATE_LIQUIDITY = -5, // Path found, but we have no private liquidity on the dest chain\n NOT_ENOUGH_PRIVATE_LIQUIDITY = -8, // Path found, but not enough private liquidity on the dst chain\n NO_EXECUTION_MODULE_FOUND = -7, // Path found, private liquidity, but execution modules unavailable\n QUOTE_NOT_FOUND = -8, // When executing, given quote_uuid does not exist\n QUOTE_NOT_MATCH = -9, // When executing, given quote_uuid does not match the quote\n INTENT_DATA_NOT_MATCH_QUOTE = -10,\n NO_GAS_HANDLER_FOR_BLOCKCHAIN = -11,\n INTENT_NOT_FOUND = -12,\n QUOTE_EXPIRED = -13,\n MAX_INPUT_AMOUNT = -14,\n MAX_DIFF_OUTPUT = -15,\n STOPPED = -16,\n NO_ORACLE_MODULE_FOUND = -17,\n NEGATIVE_INPUT_AMOUNT = -18,\n INTENT_ALREADY_IN_ORDERBOOK = -19,\n CREATE_INTENT_ORDER_FAILED = -998,\n UNKNOWN = -999,\n}\n\ntype Base64String = string;\n\nexport type SolanaRawTransaction = {\n from: SolanaBase58PublicKey;\n to: SolanaBase58PublicKey;\n value: bigint;\n data: Base64String;\n};\n\nexport type IconRawTransaction = {\n [key: string]: string | object;\n};\n\nexport type IcxRawTransaction = {\n to: string;\n from: string;\n value: Hex;\n stepLimit: Hex;\n nid: Hex;\n nonce: Hex;\n version: Hex;\n timestamp: Hex;\n data: Hex;\n};\n\nexport type SuiRawTransaction = {\n from: Hex;\n to: string;\n value: bigint;\n data: Base64String;\n};\n\nexport type EvmReturnType<Raw extends boolean> = Raw extends true ? EvmRawTransaction : Hex;\nexport type SolanaReturnType<Raw extends boolean> = Raw extends true ? SolanaRawTransaction : Hex;\nexport type StellarReturnType<Raw extends boolean> = Raw extends true ? StellarRawTransaction : string;\nexport type IconReturnType<Raw extends boolean> = Raw extends true ? IconRawTransaction : Hex;\nexport type SuiReturnType<Raw extends boolean> = Raw extends true ? SuiRawTransaction : Hex;\nexport type InjectiveReturnType<Raw extends boolean> = Raw extends true ? InjectiveRawTransaction : Hex;\n\nexport type HashTxReturnType =\n | EvmReturnType<false>\n | SolanaReturnType<false>\n | IconReturnType<false>\n | SuiReturnType<false>\n | InjectiveReturnType<false>\n | StellarReturnType<false>;\n\nexport type RawTxReturnType =\n | EvmRawTransaction\n | SolanaRawTransaction\n | InjectiveRawTransaction\n | IconRawTransaction\n | SuiRawTransaction\n | StellarRawTransaction;\n\nexport type TxReturnType<T extends SpokeProvider, Raw extends boolean> = T['chainConfig']['chain']['type'] extends 'EVM'\n ? EvmReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SOLANA'\n ? SolanaReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'STELLAR'\n ? StellarReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'ICON'\n ? IconReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SUI'\n ? SuiReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'INJECTIVE'\n ? InjectiveReturnType<Raw>\n : Raw extends true\n ? RawTxReturnType\n : HashTxReturnType;\n\nexport type PromiseEvmTxReturnType<Raw extends boolean> = Promise<TxReturnType<EvmSpokeProvider, Raw>>;\nexport type PromiseSolanaTxReturnType<Raw extends boolean> = Promise<TxReturnType<SolanaSpokeProvider, Raw>>;\nexport type PromiseStellarTxReturnType<Raw extends boolean> = Promise<TxReturnType<StellarSpokeProvider, Raw>>;\nexport type PromiseIconTxReturnType<Raw extends boolean> = Promise<TxReturnType<IconSpokeProvider, Raw>>;\nexport type PromiseSuiTxReturnType<Raw extends boolean> = Promise<TxReturnType<SuiSpokeProvider, Raw>>;\nexport type PromiseInjectiveTxReturnType<Raw extends boolean> = Promise<TxReturnType<InjectiveSpokeProvider, Raw>>;\n\nexport type PromiseTxReturnType<\n T extends ISpokeProvider,\n Raw extends boolean,\n> = T['chainConfig']['chain']['type'] extends 'EVM'\n ? PromiseEvmTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SOLANA'\n ? PromiseSolanaTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'STELLAR'\n ? PromiseStellarTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'ICON'\n ? PromiseIconTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'SUI'\n ? PromiseSuiTxReturnType<Raw>\n : T['chainConfig']['chain']['type'] extends 'INJECTIVE'\n ? PromiseInjectiveTxReturnType<Raw>\n : never;\n\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type Optional<T, K extends keyof T = keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype ExtractKeys<T> = T extends unknown ? keyof T : never;\n\nexport type SpokeTokenSymbols = ExtractKeys<(typeof spokeChainConfig)[SpokeChainId]['supportedTokens']>;\n\nexport type SpokeTxHash = string;\nexport type HubTxHash = string;\n\nexport type SolanaGasEstimate = number | undefined;\nexport type EvmGasEstimate = bigint;\nexport type StellarGasEstimate = bigint;\nexport type IconGasEstimate = bigint;\n\nexport type SuiGasEstimate = {\n computationCost: string;\n nonRefundableStorageFee: string;\n storageCost: string;\n storageRebate: string;\n};\n\nexport type InjectiveGasEstimate = {\n gasWanted: number;\n gasUsed: number;\n};\n\nexport type GasEstimateType =\n | EvmGasEstimate\n | SolanaGasEstimate\n | StellarGasEstimate\n | IconGasEstimate\n | SuiGasEstimate\n | InjectiveGasEstimate;\n\nexport type GetEstimateGasReturnType<T extends SpokeProvider> = T['chainConfig']['chain']['type'] extends 'EVM'\n ? EvmGasEstimate\n : T['chainConfig']['chain']['type'] extends 'SOLANA'\n ? SolanaGasEstimate\n : T['chainConfig']['chain']['type'] extends 'STELLAR'\n ? StellarGasEstimate\n : T['chainConfig']['chain']['type'] extends 'ICON'\n ? IconGasEstimate\n : T['chainConfig']['chain']['type'] extends 'SUI'\n ? SuiGasEstimate\n : T['chainConfig']['chain']['type'] extends 'INJECTIVE'\n ? InjectiveGasEstimate\n : GasEstimateType; // default to all gas estimate types union type\n\nexport type OptionalRaw<R extends boolean = false> = { raw?: R };\nexport type OptionalTimeout = { timeout?: number };\nexport type RelayExtraData = { address: Hex; payload: Hex };\nexport type RelayOptionalExtraData = { data?: RelayExtraData };\n","// packages/sdk/src/services/BackendApiService.ts\n/**\n * BackendApiService - Proxy service for Sodax Backend API\n * Acts as a wrapper around all backend API endpoints for Solver and Money Market functionality\n */\n\nimport type {\n GetAllConfigApiResponse,\n GetChainsApiResponse,\n GetHubAssetsApiResponse,\n GetHubAssetsByChainIdApiResponse,\n GetHubVaultsApiResponse,\n GetMoneyMarketReserveAssetsApiResponse,\n GetMoneyMarketTokensApiResponse,\n GetMoneyMarketTokensByChainIdApiResponse,\n GetRelayChainIdMapApiResponse,\n GetSpokeChainConfigApiResponse,\n GetSwapTokensApiResponse,\n GetSwapTokensByChainIdApiResponse,\n IConfigApi,\n SpokeChainId,\n} from '@sodax/types';\nimport {\n DEFAULT_BACKEND_API_ENDPOINT,\n DEFAULT_BACKEND_API_HEADERS,\n DEFAULT_BACKEND_API_TIMEOUT,\n} from '../shared/constants.js';\nimport type { BackendApiConfig } from '../shared/types.js';\n\n// Base types for API responses\nexport interface ApiResponse<T = unknown> {\n data: T;\n status: number;\n message?: string;\n}\n\n// HTTP request configuration\nexport interface RequestConfig {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n}\n\n// Intent endpoints types\nexport interface IntentResponse {\n intentHash: string;\n txHash: string;\n logIndex: number;\n chainId: number;\n blockNumber: number;\n open: boolean;\n intent: {\n intentId: string;\n creator: string;\n inputToken: string;\n outputToken: string;\n inputAmount: string;\n minOutputAmount: string;\n deadline: string;\n allowPartialFill: boolean;\n srcChain: number;\n dstChain: number;\n srcAddress: string;\n dstAddress: string;\n solver: string;\n data: string;\n };\n events: unknown[];\n}\n\n// Solver endpoints types\nexport interface OrderbookResponse {\n total: number;\n data: Array<{\n intentState: {\n exists: boolean;\n remainingInput: string;\n receivedOutput: string;\n pendingPayment: boolean;\n };\n intentData: {\n intentId: string;\n creator: string;\n inputToken: string;\n outputToken: string;\n inputAmount: string;\n minOutputAmount: string;\n deadline: string;\n allowPartialFill: boolean;\n srcChain: number;\n dstChain: number;\n srcAddress: string;\n dstAddress: string;\n solver: string;\n data: string;\n intentHash: string;\n txHash: string;\n blockNumber: number;\n };\n }>;\n}\n\n// Money Market endpoints types\nexport interface MoneyMarketPosition {\n userAddress: string;\n positions: Array<{\n reserveAddress: string;\n aTokenAddress: string;\n variableDebtTokenAddress: string;\n aTokenBalance: string;\n variableDebtTokenBalance: string;\n blockNumber: number;\n }>;\n}\n\nexport interface MoneyMarketAsset {\n reserveAddress: string;\n aTokenAddress: string;\n totalATokenBalance: string;\n variableDebtTokenAddress: string;\n totalVariableDebtTokenBalance: string;\n liquidityRate: string;\n symbol: string;\n totalSuppliers: number;\n totalBorrowers: number;\n variableBorrowRate: string;\n stableBorrowRate: string;\n liquidityIndex: string;\n variableBorrowIndex: string;\n blockNumber: number;\n}\n\nexport interface MoneyMarketAssetBorrowers {\n borrowers: string[];\n total: number;\n offset: number;\n limit: number;\n}\n\nexport interface MoneyMarketAssetSuppliers {\n suppliers: string[];\n total: number;\n offset: number;\n limit: number;\n}\n\nexport interface MoneyMarketBorrowers {\n borrowers: string[];\n total: number;\n offset: number;\n limit: number;\n}\n\n/**\n * BackendApiService class that acts as a proxy to the Sodax Backend API\n * Provides methods for all Solver and Money Market endpoints\n */\nexport class BackendApiService implements IConfigApi {\n private readonly baseURL: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(config?: BackendApiConfig) {\n this.baseURL = config?.baseURL ?? DEFAULT_BACKEND_API_ENDPOINT;\n this.timeout = config?.timeout ?? DEFAULT_BACKEND_API_TIMEOUT;\n this.defaultHeaders = config?.headers ?? DEFAULT_BACKEND_API_HEADERS;\n }\n\n /**\n * Make HTTP request using fetch API\n * @param endpoint - API endpoint path\n * @param config - Request configuration\n * @returns Promise<T>\n */\n private async makeRequest<T>(endpoint: string, config: RequestConfig): Promise<T> {\n const url = `${this.baseURL}${endpoint}`;\n const headers = { ...this.defaultHeaders, ...config.headers };\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: config.method,\n headers,\n body: config.body,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.timeout}ms`);\n }\n console.error('[BackendApiService] Request error:', error.message);\n throw error;\n }\n\n console.error('[BackendApiService] Unknown error:', error);\n throw new Error('Unknown error occurred');\n }\n }\n\n // Intent endpoints\n /**\n * Get intent details by transaction hash\n * @param txHash - Transaction hash\n * @returns Promise<IntentResponse>\n */\n public async getIntentByTxHash(txHash: string): Promise<IntentResponse> {\n return this.makeRequest<IntentResponse>(`/intent/tx/${txHash}`, { method: 'GET' });\n }\n\n /**\n * Get intent details by intent hash\n * @param intentHash - Intent hash\n * @returns Promise<IntentResponse>\n */\n public async getIntentByHash(intentHash: string): Promise<IntentResponse> {\n return this.makeRequest<IntentResponse>(`/intent/${intentHash}`, { method: 'GET' });\n }\n\n // Solver endpoints\n /**\n * Get the solver orderbook\n * @param params - Object containing offset and limit parameters for pagination\n * @returns Promise<OrderbookResponse>\n */\n public async getOrderbook(params: { offset: string; limit: string }): Promise<OrderbookResponse> {\n const queryParams = new URLSearchParams();\n queryParams.append('offset', params.offset);\n queryParams.append('limit', params.limit);\n\n const queryString = queryParams.toString();\n const endpoint = `/solver/orderbook?${queryString}`;\n\n return this.makeRequest<OrderbookResponse>(endpoint, { method: 'GET' });\n }\n\n // Money Market endpoints\n /**\n * Get money market position for a specific user\n * @param userAddress - User's wallet address\n * @returns Promise<MoneyMarketPosition>\n */\n public async getMoneyMarketPosition(userAddress: string): Promise<MoneyMarketPosition> {\n return this.makeRequest<MoneyMarketPosition>(`/moneymarket/position/${userAddress}`, { method: 'GET' });\n }\n\n /**\n * Get all money market assets\n * @returns Promise<MoneyMarketAsset[]>\n */\n public async getAllMoneyMarketAssets(): Promise<MoneyMarketAsset[]> {\n return this.makeRequest<MoneyMarketAsset[]>('/moneymarket/asset/all', { method: 'GET' });\n }\n\n /**\n * Get specific money market asset details\n * @param reserveAddress - Reserve contract address\n * @returns Promise<MoneyMarketAsset>\n */\n public async getMoneyMarketAsset(reserveAddress: string): Promise<MoneyMarketAsset> {\n return this.makeRequest<MoneyMarketAsset>(`/moneymarket/asset/${reserveAddress}`, { method: 'GET' });\n }\n\n /**\n * Get borrowers for a specific money market asset\n * @param reserveAddress - Reserve contract address\n * @param params - Object containing offset and limit parameters for pagination\n * @returns Promise<MoneyMarketAssetBorrowers>\n */\n public async getMoneyMarketAssetBorrowers(\n reserveAddress: string,\n params: { offset: string; limit: string },\n ): Promise<MoneyMarketAssetBorrowers> {\n const queryParams = new URLSearchParams();\n queryParams.append('offset', params.offset);\n queryParams.append('limit', params.limit);\n\n const queryString = queryParams.toString();\n const endpoint = `/moneymarket/asset/${reserveAddress}/borrowers?${queryString}`;\n\n return this.makeRequest<MoneyMarketAssetBorrowers>(endpoint, { method: 'GET' });\n }\n\n /**\n * Get suppliers for a specific money market asset\n * @param reserveAddress - Reserve contract address\n * @param params - Object containing offset and limit parameters for pagination\n * @returns Promise<MoneyMarketAssetSuppliers>\n */\n public async getMoneyMarketAssetSuppliers(\n reserveAddress: string,\n params: { offset: string; limit: string },\n ): Promise<MoneyMarketAssetSuppliers> {\n const queryParams = new URLSearchParams();\n queryParams.append('offset', params.offset);\n queryParams.append('limit', params.limit);\n\n const queryString = queryParams.toString();\n const endpoint = `/moneymarket/asset/${reserveAddress}/suppliers?${queryString}`;\n\n return this.makeRequest<MoneyMarketAssetSuppliers>(endpoint, { method: 'GET' });\n }\n\n /**\n * Get all money market borrowers\n * @param params - Object containing offset and limit parameters for pagination\n * @returns Promise<MoneyMarketBorrowers>\n */\n public async getAllMoneyMarketBorrowers(params: { offset: string; limit: string }): Promise<MoneyMarketBorrowers> {\n const queryParams = new URLSearchParams();\n queryParams.append('offset', params.offset);\n queryParams.append('limit', params.limit);\n\n const queryString = queryParams.toString();\n const endpoint = `/moneymarket/borrowers?${queryString}`;\n\n return this.makeRequest<MoneyMarketBorrowers>(endpoint, { method: 'GET' });\n }\n\n /**\n * Get all supported config\n * @returns Promise<GetAllConfigApiResponse>\n */\n public async getAllConfig(): Promise<GetAllConfigApiResponse> {\n return this.makeRequest<GetAllConfigApiResponse>('/config/all', { method: 'GET' });\n }\n\n /**\n * Get all supported spoke chains\n * @returns Promise<GetChainsApiResponse>\n */\n public async getChains(): Promise<GetChainsApiResponse> {\n return this.makeRequest<GetChainsApiResponse>('/config/spoke/chains', { method: 'GET' });\n }\n\n /**\n * Get all supported swap tokens\n * @returns Promise<GetSwapTokensApiResponse>\n */\n public async getSwapTokens(): Promise<GetSwapTokensApiResponse> {\n return this.makeRequest<GetSwapTokensApiResponse>('/config/swap/tokens', { method: 'GET' });\n }\n\n /**\n * Get supported swap tokens for a specific spoke chain\n * @param chainId - Spoke chain id\n * @returns Promise<GetSwapTokensByChainIdApiResponse>\n */\n public async getSwapTokensByChainId(chainId: SpokeChainId): Promise<GetSwapTokensByChainIdApiResponse> {\n return this.makeRequest<GetSwapTokensByChainIdApiResponse>(`/config/swap/${chainId}/tokens`, { method: 'GET' });\n }\n\n /**\n * Get all supported money market tokens\n * @returns Promise<GetMoneyMarketTokensApiResponse>\n */\n public async getMoneyMarketTokens(): Promise<GetMoneyMarketTokensApiResponse> {\n return this.makeRequest<GetMoneyMarketTokensApiResponse>('/config/money-market/tokens', { method: 'GET' });\n }\n\n /**\n * Get all supported money market tokens\n * @returns Promise<GetMoneyMarketTokensApiResponse>\n */\n public async getMoneyMarketReserveAssets(): Promise<GetMoneyMarketReserveAssetsApiResponse> {\n return this.makeRequest<GetMoneyMarketReserveAssetsApiResponse>('/config/money-market/reserve-assets', {\n method: 'GET',\n });\n }\n\n /**\n * Get supported money market tokens for a specific spoke chain\n * @param chainId - Spoke chain id\n * @returns Promise<GetMoneyMarketTokensByChainIdApiResponse>\n */\n public async getMoneyMarketTokensByChainId(chainId: SpokeChainId): Promise<GetMoneyMarketTokensByChainIdApiResponse> {\n return this.makeRequest<GetMoneyMarketTokensByChainIdApiResponse>(`/config/money-market/${chainId}/tokens`, {\n method: 'GET',\n });\n }\n\n /**\n * Get all supported hub assets (assets representing spoke token deposit)\n * @returns Promise<GetHubAssetsApiResponse>\n */\n public async getHubAssets(): Promise<GetHubAssetsApiResponse> {\n return this.makeRequest<GetHubAssetsApiResponse>('/config/hub/assets', { method: 'GET' });\n }\n\n /**\n * Get all supported Soda hub vaults\n * @returns Promise<GetHubVaultsApiResponse>\n */\n public async getHubVaults(): Promise<GetHubVaultsApiResponse> {\n return this.makeRequest<GetHubVaultsApiResponse>('/config/hub/vaults', { method: 'GET' });\n }\n\n /**\n * Get supported hub assets (assets representing spoke token deposit) for a specific spoke chain\n * @param chainId - Spoke chain id\n * @returns Promise<GetHubAssetsByChainIdApiResponse>\n */\n public async getHubAssetsByChainId(chainId: SpokeChainId): Promise<GetHubAssetsByChainIdApiResponse> {\n return this.makeRequest<GetHubAssetsByChainIdApiResponse>(`/config/hub/${chainId}/assets`, { method: 'GET' });\n }\n\n /**\n * Get the intent relay chain id map\n * @returns Promise<GetRelayChainIdMapApiResponse>\n */\n public async getRelayChainIdMap(): Promise<GetRelayChainIdMapApiResponse> {\n return this.makeRequest<GetRelayChainIdMapApiResponse>('/config/relay/chain-id-map', { method: 'GET' });\n }\n\n /**\n * Get the spoke chain config\n * @returns Promise<GetSpokeChainConfigApiResponse>\n */\n public async getSpokeChainConfig(): Promise<GetSpokeChainConfigApiResponse> {\n return this.makeRequest<GetSpokeChainConfigApiResponse>('/config/spoke/all-chains-configs', { method: 'GET' });\n }\n\n /**\n * Set custom headers for API requests\n * @param headers - Object containing header key-value pairs\n */\n public setHeaders(headers: Record<string, string>): void {\n Object.entries(headers).forEach(([key, value]) => {\n this.defaultHeaders[key] = value;\n });\n }\n\n /**\n * Get the current base URL\n * @returns string\n */\n public getBaseURL(): string {\n return this.baseURL;\n }\n}\n","import invariant from 'tiny-invariant';\nimport {\n type SpokeProvider,\n type Result,\n type TxReturnType,\n SpokeService,\n type RelayErrorCode,\n Erc20Service,\n type GetSpokeDepositParamsType,\n SonicSpokeService,\n SonicSpokeProvider,\n EvmSpokeProvider,\n type EvmHubProvider,\n relayTxAndWaitPacket,\n SolanaSpokeProvider,\n DEFAULT_RELAY_TX_TIMEOUT,\n type HubTxHash,\n type SpokeTxHash,\n WalletAbstractionService,\n type HubAssetInfo,\n type EvmContractCall,\n EvmVaultTokenService,\n EvmAssetManagerService,\n encodeContractCalls,\n calculateFeeAmount,\n type PartnerFee,\n encodeAddress,\n type Prettify,\n type OptionalFee,\n type OptionalRaw,\n type OptionalTimeout,\n type GetAddressType,\n type BridgeServiceConfig,\n StellarSpokeProvider,\n wrappedSonicAbi,\n} from '../index.js';\nimport type { SpokeChainId, XToken, Hex, HttpUrl } from '@sodax/types';\nimport { encodeFunctionData, isAddress } from 'viem';\nimport { StellarSpokeService } from '../shared/services/spoke/StellarSpokeService.js';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\n\nexport type CreateBridgeIntentParams = {\n srcChainId: SpokeChainId;\n srcAsset: string;\n amount: bigint;\n dstChainId: SpokeChainId;\n dstAsset: string;\n recipient: string; // non-encoded recipient address\n};\n\nexport type BridgeParams<S extends SpokeProvider> = Prettify<\n {\n params: CreateBridgeIntentParams;\n spokeProvider: S;\n skipSimulation?: boolean;\n } & OptionalFee\n>;\n\nexport type BridgeErrorCode =\n | 'ALLOWANCE_CHECK_FAILED'\n | 'APPROVAL_FAILED'\n | 'CREATE_BRIDGE_INTENT_FAILED'\n | 'BRIDGE_FAILED'\n | RelayErrorCode;\n\nexport type BridgeError<T extends BridgeErrorCode> = {\n code: T;\n error: unknown;\n};\n\nexport type BridgeExtraData = { address: Hex; payload: Hex };\nexport type BridgeOptionalExtraData = { data?: BridgeExtraData };\n\nexport type BridgeServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n relayerApiEndpoint: HttpUrl;\n config: BridgeServiceConfig | undefined;\n configService: ConfigService;\n};\n\n/**\n * BridgeService is a service that allows you to bridge tokens between chains\n * Birdge action can be between to spokes chains but can also be used to withdraw and deposit into soda tokens on the HUB.\n * By using soda tokens as src or destinatin address.\n * @param hubProvider - The hub provider\n * @param relayerApiEndpoint - The relayer API endpoint\n */\nexport class BridgeService {\n public readonly hubProvider: EvmHubProvider;\n public readonly relayerApiEndpoint: HttpUrl;\n public readonly config: BridgeServiceConfig;\n public readonly configService: ConfigService;\n\n constructor({ hubProvider, relayerApiEndpoint, config, configService }: BridgeServiceConstructorParams) {\n this.config = config ?? { partnerFee: undefined };\n this.hubProvider = hubProvider;\n this.relayerApiEndpoint = relayerApiEndpoint;\n this.configService = configService;\n }\n\n /**\n * Get the fee for a given input amount\n * @param {bigint} inputAmount - The amount of input tokens\n * @returns {Promise<bigint>} The fee amount (denominated in input tokens)\n *\n * @example\n * const fee: bigint = await sodax.bridge.getFee(1000000000000000n);\n * console.log('Fee:', fee);\n */\n public getFee(inputAmount: bigint): bigint {\n if (!this.config.partnerFee) {\n return 0n;\n }\n\n return calculateFeeAmount(inputAmount, this.config.partnerFee);\n }\n\n /**\n * Check if allowance is valid for the bridge transaction\n * @param params - The bridge parameters\n * @param spokeProvider - The spoke provider\n * @returns {Promise<Result<boolean, BridgeError<'ALLOWANCE_CHECK_FAILED'>>>}\n */\n public async isAllowanceValid<S extends SpokeProvider>({\n params,\n spokeProvider,\n }: BridgeParams<S>): Promise<Result<boolean, BridgeError<'ALLOWANCE_CHECK_FAILED'>>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.srcAsset.length > 0, 'Source asset is required');\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n // For regular EVM chains (non-Sonic), check ERC20 allowance against assetManager\n if (spokeProvider instanceof EvmSpokeProvider) {\n invariant(isAddress(params.srcAsset), 'Invalid source asset address for EVM chain');\n\n const allowanceResult = await Erc20Service.isAllowanceValid(\n params.srcAsset,\n params.amount,\n walletAddress as GetAddressType<EvmSpokeProvider>,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n );\n\n if (!allowanceResult.ok) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: allowanceResult.error,\n },\n };\n }\n\n return {\n ok: true,\n value: allowanceResult.value,\n };\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n const allowanceResult = await StellarSpokeService.hasSufficientTrustline(\n params.srcAsset,\n params.amount,\n spokeProvider,\n );\n if (!allowanceResult) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: allowanceResult,\n },\n };\n }\n return {\n ok: true,\n value: allowanceResult,\n };\n }\n\n // For Sonic chain, check ERC20 allowance against userRouter\n if (spokeProvider instanceof SonicSpokeProvider) {\n invariant(isAddress(params.srcAsset), 'Invalid source asset address for Sonic chain');\n\n const userRouter = await SonicSpokeService.getUserRouter(walletAddress as `0x${string}`, spokeProvider);\n\n const allowanceResult = await Erc20Service.isAllowanceValid(\n params.srcAsset,\n params.amount,\n walletAddress as GetAddressType<SonicSpokeProvider>,\n userRouter,\n spokeProvider,\n );\n\n if (!allowanceResult.ok) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: allowanceResult.error,\n },\n };\n }\n\n return {\n ok: true,\n value: allowanceResult.value,\n };\n }\n\n // For non-EVM chains (Icon, Sui, Stellar, etc.), no allowance check needed\n return {\n ok: true,\n value: true,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Approve token spending for the bridge transaction\n * @param params - The bridge parameters\n * @param spokeProvider - The spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns Promise<Result<TxReturnType<S, R>, BridgeError<'APPROVAL_FAILED'>>>\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<BridgeParams<S> & OptionalRaw<R>>): Promise<Result<TxReturnType<S, R>, BridgeError<'APPROVAL_FAILED'>>> {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.srcAsset.length > 0, 'Source asset is required');\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n // For regular EVM chains (non-Sonic), approve against assetManager\n if (spokeProvider instanceof EvmSpokeProvider) {\n invariant(isAddress(params.srcAsset), 'Invalid source asset address for EVM chain');\n\n const result = await Erc20Service.approve(\n params.srcAsset,\n params.amount,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n const result = await StellarSpokeService.requestTrustline(params.srcAsset, params.amount, spokeProvider, raw);\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n // For Sonic chain, approve against userRouter\n if (spokeProvider instanceof SonicSpokeProvider) {\n invariant(isAddress(params.srcAsset), 'Invalid source asset address for Sonic chain');\n\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n const result = await Erc20Service.approve(params.srcAsset, params.amount, userRouter, spokeProvider, raw);\n\n return {\n ok: true,\n value: result as TxReturnType<S, R>,\n };\n }\n\n // For non-EVM chains, approval is not needed\n return {\n ok: false,\n error: {\n code: 'APPROVAL_FAILED',\n error: new Error('Approval only supported for EVM spoke chains'),\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'APPROVAL_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Execute a bridge transaction to transfer tokens from one chain to another\n * @param params - The bridge parameters including source/destination chains, assets, and recipient\n * @param spokeProvider - The spoke provider for the source chain\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[SpokeTxHash, HubTxHash], BridgeError<BridgeErrorCode>>>} - Returns the transaction hashes for both spoke and hub chains or error\n *\n * @example\n * const result = await sodax.bridge.bridge(\n * {\n * srcChainId: '0x2105.base',\n * srcAsset: '0x...', // Address of the source token\n * amount: 1000n, // Amount to bridge (in token decimals)\n * dstChainId: '0x89.polygon',\n * dstAsset: '0x...', // Address of the destination token\n * recipient: '0x...', // Recipient address on destination chain\n * partnerFee: { address: '0x...', percentage: 0.1 } // Optional partner fee. Partner fees and denominated in vault token decimals (18)\n * },\n * spokeProvider,\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the source chain\n * hubTxHash, // transaction hash on the hub chain\n * ] = result.value;\n * console.log('Bridge transaction hashes:', { spokeTxHash, hubTxHash });\n */\n public async bridge<S extends SpokeProvider>({\n params,\n spokeProvider,\n fee = this.config.partnerFee,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n }: Prettify<BridgeParams<S> & OptionalTimeout>): Promise<\n Result<[SpokeTxHash, HubTxHash], BridgeError<BridgeErrorCode>>\n > {\n try {\n const txResult = await this.createBridgeIntent({ params, spokeProvider, fee, raw: false });\n\n if (!txResult.ok) {\n return txResult;\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_BRIDGE_INTENT_FAILED',\n error: verifyTxHashResult.error,\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider ? txResult.data : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'BRIDGE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Create bridge intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the bridge intent\n * In order to successfully bridge tokens, you need to:\n * 1. Check if the allowance is sufficient using isAllowanceValid\n * 2. Approve the appropriate contract to spend the tokens using approve\n * 3. Create the bridge intent using this method\n * 4. Relay the transaction to the hub and await completion using the bridge method\n *\n * @param params - The bridge parameters including source/destination chains, assets, and recipient\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data\n * @returns {Promise<Result<TxReturnType<S, R>, BridgeError<BridgeErrorCode>>>} - Returns the transaction result\n *\n * @example\n * const bridgeService = new BridgeService(hubProvider, relayerApiEndpoint);\n * const result = await sodax.bridge.createBridgeIntent(\n * {\n * srcChainId: 'ethereum',\n * srcAsset: \"0x123...\", // source token address\n * amount: 1000000000000000000n, // 1 token in wei\n * dstChainId: 'polygon',\n * dstAsset: \"0x456...\", // destination token address\n * recipient: \"0x789...\" // recipient address\n * },\n * spokeProvider,\n * raw // Optional: true = return the raw transaction data, false = execute and return the transaction hash (default: false)\n * );\n *\n * if (result.ok) {\n * const txHash = result.value;\n * console.log('Bridge intent transaction hash:', txHash);\n * } else {\n * console.error('Bridge intent creation failed:', result.error);\n * }\n */\n async createBridgeIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n fee = this.config.partnerFee,\n raw,\n }: Prettify<BridgeParams<S> & OptionalRaw<R>>): Promise<\n Result<TxReturnType<S, R>, BridgeError<'CREATE_BRIDGE_INTENT_FAILED'>> & BridgeOptionalExtraData\n > {\n try {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n const srcAssetInfo = this.configService.getHubAssetInfo(params.srcChainId, params.srcAsset);\n const dstAssetInfo = this.configService.getHubAssetInfo(params.dstChainId, params.dstAsset);\n\n // Vault can only be used on Sonic\n invariant(srcAssetInfo, `Unsupported spoke chain (${params.srcChainId}) token: ${params.srcAsset}`);\n // destination\n invariant(dstAssetInfo, `Unsupported spoke chain (${params.dstChainId}) token: ${params.dstAsset}`);\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n\n const data: Hex = this.buildBridgeData(params, srcAssetInfo, dstAssetInfo, fee);\n\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: hubWallet,\n token: params.srcAsset,\n amount: params.amount,\n data,\n } as unknown as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'CREATE_BRIDGE_INTENT_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build the bridge transaction data for executing the bridge operation on the hub\n * @param params - The create bridge intent parameters\n * @param srcAssetInfo - The source asset information\n * @param dstAssetInfo - The destination asset information\n * @returns Hex - The encoded contract calls for the bridge operation\n */\n buildBridgeData(\n params: CreateBridgeIntentParams,\n srcAssetInfo: HubAssetInfo,\n dstAssetInfo: HubAssetInfo,\n partnerFee: PartnerFee | undefined,\n ): Hex {\n const calls: EvmContractCall[] = [];\n let translatedAmount = params.amount;\n let srcVault = params.srcAsset as `0x${string}`;\n // if src asset is not a vault token, we need to approve and deposit into the vault\n if (!this.configService.isValidVault(srcAssetInfo.asset)) {\n calls.push(Erc20Service.encodeApprove(srcAssetInfo.asset, srcAssetInfo.vault, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(srcAssetInfo.vault, srcAssetInfo.asset, params.amount));\n translatedAmount = EvmVaultTokenService.translateIncomingDecimals(srcAssetInfo.decimal, params.amount);\n srcVault = srcAssetInfo.vault;\n }\n const feeAmount = calculateFeeAmount(translatedAmount, partnerFee);\n\n if (partnerFee && feeAmount > 0n) {\n calls.push(Erc20Service.encodeTransfer(srcVault, partnerFee.address, feeAmount));\n }\n\n const withdrawAmount = translatedAmount - feeAmount;\n let translatedWithdrawAmount = withdrawAmount;\n\n // if dst asset is not a vault token, we need to withdraw from the vault\n if (!this.configService.isValidVault(dstAssetInfo.asset)) {\n calls.push(EvmVaultTokenService.encodeWithdraw(dstAssetInfo.vault, dstAssetInfo.asset, withdrawAmount));\n translatedWithdrawAmount = EvmVaultTokenService.translateOutgoingDecimals(dstAssetInfo.decimal, withdrawAmount);\n }\n\n const encodedRecipientAddress = encodeAddress(params.dstChainId, params.recipient);\n // If the destination chain is Sonic, we can directly transfer the tokens to the recipient\n if (params.dstChainId === this.hubProvider.chainConfig.chain.id) {\n // If destination token is S, then unwrap and send S to the recipient\n if (params.dstAsset.toLowerCase() === this.hubProvider.chainConfig.nativeToken.toLowerCase()) {\n calls.push({\n address: dstAssetInfo.asset,\n value: 0n,\n data: encodeFunctionData({\n abi: wrappedSonicAbi,\n functionName: 'withdrawTo',\n args: [encodedRecipientAddress, translatedWithdrawAmount],\n }),\n });\n } else {\n calls.push(Erc20Service.encodeTransfer(dstAssetInfo.asset, encodedRecipientAddress, translatedWithdrawAmount));\n }\n } else {\n invariant(dstAssetInfo, `Unsupported hub chain (${params.dstChainId}) token: ${params.dstAsset}`);\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n dstAssetInfo.asset,\n encodedRecipientAddress,\n translatedWithdrawAmount,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n return encodeContractCalls(calls);\n }\n\n /**\n * Retrieves the deposited token balance held by the asset manager on a spoke chain.\n * This balance represents the available liquidity for bridging operations and is used to verify\n * that the target chain has sufficient funds to complete a bridge transaction.\n *\n * @param spokeProvider - The spoke provider instance\n * @param token - The token address to query the balance for\n * @returns {Promise<bigint>} - The token balance as a bigint value\n */\n public async getBridgeableAmount(from: XToken, to: XToken): Promise<Result<bigint, unknown>> {\n try {\n const fromHubAsset = this.configService.getHubAssetInfo(from.xChainId, from.address);\n const toHubAsset = this.configService.getHubAssetInfo(to.xChainId, to.address);\n invariant(fromHubAsset, `Hub asset not found for token ${from.address} on chain ${from.xChainId}`);\n invariant(toHubAsset, `Hub asset not found for token ${to.address} on chain ${to.xChainId}`);\n\n // we need to check the max deposit of the token on the from chain and the asset manager balance on the to chain\n const [depositTokenInfo, reserves] = await Promise.all([\n EvmVaultTokenService.getTokenInfo(fromHubAsset.vault, fromHubAsset.asset, this.hubProvider.publicClient),\n EvmVaultTokenService.getVaultReserves(toHubAsset.vault, this.hubProvider.publicClient),\n ]);\n\n // spoke -> hub, we need to check the max deposit of the token on the from chain\n if (!this.configService.isValidVault(fromHubAsset.asset) && this.configService.isValidVault(toHubAsset.asset)) {\n const fromTokenIndex = reserves.tokens.findIndex(t => t.toLowerCase() === fromHubAsset.asset.toLowerCase());\n invariant(\n fromTokenIndex !== -1,\n `Token ${fromHubAsset.asset} not found in the vault reserves for chain ${from.xChainId}`,\n );\n const fromTokenDepositedAmount = reserves.balances[fromTokenIndex] ?? 0n;\n const availableDeposit = depositTokenInfo.maxDeposit - fromTokenDepositedAmount;\n\n return {\n ok: true,\n value: availableDeposit,\n };\n }\n\n // hub -> spoke, we need to check the asset manager balance on the to chain\n if (this.configService.isValidVault(fromHubAsset.asset)) {\n const tokenIndex = reserves.tokens.findIndex(t => t.toLowerCase() === toHubAsset.asset.toLowerCase());\n invariant(\n tokenIndex !== -1,\n `Token ${toHubAsset.asset} not found in the vault reserves for chain ${to.xChainId}`,\n );\n const assetManagerBalance = reserves.balances[tokenIndex] ?? 0n;\n\n return {\n ok: true,\n value: assetManagerBalance,\n };\n }\n\n // spoke -> spoke, we need to check the deposit available on the from chain and the withdrawable asset manager balance on the to chain\n const fromTokenIndex = reserves.tokens.findIndex(t => t.toLowerCase() === fromHubAsset.asset.toLowerCase());\n invariant(\n fromTokenIndex !== -1,\n `Token ${fromHubAsset.asset} not found in the vault reserves for chain ${from.xChainId}`,\n );\n const fromTokenDepositedAmount = reserves.balances[fromTokenIndex] ?? 0n;\n const availableDeposit = depositTokenInfo.maxDeposit - fromTokenDepositedAmount;\n const tokenIndex = reserves.tokens.findIndex(t => t.toLowerCase() === toHubAsset.asset.toLowerCase());\n invariant(\n tokenIndex !== -1,\n `Token ${toHubAsset.asset} not found in the vault reserves for chain ${to.xChainId}`,\n );\n const assetManagerBalance = reserves.balances[tokenIndex] ?? 0n;\n\n // return the minimum of the deposit available and the withdrawable asset manager balance\n return {\n ok: true,\n value: availableDeposit < assetManagerBalance ? availableDeposit : assetManagerBalance,\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Check if two assets on different chains are bridgeable\n * Two assets are bridgeable if they share the same vault on the hub chain\n * @param from - The source X token\n * @param to - The destination X token\n * @param unchecked - Whether to skip the chain ID validation\n * @returns boolean - true if assets are bridgeable, false otherwise\n */\n public isBridgeable({\n from,\n to,\n unchecked = false,\n }: {\n from: XToken;\n to: XToken;\n unchecked?: boolean;\n }): boolean {\n try {\n if (!unchecked) {\n invariant(this.configService.isValidSpokeChainId(from.xChainId), `Invalid spoke chain (${from.xChainId})`);\n invariant(this.configService.isValidSpokeChainId(to.xChainId), `Invalid spoke chain (${to.xChainId})`);\n }\n\n // Get hub asset info for both source and destination assets\n const srcAssetInfo = this.configService.getHubAssetInfo(from.xChainId, from.address);\n const dstAssetInfo = this.configService.getHubAssetInfo(to.xChainId, to.address);\n\n // Check if both assets are supported and have vault information\n invariant(srcAssetInfo, `Hub asset not found for token ${from.address} on chain ${from.xChainId}`);\n invariant(dstAssetInfo, `Hub asset not found for token ${to.address} on chain ${to.xChainId}`);\n\n // Check if the vault addresses are the same (case-insensitive comparison)\n return srcAssetInfo.vault.toLowerCase() === dstAssetInfo.vault.toLowerCase();\n } catch (error) {\n console.error(error);\n\n // Return false on any error\n return false;\n }\n }\n\n /**\n * Get all bridgeable tokens from a source token to a destination chain\n * @param from - The source chain ID\n * @param to - The destination chain ID\n * @param token - The source token address\n * @returns XToken[] - Array of bridgeable tokens on the destination chain\n */\n public getBridgeableTokens(from: SpokeChainId, to: SpokeChainId, token: string): Result<XToken[]> {\n try {\n const srcAssetInfo = this.configService.getHubAssetInfo(from, token);\n invariant(srcAssetInfo, `Hub asset not found for token ${token} on chain ${from}`);\n\n return {\n ok: true,\n value: this.filterTokensWithSameVault(\n this.configService.spokeChainConfig[to].supportedTokens,\n to,\n srcAssetInfo,\n ),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n public filterTokensWithSameVault(\n tokens: Record<string, XToken>,\n to: SpokeChainId,\n srcAssetInfo: HubAssetInfo | undefined,\n ): XToken[] {\n // Filter tokens that share the same vault as the source asset\n const bridgeableTokens: XToken[] = [];\n\n for (const token of Object.values(tokens)) {\n const dstAssetInfo = this.configService.getHubAssetInfo(to, token.address);\n\n if (dstAssetInfo && srcAssetInfo && dstAssetInfo.vault.toLowerCase() === srcAssetInfo.vault.toLowerCase()) {\n bridgeableTokens.push({\n ...token,\n xChainId: to,\n });\n }\n }\n\n return bridgeableTokens;\n }\n}\n","// packages/sdk/src/services/staking/StakingLogic.ts\nimport { type Address, type Hex, type HttpTransport, type PublicClient, encodeFunctionData } from 'viem';\nimport { stakedSodaAbi } from '../shared/abis/stakedSoda.abi.js';\nimport { stakingRouterAbi } from '../shared/abis/stakingRouter.abi.js';\nimport type { EvmContractCall, UserUnstakeInfo } from '../shared/types.js';\n\nexport class StakingLogic {\n private constructor() {}\n\n /**\n * Retrieves all unstake requests for a specific user.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param user - The address of the user.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns Array of user unstake info for the user.\n */\n public static async getUnstakeSodaRequests(\n stakedSoda: Address,\n user: Address,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<readonly UserUnstakeInfo[]> {\n const requests = await publicClient.readContract({\n address: stakedSoda,\n abi: stakedSodaAbi,\n functionName: 'getUnstakeRequests',\n args: [user],\n });\n\n return requests;\n }\n\n /**\n * Encodes the depositFor transaction data.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param account - The address of the account to deposit for.\n * @param amount - The amount of tokens to deposit.\n * @returns The encoded contract call data.\n */\n static encodeDepositFor(stakedSoda: Address, account: Address, amount: bigint): EvmContractCall {\n return {\n address: stakedSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'depositFor',\n args: [account, amount],\n }),\n };\n }\n\n /**\n * Encodes the withdrawTo transaction data.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param account - The address of the account to withdraw to.\n * @param value - The amount of tokens to withdraw.\n * @returns The encoded contract call data.\n */\n static encodeWithdrawTo(stakedSoda: Address, account: Address, value: bigint): EvmContractCall {\n return {\n address: stakedSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'withdrawTo',\n args: [account, value],\n }),\n };\n }\n\n /**\n * Encodes the unstake transaction data.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param account - The address of the account to unstake for.\n * @param value - The amount of tokens to unstake.\n * @returns The encoded contract call data.\n */\n static encodeUnstake(stakedSoda: Address, account: Address, value: bigint): EvmContractCall {\n return {\n address: stakedSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'unstake',\n args: [account, value],\n }),\n };\n }\n\n /**\n * Encodes the cancelUnstakeSodaRequest transaction data.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param requestId - The ID of the unstake request to cancel.\n * @returns The encoded contract call data.\n */\n static encodeCancelUnstakeSodaRequest(stakedSoda: Address, requestId: bigint): EvmContractCall {\n return {\n address: stakedSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'cancelUnstakeRequest',\n args: [requestId],\n }),\n };\n }\n\n /**\n * Encodes the cancelUnstakeRequest transaction data (alias for encodeCancelUnstakeSodaRequest).\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param requestId - The ID of the unstake request to cancel.\n * @returns The encoded contract call data.\n */\n static encodeCancelUnstakeRequest(stakedSoda: Address, requestId: bigint): EvmContractCall {\n return StakingLogic.encodeCancelUnstakeSodaRequest(stakedSoda, requestId);\n }\n\n /**\n * Encodes the claim transaction data.\n * @param stakedSoda - The address of the StakedSoda contract.\n * @param requestId - The ID of the unstake request to claim.\n * @returns The encoded contract call data.\n */\n static encodeClaim(stakedSoda: Address, requestId: bigint): EvmContractCall {\n return {\n address: stakedSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'claim',\n args: [requestId],\n }),\n };\n }\n\n // xSoda ERC4626 Read Methods\n\n /**\n * Returns the total amount of SODA assets held by the xSoda vault.\n * @param xSoda - The address of the xSoda token contract.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The total amount of SODA assets.\n */\n public static async getXSodaTotalAssets(xSoda: Address, publicClient: PublicClient<HttpTransport>): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'totalAssets',\n args: [],\n });\n }\n\n /**\n * Calculates the number of xSoda shares equivalent to a given amount of SODA assets.\n * @param xSoda - The address of the xSoda token contract.\n * @param assets - The amount of SODA assets to convert.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The number of xSoda shares.\n */\n public static async convertSodaToXSodaShares(\n xSoda: Address,\n assets: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'convertToShares',\n args: [assets],\n });\n }\n\n /**\n * Calculates the amount of SODA assets corresponding to a specific number of xSoda shares.\n * @param xSoda - The address of the xSoda token contract.\n * @param shares - The number of xSoda shares to convert.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The amount of SODA assets.\n */\n public static async convertXSodaSharesToSoda(\n xSoda: Address,\n shares: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'convertToAssets',\n args: [shares],\n });\n }\n\n /**\n * Simulates the effects of depositing SODA into xSoda without executing it.\n * @param xSoda - The address of the xSoda token contract.\n * @param assets - The amount of SODA assets to deposit.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The number of xSoda shares that would be minted.\n */\n public static async previewXSodaDeposit(\n xSoda: Address,\n assets: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'previewDeposit',\n args: [assets],\n });\n }\n\n /**\n * Simulates the effects of minting xSoda shares without executing it.\n * @param xSoda - The address of the xSoda token contract.\n * @param shares - The number of xSoda shares to mint.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The amount of SODA assets that would be deposited.\n */\n public static async previewXSodaMint(\n xSoda: Address,\n shares: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'previewMint',\n args: [shares],\n });\n }\n\n /**\n * Simulates the effects of withdrawing SODA from xSoda without executing it.\n * @param xSoda - The address of the xSoda token contract.\n * @param assets - The amount of SODA assets to withdraw.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The number of xSoda shares that would be burned.\n */\n public static async previewXSodaWithdraw(\n xSoda: Address,\n assets: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'previewWithdraw',\n args: [assets],\n });\n }\n\n /**\n * Simulates the effects of redeeming xSoda shares without executing it.\n * @param xSoda - The address of the xSoda token contract.\n * @param shares - The number of xSoda shares to redeem.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The amount of SODA assets that would be withdrawn.\n */\n public static async previewXSodaRedeem(\n xSoda: Address,\n shares: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: xSoda,\n abi: stakedSodaAbi,\n functionName: 'previewRedeem',\n args: [shares],\n });\n }\n\n // xSoda ERC4626 Encoding Methods\n\n /**\n * Encodes the xSoda deposit transaction data (deposit SODA to get xSoda shares).\n * @param xSoda - The address of the xSoda token contract.\n * @param assets - The amount of SODA assets to deposit.\n * @param receiver - The address of the receiver.\n * @returns The encoded contract call data.\n */\n static encodeXSodaDeposit(xSoda: Address, assets: bigint, receiver: Address): EvmContractCall {\n return {\n address: xSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'deposit',\n args: [assets, receiver],\n }),\n };\n }\n\n /**\n * Encodes the xSoda mint transaction data (mint xSoda shares by depositing SODA).\n * @param xSoda - The address of the xSoda token contract.\n * @param shares - The number of xSoda shares to mint.\n * @param receiver - The address of the receiver.\n * @returns The encoded contract call data.\n */\n static encodeXSodaMint(xSoda: Address, shares: bigint, receiver: Address): EvmContractCall {\n return {\n address: xSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'mint',\n args: [shares, receiver],\n }),\n };\n }\n\n /**\n * Encodes the xSoda withdraw transaction data (withdraw SODA by burning xSoda shares).\n * @param xSoda - The address of the xSoda token contract.\n * @param assets - The amount of SODA assets to withdraw.\n * @param receiver - The address of the receiver.\n * @param owner - The address of the owner.\n * @returns The encoded contract call data.\n */\n static encodeXSodaWithdraw(xSoda: Address, assets: bigint, receiver: Address, owner: Address): EvmContractCall {\n return {\n address: xSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'withdraw',\n args: [assets, receiver, owner],\n }),\n };\n }\n\n /**\n * Encodes the xSoda redeem transaction data (redeem xSoda shares to get SODA).\n * @param xSoda - The address of the xSoda token contract.\n * @param shares - The number of xSoda shares to redeem.\n * @param receiver - The address of the receiver.\n * @param owner - The address of the owner.\n * @returns The encoded contract call data.\n */\n static encodeXSodaRedeem(xSoda: Address, shares: bigint, receiver: Address, owner: Address): EvmContractCall {\n return {\n address: xSoda,\n value: 0n,\n data: encodeFunctionData({\n abi: stakedSodaAbi,\n functionName: 'redeem',\n args: [shares, receiver, owner],\n }),\n };\n }\n\n // StakingRouter Methods\n\n /**\n * Encodes the StakingRouter stake transaction data.\n * @param stakingRouter - The address of the StakingRouter contract.\n * @param amount - The amount of SODA to stake.\n * @param to - The address to receive the staked tokens.\n * @param minReceive - The minimum amount to receive.\n * @returns The encoded contract call data.\n */\n static encodeStakingRouterStake(\n stakingRouter: Address,\n amount: bigint,\n to: Address,\n minReceive: bigint,\n ): EvmContractCall {\n return {\n address: stakingRouter,\n value: 0n,\n data: encodeFunctionData({\n abi: stakingRouterAbi,\n functionName: 'stake',\n args: [amount, to, minReceive],\n }),\n };\n }\n\n /**\n * Encodes the StakingRouter unstake transaction data.\n * @param stakingRouter - The address of the StakingRouter contract.\n * @param amount - The amount of xSoda to unstake.\n * @param minAmount - The minimum amount of SODA to receive.\n * @param asset - The asset address to receive.\n * @param chainID - The destination chain ID.\n * @param to - The destination address as bytes.\n * @returns The encoded contract call data.\n */\n static encodeStakingRouterUnstake(\n stakingRouter: Address,\n amount: bigint,\n minAmount: bigint,\n asset: Address,\n chainID: bigint,\n to: Hex,\n ): EvmContractCall {\n return {\n address: stakingRouter,\n value: 0n,\n data: encodeFunctionData({\n abi: stakingRouterAbi,\n functionName: 'unstake',\n args: [amount, minAmount, asset, chainID, to],\n }),\n };\n }\n\n // Estimation Methods\n\n /**\n * Estimates the xSoda amount and preview deposit for a given SODA amount.\n * @param stakingRouter - The address of the StakingRouter contract.\n * @param amount - The amount of SODA to estimate.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns Tuple containing [xSodaAmount, previewDepositAmount].\n */\n public static async estimateXSodaAmount(\n stakingRouter: Address,\n amount: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<readonly [bigint, bigint]> {\n return publicClient.readContract({\n address: stakingRouter,\n abi: stakingRouterAbi,\n functionName: 'estimateXSodaAmount',\n args: [amount],\n });\n }\n\n /**\n * Estimates the instant unstake amount for a given xSoda amount.\n * @param stakingRouter - The address of the StakingRouter contract.\n * @param amount - The amount of xSoda to estimate unstake for.\n * @param publicClient - PublicClient<HttpTransport>\n * @returns The estimated SODA amount from instant unstake.\n */\n public static async estimateInstantUnstake(\n stakingRouter: Address,\n amount: bigint,\n publicClient: PublicClient<HttpTransport>,\n ): Promise<bigint> {\n return publicClient.readContract({\n address: stakingRouter,\n abi: stakingRouterAbi,\n functionName: 'estimateInstantUnstake',\n args: [amount],\n });\n }\n}\n","// packages/sdk/src/services/staking/StakingService.ts\nimport invariant from 'tiny-invariant';\nimport { erc20Abi, type Address, type Hex } from 'viem';\nimport { StakingLogic } from './StakingLogic.js';\nimport { stakedSodaAbi } from '../shared/abis/index.js';\nimport type {\n UserUnstakeInfo,\n EvmContractCall,\n TxReturnType,\n GetSpokeDepositParamsType,\n Prettify,\n GetAddressType,\n Result,\n PromiseTxReturnType,\n} from '../shared/types.js';\nimport {\n encodeContractCalls,\n Erc20Service,\n EvmVaultTokenService,\n relayTxAndWaitPacket,\n SolanaSpokeProvider,\n SpokeService,\n WalletAbstractionService,\n SonicSpokeService,\n SonicSpokeProvider,\n EvmSpokeProvider,\n type EvmHubProvider,\n type SpokeProvider,\n encodeAddress,\n EvmAssetManagerService,\n StellarSpokeProvider,\n StellarSpokeService,\n type RelayError,\n} from '../index.js';\nimport { DEFAULT_RELAY_TX_TIMEOUT } from '../shared/constants.js';\nimport { type HttpUrl, type XToken, type SpokeChainId, getIntentRelayChainId, type HubAssetInfo } from '@sodax/types';\nimport { getHubChainConfig, type ConfigService } from '../shared/config/ConfigService.js';\n\nexport type StakeParams = {\n amount: bigint; // amount to stake\n minReceive: bigint; // minimum amount to receive\n account: Address; // account to stake from\n action: 'stake';\n};\n\nexport type UnstakeParams = {\n amount: bigint;\n account: Address;\n action: 'unstake';\n};\n\nexport type ClaimParams = {\n requestId: bigint;\n amount: bigint; // claimable amount after penalty calculation\n action: 'claim';\n};\n\nexport type CancelUnstakeParams = {\n requestId: bigint;\n action: 'cancelUnstake';\n};\n\nexport type InstantUnstakeParams = {\n amount: bigint;\n minAmount: bigint;\n account: Address;\n action: 'instantUnstake';\n};\n\nexport type StakingAction = 'stake' | 'unstake' | 'claim' | 'cancelUnstake' | 'instantUnstake';\nexport type StakingParams = StakeParams | UnstakeParams | ClaimParams | CancelUnstakeParams | InstantUnstakeParams;\n\nexport type StakingInfo = {\n totalStaked: bigint; // Total SODA staked (totalAssets from xSODA vault)\n totalUnderlying: bigint; // Total underlying SODA assets in the vault\n userXSodaBalance: bigint; // User's xSODA shares (raw balance)\n userXSodaValue: bigint; // User's xSODA value in SODA (converted)\n userUnderlying: bigint; // User's underlying SODA amount\n};\n\nexport type UnstakingInfo = {\n userUnstakeSodaRequests: readonly UserUnstakeInfo[];\n totalUnstaking: bigint;\n};\n\nexport type UnstakeRequestWithPenalty = UserUnstakeInfo & {\n penalty: bigint;\n penaltyPercentage: number;\n claimableAmount: bigint;\n};\n\nexport type StakingConfig = {\n unstakingPeriod: bigint; // in seconds\n minUnstakingPeriod: bigint; // in seconds\n maxPenalty: bigint; // percentage (1-100)\n};\n\nexport type StakingErrorCode =\n | 'STAKE_FAILED'\n | 'UNSTAKE_FAILED'\n | 'INSTANT_UNSTAKE_FAILED'\n | 'CLAIM_FAILED'\n | 'CANCEL_UNSTAKE_FAILED'\n | 'INFO_FETCH_FAILED'\n | 'ALLOWANCE_CHECK_FAILED'\n | 'APPROVAL_FAILED';\n\nexport type StakingError<T extends StakingErrorCode> = {\n code: T;\n error: unknown;\n};\n\nexport type StakingServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n relayerApiEndpoint: HttpUrl;\n configService: ConfigService;\n};\n\n/**\n * StakingService provides a high-level interface for staking operations\n * including staking SODA tokens, unstaking, claiming rewards, and retrieving staking information.\n * All transaction methods return encoded contract calls that can be sent via a wallet provider.\n */\nexport class StakingService {\n private readonly hubProvider: EvmHubProvider;\n private readonly relayerApiEndpoint: HttpUrl;\n private readonly configService: ConfigService;\n\n constructor({ hubProvider, relayerApiEndpoint, configService }: StakingServiceConstructorParams) {\n this.hubProvider = hubProvider;\n this.relayerApiEndpoint = relayerApiEndpoint;\n this.configService = configService;\n }\n\n /**\n * Check if allowance is valid for the staking operations\n * @param params - The staking parameters\n * @param spokeProvider - The spoke provider\n * @returns {Promise<Result<boolean, StakingError<'ALLOWANCE_CHECK_FAILED'>>>}\n */\n public async isAllowanceValid<S extends SpokeProvider>({\n params,\n spokeProvider,\n }: Prettify<{ params: StakingParams; spokeProvider: S }>): Promise<\n Result<boolean, StakingError<'ALLOWANCE_CHECK_FAILED'>>\n > {\n try {\n if (params.action === 'stake' || params.action === 'unstake' || params.action === 'instantUnstake') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const targetToken =\n params.action === 'stake' || spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id\n ? (spokeProvider.chainConfig.supportedTokens.SODA?.address as Address)\n : this.hubProvider.chainConfig.addresses.xSoda;\n invariant(targetToken, 'Target token not found');\n\n // For regular EVM chains (non-Sonic), check ERC20 allowance against assetManager\n if (spokeProvider instanceof EvmSpokeProvider) {\n const allowanceResult = await Erc20Service.isAllowanceValid(\n targetToken,\n params.amount,\n walletAddress as GetAddressType<EvmSpokeProvider>,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n );\n\n if (!allowanceResult.ok) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: allowanceResult.error,\n },\n };\n }\n\n return {\n ok: true,\n value: allowanceResult.value,\n };\n }\n\n // For Sonic chain, check ERC20 allowance against userRouter\n if (spokeProvider instanceof SonicSpokeProvider) {\n const userRouter = await SonicSpokeService.getUserRouter(walletAddress as Address, spokeProvider);\n\n const allowanceResult = await Erc20Service.isAllowanceValid(\n targetToken,\n params.amount,\n walletAddress as GetAddressType<SonicSpokeProvider>,\n userRouter,\n spokeProvider,\n );\n\n if (!allowanceResult.ok) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: allowanceResult.error,\n },\n };\n }\n\n return {\n ok: true,\n value: allowanceResult.value,\n };\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n return {\n ok: true,\n value: await StellarSpokeService.hasSufficientTrustline(targetToken, params.amount, spokeProvider),\n };\n }\n\n // For non-EVM chains (Icon, Sui, Stellar, etc.), no allowance check needed\n return {\n ok: true,\n value: true,\n };\n }\n\n // Return false by default\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: new Error('Invalid staking action'),\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'ALLOWANCE_CHECK_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Approve token spending for the staking operations\n * @param params - The staking parameters\n * @param spokeProvider - The spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'APPROVAL_FAILED'>>>\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: StakingParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'APPROVAL_FAILED'>>\n > {\n try {\n if (params.action === 'stake' || params.action === 'unstake' || params.action === 'instantUnstake') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const targetToken =\n params.action === 'stake' || spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id\n ? (spokeProvider.chainConfig.supportedTokens.SODA?.address as Address)\n : this.hubProvider.chainConfig.addresses.xSoda;\n invariant(targetToken, 'Target token not found');\n\n // For regular EVM chains (non-Sonic), approve against assetManager\n if (spokeProvider instanceof EvmSpokeProvider) {\n const result = await Erc20Service.approve(\n targetToken,\n params.amount,\n spokeProvider.chainConfig.addresses.assetManager,\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result as TxReturnType<S, R>,\n };\n }\n\n // For Sonic chain, approve against userRouter\n if (spokeProvider instanceof SonicSpokeProvider) {\n const userRouter = await SonicSpokeService.getUserRouter(\n walletAddress as GetAddressType<SonicSpokeProvider>,\n spokeProvider,\n );\n\n const result = await Erc20Service.approve(targetToken, params.amount, userRouter, spokeProvider, raw);\n\n return {\n ok: true,\n value: result as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof StellarSpokeProvider) {\n const result = await StellarSpokeService.requestTrustline(targetToken, params.amount, spokeProvider, raw);\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n }\n\n // For non-EVM chains, approval is not needed\n return {\n ok: false,\n error: {\n code: 'APPROVAL_FAILED',\n error: new Error(\n 'Approval only supported for EVM spoke chains and [stake, unstake, instantUnstake] operations',\n ),\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'APPROVAL_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Execute stake transaction for staking SODA tokens to receive xSoda shares\n * NOTE: For EVM chains, you may need to approve token spending first using the approve method\n * @param params - The staking parameters\n * @param spokeProvider - The spoke provider\n * @param timeout - The timeout in milliseconds for the transaction (default: DEFAULT_RELAY_TX_TIMEOUT)\n * @returns Promise<Result<[SpokeTxHash, HubTxHash], StakingError<'STAKE_FAILED'> | RelayError>>\n */\n public async stake(\n params: StakeParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[string, string], StakingError<'STAKE_FAILED'> | RelayError>> {\n try {\n const txResult = await this.createStakeIntent({ params, spokeProvider, raw: false });\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'STAKE_FAILED',\n error: txResult.error,\n },\n };\n }\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(txResult.value, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'STAKE_FAILED',\n error: verifyTxHashResult.error,\n },\n };\n }\n\n let hubTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider\n ? (txResult.data as { address: `0x${string}`; payload: `0x${string}` })\n : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n hubTxHash = packetResult.value.dst_tx_hash;\n } else {\n hubTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, hubTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'STAKE_FAILED',\n error: error,\n },\n };\n }\n }\n /**\n * Create stake intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the stake intent\n * In order to successfully stake tokens, you need to:\n * 1. Check if the allowance is sufficient using isAllowanceValid\n * 2. Approve the appropriate contract to spend the tokens using approve\n * 3. Create the stake intent using this method\n * 4. Relay the transaction to the hub and await completion using the stake method\n *\n * @param params - The stake parameters including amount and account\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data (default: false)\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'STAKE_FAILED'>> & { data?: { address: string; payload: Hex } }>\n */\n async createStakeIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: StakeParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'STAKE_FAILED'>> & { data?: { address: string; payload: Hex } }\n > {\n try {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const sodaToken = spokeProvider.chainConfig.supportedTokens.SODA as XToken;\n invariant(sodaToken, 'SODA token not found');\n const sodaAsset = this.configService.getHubAssetInfo(spokeProvider.chainConfig.chain.id, sodaToken.address);\n invariant(sodaAsset, 'SODA asset not found');\n\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n\n let to = hubWallet;\n if (spokeProvider.chainConfig.chain.id === this.hubProvider.chainConfig.chain.id) {\n to = walletAddress as Address;\n }\n\n const data: Hex = this.buildStakeData(sodaAsset, to, params);\n\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n to: hubWallet,\n token: sodaToken.address,\n amount: params.amount,\n data,\n } as unknown as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'STAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build stake data using StakingRouter (simplified flow)\n * @param sodaAsset - The SODA asset information\n * @param to - The destination address\n * @param params - The staking parameters\n * @returns The encoded contract call data\n */\n public buildStakeData(sodaAsset: HubAssetInfo, to: Address, params: StakeParams): Hex {\n const hubConfig = getHubChainConfig();\n const sodaVault = sodaAsset.vault;\n const stakingRouter = hubConfig.addresses.stakingRouter;\n\n const calls: EvmContractCall[] = [];\n calls.push(Erc20Service.encodeApprove(sodaAsset.asset, sodaVault, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(sodaVault, sodaAsset.asset, params.amount));\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(sodaAsset.decimal, params.amount);\n calls.push(Erc20Service.encodeApprove(sodaVault, stakingRouter, translatedAmount));\n calls.push(StakingLogic.encodeStakingRouterStake(stakingRouter, translatedAmount, to, params.minReceive));\n return encodeContractCalls(calls);\n }\n\n /**\n * Execute unstake transaction for unstaking xSoda shares\n * @param params - The unstaking parameters\n * @param spokeProvider - The spoke provider\n * @param timeout - The timeout in milliseconds for the transaction (default: DEFAULT_RELAY_TX_TIMEOUT)\n * @returns Promise<Result<[SpokeTxHash, HubTxHash], StakingError<'UNSTAKE_FAILED'> | RelayError>>\n */\n public async unstake(\n params: UnstakeParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[string, string], StakingError<'UNSTAKE_FAILED'> | RelayError>> {\n try {\n const txResult = await this.createUnstakeIntent({ params, spokeProvider, raw: false });\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'UNSTAKE_FAILED',\n error: txResult.error,\n },\n };\n }\n\n let hubTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider\n ? (txResult.data as { address: `0x${string}`; payload: `0x${string}` })\n : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n hubTxHash = packetResult.value.dst_tx_hash;\n } else {\n hubTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, hubTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Create unstake intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the unstake intent\n * In order to successfully unstake tokens, you need to:\n * 1. Check if the allowance is sufficient using isAllowanceValid\n * 2. Approve the appropriate contract to spend the tokens using approve\n * 3. Create the unstake intent using this method\n * 4. Relay the transaction to the hub and await completion using the unstake method\n *\n * @param params - The unstake parameters including amount and account\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data (default: false)\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }>\n */\n async createUnstakeIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: UnstakeParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }\n > {\n try {\n const isHub = this.hubProvider.chainConfig.chain.id === spokeProvider.chainConfig.chain.id;\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n\n const data: Hex = this.buildUnstakeData(hubWallet, params);\n\n let txResult: PromiseTxReturnType<S, R> | TxReturnType<S, R>;\n if (isHub) {\n txResult = await SpokeService.deposit(\n {\n from: walletAddress as Address,\n to: hubWallet,\n token: this.hubProvider.chainConfig.addresses.xSoda,\n amount: params.amount,\n data,\n } satisfies GetSpokeDepositParamsType<SonicSpokeProvider> as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n } else {\n txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n }\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build unstake data for unstaking xSoda shares\n * @param hubWallet - The hub wallet address\n * @param params - The unstake parameters\n * @returns The encoded contract call data\n */\n public buildUnstakeData(hubWallet: Address, params: UnstakeParams): Hex {\n const hubConfig = getHubChainConfig();\n const stakedSoda = hubConfig.addresses.stakedSoda;\n const xSoda = hubConfig.addresses.xSoda;\n const calls: EvmContractCall[] = [];\n calls.push(StakingLogic.encodeXSodaRedeem(xSoda, params.amount, hubWallet, hubWallet));\n calls.push(StakingLogic.encodeUnstake(stakedSoda, hubWallet, params.amount));\n return encodeContractCalls(calls);\n }\n\n /**\n * Execute instant unstake transaction for instantly unstaking xSoda shares\n * @param params - The instant unstaking parameters\n * @param spokeProvider - The spoke provider\n * @param timeout - The timeout in milliseconds for the transaction (default: DEFAULT_RELAY_TX_TIMEOUT)\n * @returns Promise<Result<[SpokeTxHash, HubTxHash], StakingError<'INSTANT_UNSTAKE_FAILED'> | RelayError>>\n */\n public async instantUnstake(\n params: InstantUnstakeParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[string, string], StakingError<'INSTANT_UNSTAKE_FAILED'> | RelayError>> {\n try {\n const txResult = await this.createInstantUnstakeIntent({ params, spokeProvider, raw: false });\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'INSTANT_UNSTAKE_FAILED',\n error: txResult.error,\n },\n };\n }\n\n let hubTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider\n ? (txResult.data as { address: `0x${string}`; payload: `0x${string}` })\n : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n hubTxHash = packetResult.value.dst_tx_hash;\n } else {\n hubTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, hubTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INSTANT_UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Create instant unstake intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the instant unstake intent\n * In order to successfully instant unstake tokens, you need to:\n * 1. Create the instant unstake intent using this method\n * 2. Relay the transaction to the hub and await completion using the instantUnstake method\n *\n * @param params - The instant unstake parameters including amount, minAmount and account\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data (default: false)\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'INSTANT_UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }>\n */\n async createInstantUnstakeIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: InstantUnstakeParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'INSTANT_UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }\n > {\n try {\n const isHub = this.hubProvider.chainConfig.chain.id === spokeProvider.chainConfig.chain.id;\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n\n const sodaToken = spokeProvider.chainConfig.supportedTokens.SODA as XToken;\n invariant(sodaToken, 'SODA token not found');\n const sodaAsset = this.configService.getHubAssetInfo(spokeProvider.chainConfig.chain.id, sodaToken.address);\n invariant(sodaAsset, 'SODA asset not found');\n\n const data: Hex = this.buildInstantUnstakeData(\n sodaAsset,\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress),\n params,\n );\n\n let txResult: PromiseTxReturnType<S, R> | TxReturnType<S, R>;\n if (isHub) {\n txResult = await SpokeService.deposit(\n {\n from: walletAddress as Address,\n to: hubWallet,\n token: this.hubProvider.chainConfig.addresses.xSoda,\n amount: params.amount,\n data,\n } satisfies GetSpokeDepositParamsType<SonicSpokeProvider> as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n } else {\n txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n }\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'INSTANT_UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build instant unstake data for instantly unstaking xSoda shares\n * @param sodaAsset - The SODA asset information\n * @param dstChainId - The destination chain ID\n * @param dstWallet - The destination wallet address\n * @param params - The instant unstake parameters\n * @returns The encoded contract call data\n */\n public buildInstantUnstakeData(\n sodaAsset: HubAssetInfo,\n dstChainId: SpokeChainId,\n dstWallet: Hex,\n params: InstantUnstakeParams,\n ): Hex {\n const hubConfig = getHubChainConfig();\n const stakingRouter = hubConfig.addresses.stakingRouter;\n const xSoda = hubConfig.addresses.xSoda;\n\n const calls: EvmContractCall[] = [];\n calls.push(Erc20Service.encodeApprove(xSoda, stakingRouter, params.amount));\n calls.push(\n StakingLogic.encodeStakingRouterUnstake(\n stakingRouter,\n params.amount,\n params.minAmount,\n sodaAsset.asset,\n getIntentRelayChainId(dstChainId),\n dstWallet,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Execute claim transaction for claiming unstaked tokens after the unstaking period\n * @param params - The claim parameters\n * @param spokeProvider - The spoke provider\n * @param timeout - The timeout in milliseconds for the transaction (default: DEFAULT_RELAY_TX_TIMEOUT)\n * @returns Promise<Result<[SpokeTxHash, HubTxHash], StakingError<'CLAIM_FAILED'> | RelayError>>\n */\n public async claim(\n params: ClaimParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[string, string], StakingError<'CLAIM_FAILED'> | RelayError>> {\n try {\n const txResult = await this.createClaimIntent({ params, spokeProvider, raw: false });\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CLAIM_FAILED',\n error: txResult.error,\n },\n };\n }\n\n let hubTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider\n ? (txResult.data as { address: `0x${string}`; payload: `0x${string}` })\n : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n hubTxHash = packetResult.value.dst_tx_hash;\n } else {\n hubTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, hubTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CLAIM_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Create claim intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the claim intent\n * In order to successfully claim tokens, you need to:\n * 1. Create the claim intent using this method\n * 2. Relay the transaction to the hub and await completion using the claim method\n *\n * @param params - The claim parameters including requestId\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data (default: false)\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'CLAIM_FAILED'>> & { data?: { address: string; payload: Hex } }>\n */\n async createClaimIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: ClaimParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'CLAIM_FAILED'>> & { data?: { address: string; payload: Hex } }\n > {\n try {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n\n const sodaToken = spokeProvider.chainConfig.supportedTokens.SODA as XToken;\n invariant(sodaToken, 'SODA token not found');\n const sodaAsset = this.configService.getHubAssetInfo(spokeProvider.chainConfig.chain.id, sodaToken.address);\n invariant(sodaAsset, 'SODA asset not found');\n\n const data: Hex = this.buildClaimData(\n sodaAsset,\n spokeProvider.chainConfig.chain.id,\n encodeAddress(spokeProvider.chainConfig.chain.id, walletAddress),\n params,\n );\n\n const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'CLAIM_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build claim data for claiming unstaked tokens\n * @param sodaAsset - The SODA asset information\n * @param dstChainId - The destination chain ID\n * @param dstWallet - The destination wallet address\n * @param params - The claim parameters\n * @returns The encoded contract call data\n */\n public buildClaimData(sodaAsset: HubAssetInfo, dstChainId: SpokeChainId, dstWallet: Hex, params: ClaimParams): Hex {\n const hubConfig = getHubChainConfig();\n const stakedSoda = hubConfig.addresses.stakedSoda;\n const sodaVault = sodaAsset.vault;\n const calls: EvmContractCall[] = [];\n calls.push(StakingLogic.encodeClaim(stakedSoda, params.requestId));\n // Transfer the claimable amount to the destination wallet\n calls.push(EvmVaultTokenService.encodeWithdraw(sodaVault, sodaAsset.asset, params.amount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(sodaAsset.decimal, params.amount);\n\n if (dstChainId === this.hubProvider.chainConfig.chain.id) {\n calls.push(Erc20Service.encodeTransfer(sodaAsset.asset, dstWallet, translatedAmountOut));\n } else {\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n sodaAsset.asset,\n dstWallet,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n }\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Execute cancel unstake transaction for cancelling an unstake request\n * @param params - The cancel unstake parameters\n * @param spokeProvider - The spoke provider\n * @param timeout - The timeout in milliseconds for the transaction (default: DEFAULT_RELAY_TX_TIMEOUT)\n * @returns Promise<Result<[SpokeTxHash, HubTxHash], StakingError<'CANCEL_UNSTAKE_FAILED'> | RelayError>>\n */\n public async cancelUnstake(\n params: CancelUnstakeParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<Result<[string, string], StakingError<'CANCEL_UNSTAKE_FAILED'> | RelayError>> {\n try {\n const txResult = await this.createCancelUnstakeIntent({ params, spokeProvider, raw: false });\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CANCEL_UNSTAKE_FAILED',\n error: txResult.error,\n },\n };\n }\n\n let hubTxHash: string | null = null;\n if (spokeProvider.chainConfig.chain.id !== this.hubProvider.chainConfig.chain.id) {\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n spokeProvider instanceof SolanaSpokeProvider\n ? (txResult.data as { address: `0x${string}`; payload: `0x${string}` })\n : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n if (!packetResult.ok) {\n return {\n ok: false,\n error: {\n code: packetResult.error.code,\n error: packetResult.error,\n },\n };\n }\n hubTxHash = packetResult.value.dst_tx_hash;\n } else {\n hubTxHash = txResult.value;\n }\n\n return { ok: true, value: [txResult.value, hubTxHash] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CANCEL_UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Create cancel unstake intent only (without relaying to hub)\n * NOTE: This method only executes the transaction on the spoke chain and creates the cancel unstake intent\n * In order to successfully cancel an unstake request, you need to:\n * 1. Create the cancel unstake intent using this method\n * 2. Relay the transaction to the hub and await completion using the cancelUnstake method\n *\n * @param params - The cancel unstake parameters including requestId\n * @param spokeProvider - The spoke provider for the source chain\n * @param raw - Whether to return the raw transaction data (default: false)\n * @returns Promise<Result<TxReturnType<S, R>, StakingError<'CANCEL_UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }>\n */\n async createCancelUnstakeIntent<S extends SpokeProvider = SpokeProvider, R extends boolean = false>({\n params,\n spokeProvider,\n raw,\n }: Prettify<{ params: CancelUnstakeParams; spokeProvider: S; raw?: R }>): Promise<\n Result<TxReturnType<S, R>, StakingError<'CANCEL_UNSTAKE_FAILED'>> & { data?: { address: string; payload: Hex } }\n > {\n try {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n let hubWallet: Address;\n if (spokeProvider instanceof SonicSpokeProvider) {\n hubWallet = walletAddress as Address;\n } else {\n hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n spokeProvider,\n this.hubProvider,\n );\n }\n\n const data: Hex = await this.buildCancelUnstakeData(params, hubWallet);\n\n const txResult = await SpokeService.callWallet(hubWallet, data, spokeProvider, this.hubProvider, raw);\n\n return {\n ok: true,\n value: txResult as TxReturnType<S, R>,\n data: {\n address: hubWallet,\n payload: data,\n },\n };\n } catch (error) {\n console.error(error);\n return {\n ok: false,\n error: {\n code: 'CANCEL_UNSTAKE_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Build cancel unstake data for cancelling an unstake request\n * @param params - The cancel unstake parameters\n * @param hubWallet - The hub wallet address\n * @returns Promise<Hex> - The encoded contract call data\n */\n public async buildCancelUnstakeData(params: CancelUnstakeParams, hubWallet: Address): Promise<Hex> {\n const hubConfig = getHubChainConfig();\n const stakedSoda = hubConfig.addresses.stakedSoda;\n const xSoda = hubConfig.addresses.xSoda;\n\n // Fetch the unstake request to get the amount\n const unstakeRequests = await StakingLogic.getUnstakeSodaRequests(\n stakedSoda,\n hubWallet,\n this.hubProvider.publicClient,\n );\n\n const request = unstakeRequests.find(req => req.id === params.requestId);\n if (!request) {\n throw new Error(`Unstake request with ID ${params.requestId} not found`);\n }\n\n const amount = request.request.amount;\n\n const calls: EvmContractCall[] = [];\n calls.push(StakingLogic.encodeCancelUnstakeRequest(stakedSoda, params.requestId));\n calls.push(Erc20Service.encodeApprove(stakedSoda, xSoda, amount));\n calls.push(StakingLogic.encodeXSodaDeposit(xSoda, amount, hubWallet));\n return encodeContractCalls(calls);\n }\n\n /**\n * Get comprehensive staking information for a user using spoke provider\n * @param spokeProvider - The spoke provider\n * @returns Promise<Result<StakingInfo, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getStakingInfoFromSpoke(\n spokeProvider: SpokeProvider,\n ): Promise<Result<StakingInfo, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n if (spokeProvider instanceof SonicSpokeProvider) {\n return this.getStakingInfo(walletAddress as `0x${string}`);\n }\n const hubWallet = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress as `0x${string}`,\n spokeProvider,\n this.hubProvider,\n );\n\n return this.getStakingInfo(hubWallet);\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get comprehensive staking information for a user\n * @param userAddress - The user's address\n * @returns Promise<Result<StakingInfo, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getStakingInfo(userAddress: Address): Promise<Result<StakingInfo, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n invariant(userAddress, 'User address is required');\n\n const hubConfig = getHubChainConfig();\n const xSoda = hubConfig.addresses.xSoda;\n\n // Get total assets in xSoda vault (total underlying SODA)\n const totalUnderlying = await StakingLogic.getXSodaTotalAssets(xSoda, this.hubProvider.publicClient);\n\n // Get user's raw xSODA shares\n const userXSodaShares = await this.getXSodaBalance(xSoda, userAddress);\n\n // Convert user's xSODA shares to SODA value\n const userXSodaValue = await StakingLogic.convertXSodaSharesToSoda(\n xSoda,\n userXSodaShares,\n this.hubProvider.publicClient,\n );\n\n return {\n ok: true,\n value: {\n totalStaked: totalUnderlying, // Total SODA staked (same as total underlying)\n totalUnderlying, // Total underlying SODA assets\n userXSodaBalance: userXSodaShares, // User's raw xSODA shares\n userXSodaValue, // User's xSODA value in SODA\n userUnderlying: userXSodaValue, // User's underlying SODA amount\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get unstaking information for a user\n * @param param - The user's address or spoke provider\n * @returns Promise<Result<UnstakingInfo, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getUnstakingInfo(\n param: SpokeProvider | Address,\n ): Promise<Result<UnstakingInfo, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n let userAddress: Address;\n if (typeof param === 'string') {\n userAddress = param;\n } else {\n const walletAddress = await param.walletProvider.getWalletAddress();\n userAddress = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n param,\n this.hubProvider,\n );\n }\n\n const hubConfig = getHubChainConfig();\n const stakedSoda = hubConfig.addresses.stakedSoda;\n\n // Get user's unstake requests\n const userUnstakeSodaRequests = await StakingLogic.getUnstakeSodaRequests(\n stakedSoda,\n userAddress,\n this.hubProvider.publicClient,\n );\n\n // Calculate total unstaking amount\n const totalUnstaking = userUnstakeSodaRequests.reduce((total, userInfo) => total + userInfo.request.amount, 0n);\n\n return {\n ok: true,\n value: {\n userUnstakeSodaRequests,\n totalUnstaking,\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get staking configuration from the stakedSoda contract\n * @returns Promise<Result<StakingConfig, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getStakingConfig(): Promise<Result<StakingConfig, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n const hubConfig = getHubChainConfig();\n const stakedSoda = hubConfig.addresses.stakedSoda;\n\n // Read all configuration values in a single contract call\n const [unstakingPeriod, minUnstakingPeriod, maxPenalty] = await this.hubProvider.publicClient.readContract({\n address: stakedSoda,\n abi: stakedSodaAbi,\n functionName: 'getParameters',\n });\n\n return {\n ok: true,\n value: {\n unstakingPeriod: unstakingPeriod,\n minUnstakingPeriod: minUnstakingPeriod,\n maxPenalty: maxPenalty,\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Calculate penalty for an unstake request based on the contract logic\n * @param startTime - The start time of the unstake request\n * @param config - The staking configuration\n * @returns The penalty amount and percentage\n */\n private calculatePenalty(startTime: bigint, config: StakingConfig): { penalty: bigint; penaltyPercentage: number } {\n const currentTime = BigInt(Math.floor(Date.now() / 1000));\n const timeElapsed = currentTime - startTime;\n\n // Check if unstaking period is less than minimum\n if (timeElapsed < config.minUnstakingPeriod) {\n // Return max penalty if still in minimum period\n return {\n penalty: (config.maxPenalty * 100n) / 100n, // Convert percentage to basis points\n penaltyPercentage: Number(config.maxPenalty),\n };\n }\n\n // If time elapsed is greater than or equal to unstaking period, no penalty\n if (timeElapsed >= config.unstakingPeriod) {\n return {\n penalty: 0n,\n penaltyPercentage: 0,\n };\n }\n\n // Calculate penalty based on time in reduction period\n const timeInReductionPeriod = timeElapsed - config.minUnstakingPeriod;\n const totalReductionPeriod = config.unstakingPeriod - config.minUnstakingPeriod;\n\n // Calculate penalty: (maxPenalty * (totalReductionPeriod - timeInReductionPeriod)) / totalReductionPeriod\n const penalty = (config.maxPenalty * (totalReductionPeriod - timeInReductionPeriod)) / totalReductionPeriod;\n\n return {\n penalty: (penalty * 100n) / 100n, // Convert percentage to basis points\n penaltyPercentage: Number(penalty),\n };\n }\n\n /**\n * Get unstaking information with penalty calculations\n * @param param - The user's address or spoke provider\n * @returns Promise<Result<UnstakingInfo & { requestsWithPenalty: UnstakeRequestWithPenalty[] }, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getUnstakingInfoWithPenalty(\n param: SpokeProvider | Address,\n ): Promise<\n Result<UnstakingInfo & { requestsWithPenalty: UnstakeRequestWithPenalty[] }, StakingError<'INFO_FETCH_FAILED'>>\n > {\n try {\n let userAddress: Address;\n if (typeof param === 'string') {\n userAddress = param;\n } else {\n const walletAddress = await param.walletProvider.getWalletAddress();\n userAddress = await WalletAbstractionService.getUserAbstractedWalletAddress(\n walletAddress,\n param,\n this.hubProvider,\n );\n }\n\n const [unstakingResult, configResult] = await Promise.all([\n this.getUnstakingInfo(userAddress),\n this.getStakingConfig(),\n ]);\n\n if (!unstakingResult.ok) {\n return unstakingResult;\n }\n\n if (!configResult.ok) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: configResult.error,\n },\n };\n }\n\n const config = configResult.value;\n const requestsWithPenalty: UnstakeRequestWithPenalty[] = unstakingResult.value.userUnstakeSodaRequests.map(\n userInfo => {\n const penaltyInfo = this.calculatePenalty(userInfo.request.startTime, config);\n const penaltyAmount = (userInfo.request.amount * penaltyInfo.penalty) / 100n; // Convert from basis points\n const claimableAmount = userInfo.request.amount - penaltyAmount;\n\n return {\n ...userInfo,\n penalty: penaltyAmount,\n penaltyPercentage: penaltyInfo.penaltyPercentage,\n claimableAmount,\n };\n },\n );\n\n return {\n ok: true,\n value: {\n ...unstakingResult.value,\n requestsWithPenalty,\n },\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get instant unstake ratio for a given amount\n * @param amount - The amount of xSoda to estimate instant unstake for\n * @returns Promise<Result<bigint, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getInstantUnstakeRatio(amount: bigint): Promise<Result<bigint, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n const hubConfig = getHubChainConfig();\n const stakingRouter = hubConfig.addresses.stakingRouter;\n\n const ratio = await StakingLogic.estimateInstantUnstake(stakingRouter, amount, this.hubProvider.publicClient);\n\n return {\n ok: true,\n value: ratio,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get converted assets amount for xSODA shares\n * @param amount - The amount of xSoda shares to convert\n * @returns Promise<Result<bigint, StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getConvertedAssets(amount: bigint): Promise<Result<bigint, StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n const hubConfig = getHubChainConfig();\n const xSoda = hubConfig.addresses.xSoda;\n\n const convertedAmount = await StakingLogic.convertXSodaSharesToSoda(xSoda, amount, this.hubProvider.publicClient);\n\n return {\n ok: true,\n value: convertedAmount,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Get stake ratio for a given amount (xSoda amount and preview deposit)\n * @param amount - The amount of SODA to estimate stake for\n * @returns Promise<Result<[bigint, bigint], StakingError<'INFO_FETCH_FAILED'>>>\n */\n public async getStakeRatio(amount: bigint): Promise<Result<[bigint, bigint], StakingError<'INFO_FETCH_FAILED'>>> {\n try {\n const hubConfig = getHubChainConfig();\n const stakingRouter = hubConfig.addresses.stakingRouter;\n\n const [xSodaAmount, previewDepositAmount] = await StakingLogic.estimateXSodaAmount(\n stakingRouter,\n amount,\n this.hubProvider.publicClient,\n );\n\n return {\n ok: true,\n value: [xSodaAmount, previewDepositAmount],\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'INFO_FETCH_FAILED',\n error: error,\n },\n };\n }\n }\n\n /**\n * Helper method to get xSoda balance for a user\n * @param xSoda - The xSoda token contract address\n * @param userAddress - The user's address\n * @returns Promise<bigint>\n */\n private async getXSodaBalance(xSoda: Address, userAddress: Address): Promise<bigint> {\n return this.hubProvider.publicClient.readContract({\n address: xSoda,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [userAddress],\n });\n }\n}\n","import type { Abi } from 'viem';\n\nexport const icxSwapAbi = [\n {\n type: 'constructor',\n inputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'ICX',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC20',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'UPGRADE_INTERFACE_VERSION',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'string',\n internalType: 'string',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getImplementation',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'initialize',\n inputs: [],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'owner',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'address',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'pendingMigrations',\n inputs: [\n {\n name: '',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'user',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'timestamp',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'reverseSwap',\n inputs: [\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'reverseSwapEnabled',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'sodax',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'address',\n internalType: 'contract IERC20',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'swap',\n inputs: [\n {\n name: 'amount',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'to',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'Initialized',\n inputs: [\n {\n name: 'version',\n type: 'uint64',\n indexed: false,\n internalType: 'uint64',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferStarted',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'OwnershipTransferred',\n inputs: [\n {\n name: 'previousOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'newOwner',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'PendingMigrationApproved',\n inputs: [\n {\n name: 'index',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'PendingMigrationCreated',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'amount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'index',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ReverseSwap',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'sodaxAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'ICXAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ReverseSwapToggled',\n inputs: [\n {\n name: 'enabled',\n type: 'bool',\n indexed: false,\n internalType: 'bool',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Swap',\n inputs: [\n {\n name: 'user',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'ICXAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'sodaxAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Upgraded',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AddressEmptyCode',\n inputs: [\n {\n name: 'target',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967InvalidImplementation',\n inputs: [\n {\n name: 'implementation',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ERC1967NonPayable',\n inputs: [],\n },\n {\n type: 'error',\n name: 'FailedCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidInitialization',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotInitializing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'OwnableInvalidOwner',\n inputs: [\n {\n name: 'owner',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'OwnableUnauthorizedAccount',\n inputs: [\n {\n name: 'account',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'ReentrancyGuardReentrantCall',\n inputs: [],\n },\n {\n type: 'error',\n name: 'SafeERC20FailedOperation',\n inputs: [\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n ],\n },\n {\n type: 'error',\n name: 'UUPSUnauthorizedCallContext',\n inputs: [],\n },\n {\n type: 'error',\n name: 'UUPSUnsupportedProxiableUUID',\n inputs: [\n {\n name: 'slot',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n },\n] as const satisfies Abi;\n\nexport type IcxSwapAbi = typeof icxSwapAbi;\n","import { type Address, type Hex, encodeFunctionData } from 'viem';\nimport { erc20Abi } from '../shared/abis/index.js';\nimport type { EvmContractCall, IcxTokenType } from '../shared/types.js';\nimport { encodeContractCalls, Erc20Service, EvmAssetManagerService, type EvmHubProvider } from '../index.js';\nimport { icxSwapAbi } from '../shared/abis/icxSwap.abi.js';\nimport invariant from 'tiny-invariant';\nimport { ICON_MAINNET_CHAIN_ID, type IconEoaAddress, type IconAddress } from '@sodax/types';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\n\nexport type IcxMigrateParams = {\n address: IcxTokenType; // The ICON address of the ICX or wICX token to migrate\n amount: bigint; // The amount of ICX or wICX to migrate\n to: Address; // The address that will receive the migrated assets\n};\n\nexport type IcxCreateRevertMigrationParams = {\n amount: bigint; // The amount of wICX to migrate\n to: IconEoaAddress; // The address that will receive the migrated SODA tokens as ICX\n};\n\nexport type IcxRevertMigrationParams = {\n wICX: IconAddress; // The ICON address of the wICX token\n amount: bigint; // The amount of SODA tokens to migrate to ICX\n userWallet: Address; // The hub wallet address that will migrate assets\n to: Hex; // The Icon address that will receive the migrated SODA tokens as ICX\n};\n\nexport type IcxMigrationServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n configService: ConfigService;\n};\n\n/**\n * Service for handling ICX migration operations on the hub chain.\n * Provides functionality to migrate wICX tokens from ICON to the hub chain.\n */\nexport class IcxMigrationService {\n private readonly hubProvider: EvmHubProvider;\n private readonly configService: ConfigService;\n\n constructor({ hubProvider, configService }: IcxMigrationServiceConstructorParams) {\n this.hubProvider = hubProvider;\n this.configService = configService;\n }\n\n /**\n * Retrieves the available amount of SODA tokens in the ICX migration contract.\n * This represents the amount of tokens available for migration.\n *\n * @returns The available balance of SODA tokens in the migration contract\n */\n public async getAvailableAmount(): Promise<bigint> {\n const balance = await this.hubProvider.publicClient.readContract({\n address: this.hubProvider.chainConfig.addresses.sodaToken,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [this.hubProvider.chainConfig.addresses.icxMigration],\n });\n\n return balance;\n }\n\n /**\n * Generates transaction data for migrating wICX tokens from ICON to the hub chain.\n * This method creates the necessary contract calls to:\n * 1. Approve the migration contract to spend the wICX tokens\n * 2. Execute the migration swap\n *\n * @param params - The migration parameters including token address, amount, and recipient\n * @returns Encoded transaction data for the migration operation\n * @throws Will throw an error if the hub asset configuration is not found\n */\n public migrateData(params: IcxMigrateParams): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(ICON_MAINNET_CHAIN_ID, params.address);\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${params.address}`);\n\n calls.push(\n Erc20Service.encodeApprove(assetConfig.asset, this.hubProvider.chainConfig.addresses.icxMigration, params.amount),\n );\n calls.push(this.encodeMigrate(params.amount, params.to));\n return encodeContractCalls(calls);\n }\n\n /**\n * Generates transaction data for migrating back tokens to the ICON chain.\n * @param params - The migration parameters including token address, amount, and recipient\n * @returns Encoded transaction data for the migration operation\n * @throws Will throw an error if the hub asset configuration is not found\n */\n public revertMigration(params: IcxRevertMigrationParams): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(ICON_MAINNET_CHAIN_ID, params.wICX);\n invariant(assetConfig, `hub asset not found for spoke chain token (token): ${params.wICX}`);\n\n calls.push(\n Erc20Service.encodeApprove(\n this.hubProvider.chainConfig.addresses.sodaToken,\n this.hubProvider.chainConfig.addresses.icxMigration,\n params.amount,\n ),\n );\n calls.push(this.encodeRevertMigration(params.amount, params.userWallet));\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n assetConfig.asset,\n params.to,\n params.amount,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n return encodeContractCalls(calls);\n }\n\n /**\n * Encodes a migration transaction for the ICX swap contract.\n * This creates the contract call data for swapping wICX tokens to SODA tokens.\n *\n * @param amount - The amount of wICX tokens to migrate\n * @param to - The address that will receive the migrated SODA tokens\n * @returns The encoded contract call for the migration operation\n */\n public encodeMigrate(amount: bigint, to: Address): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.icxMigration,\n value: 0n,\n data: encodeFunctionData({\n abi: icxSwapAbi,\n functionName: 'swap',\n args: [amount, to],\n }),\n };\n }\n\n /**\n * Encodes a revert migration transaction for the ICX swap contract.\n * This creates the contract call data for swapping SODA tokens to wICX tokens.\n *\n * @param amount - The amount of wICX tokens to migrate\n * @param to - The address that will receive the migrated SODA tokens\n * @returns The encoded contract call for the migration operation\n */\n public encodeRevertMigration(amount: bigint, to: Address): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.icxMigration,\n value: 0n,\n data: encodeFunctionData({\n abi: icxSwapAbi,\n functionName: 'reverseSwap',\n args: [amount, to],\n }),\n };\n }\n}\n","import { isLegacybnUSDChainId, isLegacybnUSDToken, isNewbnUSDChainId, isNewbnUSDToken } from '../shared/constants.js';\nimport invariant from 'tiny-invariant';\nimport {\n type EvmHubProvider,\n IconSpokeProvider,\n IcxMigrationService,\n SpokeService,\n type IcxMigrateParams,\n type Result,\n type TxReturnType,\n relayTxAndWaitPacket,\n DEFAULT_RELAY_TX_TIMEOUT,\n SonicSpokeProvider,\n SonicSpokeService,\n type IcxCreateRevertMigrationParams,\n type SpokeProvider,\n Erc20Service,\n encodeAddress,\n type RelayError,\n isIconAddress,\n BnUSDMigrationService,\n type GetSpokeDepositParamsType,\n BalnSwapService,\n type BalnMigrateParams,\n type UnifiedBnUSDMigrateParams,\n isIcxMigrateParams,\n isBalnMigrateParams,\n isUnifiedBnUSDMigrateParams,\n EvmSpokeProvider,\n isIcxCreateRevertMigrationParams,\n type RelayExtraData,\n SolanaSpokeProvider,\n deriveUserWalletAddress,\n waitUntilIntentExecuted,\n StellarSpokeProvider,\n type IconContractAddress,\n} from '../index.js';\nimport {\n ICON_MAINNET_CHAIN_ID,\n SONIC_MAINNET_CHAIN_ID,\n type Address,\n getIntentRelayChainId,\n type Hex,\n type HttpUrl,\n type IconAddress,\n} from '@sodax/types';\nimport { isAddress } from 'viem';\nimport { StellarSpokeService } from '../shared/services/spoke/StellarSpokeService.js';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\n\nexport type GetMigrationFailedPayload<T extends MigrationErrorCode> = T extends 'CREATE_MIGRATION_INTENT_FAILED'\n ? IcxMigrateParams | UnifiedBnUSDMigrateParams | BalnMigrateParams\n : T extends 'CREATE_REVERT_MIGRATION_INTENT_FAILED'\n ? IcxCreateRevertMigrationParams\n : T extends 'REVERT_MIGRATION_FAILED'\n ? IcxCreateRevertMigrationParams | UnifiedBnUSDMigrateParams\n : T extends 'MIGRATION_FAILED'\n ? IcxMigrateParams | UnifiedBnUSDMigrateParams | BalnMigrateParams\n : never;\n\nexport type MigrationFailedErrorData<T extends MigrationErrorCode> = {\n payload: GetMigrationFailedPayload<T>;\n error: unknown;\n};\n\nexport type MigrationErrorCode =\n | 'MIGRATION_FAILED'\n | 'CREATE_MIGRATION_INTENT_FAILED'\n | 'CREATE_REVERT_MIGRATION_INTENT_FAILED'\n | 'REVERT_MIGRATION_FAILED';\n\nexport type MigrationErrorData<T extends MigrationErrorCode> = T extends 'CREATE_MIGRATION_INTENT_FAILED'\n ? MigrationFailedErrorData<T>\n : T extends 'CREATE_REVERT_MIGRATION_INTENT_FAILED'\n ? MigrationFailedErrorData<T>\n : T extends 'REVERT_MIGRATION_FAILED'\n ? MigrationFailedErrorData<T>\n : T extends 'MIGRATION_FAILED'\n ? MigrationFailedErrorData<T>\n : never;\n\nexport type MigrationError<T extends MigrationErrorCode> = {\n code: T;\n data: MigrationErrorData<T>;\n};\n\nexport type MigrationAction = 'migrate' | 'revert';\n\nexport type MigrationParams = IcxMigrateParams | UnifiedBnUSDMigrateParams | BalnMigrateParams;\nexport type MigrationRevertParams = IcxCreateRevertMigrationParams | UnifiedBnUSDMigrateParams;\n\nexport const SupportedMigrationTokens = ['ICX', 'bnUSD', 'BALN'] as const;\nexport type MigrationTokens = (typeof SupportedMigrationTokens)[number];\n\nexport type MigrationServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n configService: ConfigService;\n relayerApiEndpoint: HttpUrl;\n};\n\nexport class MigrationService {\n readonly icxMigration: IcxMigrationService;\n readonly bnUSDMigrationService: BnUSDMigrationService;\n readonly balnSwapService: BalnSwapService;\n readonly hubProvider: EvmHubProvider;\n readonly relayerApiEndpoint: HttpUrl;\n readonly configService: ConfigService;\n\n constructor({ relayerApiEndpoint, hubProvider, configService }: MigrationServiceConstructorParams) {\n this.hubProvider = hubProvider;\n this.icxMigration = new IcxMigrationService({ hubProvider, configService });\n this.bnUSDMigrationService = new BnUSDMigrationService({ hubProvider, configService });\n this.balnSwapService = new BalnSwapService({ hubProvider });\n this.relayerApiEndpoint = relayerApiEndpoint;\n this.configService = configService;\n }\n\n /**\n * Checks if the allowance is valid for the migration transaction.\n * @param params - The parameters for the migration transaction.\n * @param spokeProvider - The spoke provider.\n * @returns {Promise<Result<boolean>>} - Returns the result of the allowance check or error\n *\n * @example\n * const result = await migrationService.isAllowanceValid(\n * {\n * token: 'ICX', // Token to migrate\n * icx: 'cx...', // Address of the ICX or wICX token to migrate\n * amount: 1000n, // Amount to migrate (in ICX decimals, usually 18)\n * to: '0x...', // Address to receive the migrated SODA tokens\n * },\n * 'migrate',\n * spokeProvider, // IconSpokeProvider instance\n * );\n *\n */\n public async isAllowanceValid<S extends SpokeProvider>(\n params: MigrationParams | MigrationRevertParams,\n action: MigrationAction,\n spokeProvider: S,\n ): Promise<Result<boolean>> {\n try {\n if (action === 'migrate') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(isAddress(params.to) || isIconAddress(params.to), 'To address is required');\n invariant(\n isIcxMigrateParams(params) || isBalnMigrateParams(params) || isUnifiedBnUSDMigrateParams(params),\n 'Invalid params',\n );\n\n if (spokeProvider instanceof IconSpokeProvider && (isIcxMigrateParams(params) || isBalnMigrateParams(params))) {\n // icx and baln migration does not require allowance check since they originate from icon, thus just return true\n return {\n ok: true,\n value: true,\n };\n }\n\n // bnUSD only requires allowance check for EVM spoke chains\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider.chainConfig.chain.type === 'EVM') {\n const evmSpokeProvider = spokeProvider as EvmSpokeProvider | SonicSpokeProvider;\n return await Erc20Service.isAllowanceValid(\n params.srcbnUSD as Address,\n params.amount,\n await evmSpokeProvider.walletProvider.getWalletAddress(),\n evmSpokeProvider instanceof EvmSpokeProvider\n ? evmSpokeProvider.chainConfig.addresses.assetManager\n : (evmSpokeProvider.chainConfig.bnUSD as Address),\n evmSpokeProvider,\n );\n }\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider instanceof StellarSpokeProvider) {\n return {\n ok: true,\n value: await StellarSpokeService.hasSufficientTrustline(params.srcbnUSD, params.amount, spokeProvider),\n };\n }\n\n return {\n ok: true,\n value: true,\n };\n }\n if (action === 'revert') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.to.length > 0, 'To address is required');\n invariant(isIcxCreateRevertMigrationParams(params) || isUnifiedBnUSDMigrateParams(params), 'Invalid params');\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider.chainConfig.chain.type === 'EVM') {\n const evmSpokeProvider = spokeProvider as EvmSpokeProvider | SonicSpokeProvider;\n let spender: Address;\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n if (spokeProvider instanceof SonicSpokeProvider) {\n spender = await SonicSpokeService.getUserRouter(wallet as `0x${string}`, spokeProvider);\n } else {\n spender = evmSpokeProvider.chainConfig.addresses.assetManager as Address;\n }\n return await Erc20Service.isAllowanceValid(\n params.srcbnUSD as Address,\n params.amount,\n wallet as `0x${string}`,\n spender,\n evmSpokeProvider,\n );\n }\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider.chainConfig.chain.type === 'EVM') {\n const evmSpokeProvider = spokeProvider as EvmSpokeProvider | SonicSpokeProvider;\n let spender: Address;\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n if (spokeProvider instanceof SonicSpokeProvider) {\n spender = await SonicSpokeService.getUserRouter(wallet as `0x${string}`, spokeProvider);\n } else {\n spender = evmSpokeProvider.chainConfig.addresses.assetManager as Address;\n }\n return await Erc20Service.isAllowanceValid(\n params.srcbnUSD as Address,\n params.amount,\n wallet as `0x${string}`,\n spender,\n evmSpokeProvider,\n );\n }\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider instanceof StellarSpokeProvider) {\n return {\n ok: true,\n value: await StellarSpokeService.hasSufficientTrustline(params.srcbnUSD, params.amount, spokeProvider),\n };\n }\n\n if (spokeProvider instanceof SonicSpokeProvider && isIcxCreateRevertMigrationParams(params)) {\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n const userRouter = await SonicSpokeService.getUserRouter(wallet, spokeProvider);\n\n return await Erc20Service.isAllowanceValid(\n this.hubProvider.chainConfig.addresses.sodaToken,\n params.amount,\n wallet,\n userRouter,\n spokeProvider,\n );\n }\n }\n\n return {\n ok: false,\n error: new Error('Invalid action'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Approves the amount spending for the revert migration transaction.\n * @param params - The parameters for the revert migration transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction hash instead of the transaction receipt\n * @returns {Promise<Result<TxReturnType<S, R>>>} - Returns the raw transaction payload or transaction hash\n *\n * @example\n * const result = await migrationService.approve(\n * {\n * amount: 1000n, // Amount of SODA tokens to revert\n * to: 'hx...', // Icon Address to receive the reverted SODA tokens as ICX\n * },\n * 'revert',\n * spokeProvider, // SonicSpokeProvider instance\n * true // Optional raw flag to return the raw transaction hash instead of the transaction receipt\n * );\n *\n */\n public async approve<S extends SpokeProvider, R extends boolean = false>(\n params: IcxCreateRevertMigrationParams | UnifiedBnUSDMigrateParams,\n action: MigrationAction,\n spokeProvider: S,\n raw?: R,\n ): Promise<Result<TxReturnType<S, R>>> {\n try {\n if (action === 'migrate') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.to.length > 0, 'To address is required');\n invariant(isUnifiedBnUSDMigrateParams(params), 'Invalid params');\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider.chainConfig.chain.type === 'EVM') {\n const evmSpokeProvider = spokeProvider as EvmSpokeProvider | SonicSpokeProvider;\n const result = await Erc20Service.approve(\n params.srcbnUSD as Address,\n params.amount,\n evmSpokeProvider instanceof EvmSpokeProvider\n ? evmSpokeProvider.chainConfig.addresses.assetManager\n : (evmSpokeProvider.chainConfig.bnUSD as Address),\n evmSpokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result satisfies TxReturnType<EvmSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider instanceof StellarSpokeProvider) {\n const result = await StellarSpokeService.requestTrustline(params.srcbnUSD, params.amount, spokeProvider, raw);\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n return {\n ok: false,\n error: new Error('Invalid params for migrate action'),\n };\n }\n if (action === 'revert') {\n invariant(params.amount > 0n, 'Amount must be greater than 0');\n invariant(params.to.length > 0, 'To address is required');\n invariant(isIcxCreateRevertMigrationParams(params) || isUnifiedBnUSDMigrateParams(params), 'Invalid params');\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider.chainConfig.chain.type === 'EVM') {\n const evmSpokeProvider = spokeProvider as EvmSpokeProvider | SonicSpokeProvider;\n let spender: Address;\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n if (spokeProvider instanceof SonicSpokeProvider) {\n spender = await SonicSpokeService.getUserRouter(wallet as `0x${string}`, spokeProvider);\n } else {\n spender = evmSpokeProvider.chainConfig.addresses.assetManager as Address;\n }\n const result = await Erc20Service.approve(\n params.srcbnUSD as Address,\n params.amount,\n spender,\n evmSpokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result satisfies TxReturnType<EvmSpokeProvider | SonicSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (isUnifiedBnUSDMigrateParams(params) && spokeProvider instanceof StellarSpokeProvider) {\n const result = await StellarSpokeService.requestTrustline(params.srcbnUSD, params.amount, spokeProvider, raw);\n return {\n ok: true,\n value: result satisfies TxReturnType<StellarSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n if (spokeProvider instanceof SonicSpokeProvider && isIcxCreateRevertMigrationParams(params)) {\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n const userRouter = await SonicSpokeService.getUserRouter(wallet, spokeProvider);\n\n const result = await Erc20Service.approve(\n this.hubProvider.chainConfig.addresses.sodaToken,\n params.amount,\n userRouter,\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: result satisfies TxReturnType<SonicSpokeProvider, R> as TxReturnType<S, R>,\n };\n }\n\n return {\n ok: false,\n error: new Error('Invalid params or chain type for revert action'),\n };\n }\n\n return {\n ok: false,\n error: new Error('Invalid action'),\n };\n } catch (error) {\n return {\n ok: false,\n error: error,\n };\n }\n }\n\n /**\n * Migrates bnUSD tokens between legacy and new formats across supported spoke chains via the hub chain (sonic).\n * Handles both legacy-to-new and new-to-legacy bnUSD migrations, enforcing validation and relaying the transaction.\n *\n * @param params - Migration parameters, including source/destination chain IDs, token addresses, amount, and recipient.\n * @param spokeProvider - The SpokeProvider instance for the source chain.\n * @param timeout - Optional timeout in milliseconds for the relay operation (default: 60 seconds).\n * @param unchecked - Optional flag to skip validation checks (default: false).\n * @returns {Promise<Result<[string, Hex], MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError>>}\n * Result containing a tuple: [spokeTxHash, hubTxHash] if successful, or an error describing the failure.\n *\n * @example\n * // Migrate legacy bnUSD to new bnUSD\n * const result = await sodax.migration.migratebnUSD({\n * srcChainId: '0x1.icon', // Source chain ID (legacy)\n * dstChainId: 'sonic', // Destination chain ID (new)\n * srcbnUSD: 'cx...', // Legacy bnUSD token address\n * dstbnUSD: '0x...', // New bnUSD token address\n * amount: 1000n, // Amount to migrate\n * to: '0x...', // Recipient address on destination chain\n * }, iconSpokeProvider);\n *\n * // Reverse migration: new bnUSD to legacy bnUSD\n * const result = await sodax.migration.migratebnUSD({\n * srcChainId: 'sonic', // Source chain ID (new)\n * dstChainId: '0x1.icon', // Destination chain ID (legacy)\n * srcbnUSD: '0x...', // New bnUSD token address\n * dstbnUSD: 'cx...', // Legacy bnUSD token address\n * amount: 1000n, // Amount to migrate\n * to: 'hx...', // Recipient address on destination chain\n * }, sonicSpokeProvider);\n *\n * if (result.ok) {\n * // result.value is a tuple: [spokeTxHash, hubTxHash]\n * const [spokeTxHash, hubTxHash] = result.value;\n * console.log('[migrateBnUSD] hubTxHash', hubTxHash);\n * console.log('[migrateBnUSD] spokeTxHash', spokeTxHash);\n * } else {\n * // Handle migration error\n * console.error('[migrateBnUSD] error', result.error);\n * }\n */\n async migratebnUSD(\n params: UnifiedBnUSDMigrateParams,\n spokeProvider: SpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n unchecked = false,\n ): Promise<\n Result<\n [string, Hex],\n MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError\n >\n > {\n try {\n const intentResult = await this.createMigratebnUSDIntent(params, spokeProvider, unchecked);\n\n if (!intentResult.ok) {\n return {\n ok: false,\n error: intentResult.error,\n };\n }\n\n const [spokeTxHash, extraData] = intentResult.value;\n\n // verify the spoke tx hash exists on chain\n const verifyTxHashResult = await SpokeService.verifyTxHash(spokeTxHash, spokeProvider);\n\n if (!verifyTxHashResult.ok) {\n return {\n ok: false,\n error: {\n code: 'CREATE_MIGRATION_INTENT_FAILED',\n data: {\n payload: params,\n error: verifyTxHashResult.error,\n },\n },\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n spokeTxHash,\n spokeProvider instanceof SolanaSpokeProvider ? extraData : undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n if (!(params.srcChainId === SONIC_MAINNET_CHAIN_ID || params.dstChainId === SONIC_MAINNET_CHAIN_ID)) {\n await waitUntilIntentExecuted({\n intentRelayChainId: getIntentRelayChainId(SONIC_MAINNET_CHAIN_ID).toString(),\n spokeTxHash: packetResult.value.dst_tx_hash,\n timeout: timeout,\n apiUrl: this.relayerApiEndpoint,\n });\n }\n\n return { ok: true, value: [spokeTxHash, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'MIGRATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Migrates ICX tokens to SODA tokens on the hub chain (sonic).\n * This function handles the migration of ICX tokens to SODA tokens.\n *\n * @param params - The parameters for the migration transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError>>}\n * Returns a Result containing a tuple of [spokeTxHash, hubTxHash] if successful,\n * or an error describing why the migration or relay failed.\n *\n * @example\n * const result = await migrationService.migrateIcxToSoda(\n * {\n * address: 'cx...', // Address of the ICX or wICX token to migrate\n * amount: 1000n, // Amount to migrate (in ICX decimals, usually 18)\n * to: '0x...', // Address to receive the migrated SODA tokens (i.e. the hub chain address)\n * },\n * spokeProvider, // IconSpokeProvider instance\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Migration transaction hashes:', { spokeTxHash, hubTxHash });\n */\n async migrateIcxToSoda(\n params: IcxMigrateParams,\n spokeProvider: IconSpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [Hex, Hex],\n MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError\n >\n > {\n try {\n const txResult = await this.createMigrateIcxToSodaIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: txResult.error,\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'MIGRATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Creates a revert migration (SODA to ICX) intent and submits (relays) it to the spoke chain.\n * @param params - The parameters for the revert migration transaction.\n * @param spokeProvider - The SonicSpokeProvider instance.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n *\n * @returns {Promise<Result<[Hex, Hex], MigrationError<'REVERT_MIGRATION_FAILED'> | MigrationError<'CREATE_REVERT_MIGRATION_INTENT_FAILED'> | RelayError>>}\n * Returns a Result containing a tuple of [hubTxHash, spokeTxHash] if successful,\n * or an error describing why the revert migration or relay failed.\n *\n *\n * @example\n * const result = await migrationService.revertMigrateSodaToIcx(\n * {\n * amount: 1000n, // Amount of SODA tokens to revert\n * to: 'hx...', // Icon Address to receive the reverted SODA tokens as ICX\n * },\n * spokeProvider, // SonicSpokeProvider instance\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * hubTxHash, // transaction hash on the hub chain\n * spokeTxHash, // transaction hash on the spoke chain (i.e. the transaction that was relayed to the spoke)\n * ] = result.value;\n * console.log('Revert migration transaction hashes:', { hubTxHash, spokeTxHash });\n */\n async revertMigrateSodaToIcx(\n params: Omit<IcxCreateRevertMigrationParams, 'wICX'>,\n spokeProvider: SonicSpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [Hex, Hex],\n MigrationError<'REVERT_MIGRATION_FAILED'> | MigrationError<'CREATE_REVERT_MIGRATION_INTENT_FAILED'> | RelayError\n >\n > {\n try {\n const txResult = await this.createRevertSodaToIcxMigrationIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return txResult;\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'REVERT_MIGRATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Migrates BALN tokens to SODA tokens on the hub chain (sonic).\n * This function handles the migration of BALN tokens to SODA tokens.\n *\n * @param params - The parameters for the migration transaction.\n * @param spokeProvider - The spoke provider.\n * @param timeout - The timeout in milliseconds for the transaction. Default is 60 seconds.\n * @returns {Promise<Result<[Hex, Hex], MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError>>}\n * Returns a Result containing a tuple of [spokeTxHash, hubTxHash] if successful,\n * or an error describing why the migration or relay failed.\n *\n * @example\n * const result = await migrationService.migrateBaln(\n * {\n * amount: 1000n, // The amount of BALN tokens to swap\n * lockupPeriod: SIX_MONTHS, // The lockup period for the swap (see LockupPeriod type)\n * to: '0x...', // The hub (sonic) chain address that will receive the swapped BALN tokens\n * stake: true, // Whether to stake the BALN tokens\n * },\n * spokeProvider, // IconSpokeProvider instance\n * 30000 // Optional timeout in milliseconds (default: 60000, i.e. 60 seconds)\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n *\n * const [\n * spokeTxHash, // transaction hash on the spoke chain\n * hubTxHash, // transaction hash on the hub chain (i.e. the transaction that was relayed to the hub)\n * ] = result.value;\n * console.log('Migration transaction hashes:', { spokeTxHash, hubTxHash });\n */\n async migrateBaln(\n params: BalnMigrateParams,\n spokeProvider: IconSpokeProvider,\n timeout = DEFAULT_RELAY_TX_TIMEOUT,\n ): Promise<\n Result<\n [Hex, Hex],\n MigrationError<'MIGRATION_FAILED'> | MigrationError<'CREATE_MIGRATION_INTENT_FAILED'> | RelayError\n >\n > {\n try {\n const txResult = await this.createMigrateBalnIntent(params, spokeProvider);\n\n if (!txResult.ok) {\n return {\n ok: false,\n error: txResult.error,\n };\n }\n\n const packetResult = await relayTxAndWaitPacket(\n txResult.value,\n undefined,\n spokeProvider,\n this.relayerApiEndpoint,\n timeout,\n );\n\n if (!packetResult.ok) {\n return packetResult;\n }\n\n return { ok: true, value: [txResult.value, packetResult.value.dst_tx_hash as Hex] };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'MIGRATION_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Creates a BALN migration intent on spoke chain (icon).\n *\n * @param params - The parameters for the BALN migration transaction.\n * @param spokeProvider - The spoke provider.\n * @param raw - Whether to return the raw transaction hash instead of the transaction receipt\n * @returns {Promise<Result<TxReturnType<IconSpokeProvider, R>, MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>> } - Returns the raw transaction payload or transaction hash\n *\n * @example\n * const result = await migrationService.createMigrateBalnIntent(\n * {\n * amount: 1000n, // The amount of BALN tokens to swap\n * lockupPeriod: SIX_MONTHS, // The lockup period for the swap (see LockupPeriod type)\n * to: '0x...', // The hub (sonic) chain address that will receive the swapped BALN tokens\n * stake: true, // Whether to stake the BALN tokens\n * },\n * spokeProvider, // IconSpokeProvider instance\n * true // Optional raw flag to return the raw transaction hash instead of the transaction receipt\n * );\n *\n */\n async createMigrateBalnIntent<R extends boolean = false>(\n params: BalnMigrateParams,\n spokeProvider: IconSpokeProvider,\n raw?: R,\n ): Promise<Result<TxReturnType<IconSpokeProvider, R>, MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>> {\n try {\n const balnToken = this.configService.spokeChainConfig[ICON_MAINNET_CHAIN_ID]?.supportedTokens.BALN?.address;\n invariant(balnToken, 'BALN token not found');\n\n const migrationData = this.balnSwapService.swapData(balnToken as IconContractAddress, params, this.configService);\n\n const txResult = await SpokeService.deposit(\n {\n from: await spokeProvider.walletProvider.getWalletAddress(),\n token: balnToken,\n amount: params.amount,\n data: migrationData,\n } as GetSpokeDepositParamsType<IconSpokeProvider>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<IconSpokeProvider, R>,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATE_MIGRATION_INTENT_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Creates a bnUSD migration or reverse migration (legacy bnUSD to new bnUSD or vice versa) intent on a spoke chain.\n *\n * This function prepares the transaction data for migrating legacy bnUSD to new bnUSD,\n * or for reverting (migrating new bnUSD back to legacy bnUSD), depending on the provided parameters.\n * It performs validation on chain IDs and token addresses unless `unchecked` is set to true.\n *\n * @param params - The parameters for the bnUSD migration or reverse migration transaction.\n * @param spokeProvider - The spoke provider instance for the source chain.\n * @param unchecked - If true, skips input validation (use with caution).\n * @param raw - If true, returns the raw transaction hash instead of the transaction receipt.\n * @returns {Promise<Result<TxReturnType<S, R>, MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>>}\n * Returns a Result containing the transaction payload or hash, or an error if creation failed.\n *\n * @example\n * // Migrate legacy bnUSD to new bnUSD\n * const result = await migrationService.createMigratebnUSDIntent(\n * {\n * srcChainId: '0x1.icon', // Source chain ID (legacy bnUSD chain)\n * dstChainId: 'sonic', // Destination chain ID (new bnUSD chain)\n * srcbnUSD: 'cx...', // Legacy bnUSD token address\n * dstbnUSD: '0x...', // New bnUSD token address\n * amount: 1000n, // Amount to migrate\n * to: '0x...', // Recipient address on destination chain\n * } satisfies UnifiedBnUSDMigrateParams,\n * spokeProvider, // SpokeProvider instance\n * false, // Optional unchecked flag (validation is skipped)\n * true // Optional raw flag\n * );\n *\n * // Reverse migration: new bnUSD to legacy bnUSD\n * const result = await migrationService.createMigratebnUSDIntent(\n * {\n * srcChainId: 'sonic', // Source chain ID (new bnUSD chain)\n * dstChainId: '0x1.icon', // Destination chain ID (legacy bnUSD chain)\n * srcbnUSD: '0x...', // New bnUSD token address\n * dstbnUSD: 'cx...', // Legacy bnUSD token address\n * amount: 1000n, // Amount to migrate\n * to: 'hx...', // Recipient address on destination chain\n * } satisfies UnifiedBnUSDMigrateParams,\n * spokeProvider\n * );\n */\n async createMigratebnUSDIntent<S extends SpokeProvider, R extends boolean = false>(\n params: UnifiedBnUSDMigrateParams,\n spokeProvider: S,\n unchecked = false,\n raw?: R,\n ): Promise<Result<[TxReturnType<S, R>, RelayExtraData], MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>> {\n try {\n if (!unchecked) {\n invariant(this.configService.isValidSpokeChainId(params.srcChainId), 'Invalid spoke source chain ID');\n invariant(this.configService.isValidSpokeChainId(params.dstChainId), 'Invalid spoke destination chain ID');\n invariant(params.srcbnUSD.length > 0, 'Legacy bnUSD token address is required');\n invariant(params.dstbnUSD.length > 0, 'New bnUSD token address is required');\n invariant(params.amount > 0, 'Amount must be greater than 0');\n invariant(params.to.length > 0, 'Recipient address is required');\n invariant(\n !(isLegacybnUSDToken(params.srcbnUSD) && isLegacybnUSDToken(params.dstbnUSD)),\n 'srcbnUSD and dstbnUSD cannot both be legacy bnUSD tokens',\n );\n }\n\n let migrationData: Hex;\n if (isLegacybnUSDToken(params.srcbnUSD)) {\n // migration from legacy bnUSD to new bnUSD\n if (!unchecked) {\n invariant(\n isLegacybnUSDChainId(params.srcChainId),\n 'srcChainId must be a legacy bnUSD chain (icon, sui, stellar) if srcbnUSD is a legacy bnUSD token',\n );\n invariant(\n isNewbnUSDChainId(params.dstChainId),\n 'dstChainId must be a new bnUSD chain (all spoke chains besides Icon) if dstbnUSD is a legacy bnUSD token',\n );\n }\n\n migrationData = this.bnUSDMigrationService.migrateData({\n srcChainId: params.srcChainId,\n legacybnUSD: params.srcbnUSD,\n newbnUSD: params.dstbnUSD,\n dstChainId: params.dstChainId,\n amount: params.amount,\n to: encodeAddress(params.dstChainId, params.to),\n });\n } else if (isLegacybnUSDToken(params.dstbnUSD)) {\n // reverse migration from new bnUSD to legacy bnUSD\n if (!unchecked) {\n invariant(\n isLegacybnUSDChainId(params.dstChainId),\n 'dstChainId must be a legacy bnUSD chain (sui, stellar, icon) if dstbnUSD is a legacy bnUSD token',\n );\n invariant(\n isNewbnUSDToken(params.srcbnUSD),\n 'srcbnUSD must be a new bnUSD token if dstbnUSD is a legacy bnUSD token',\n );\n invariant(\n isNewbnUSDChainId(params.srcChainId),\n 'srcChainId must be a new bnUSD chain (all spoke chains besides Icon) if srcbnUSD is a new bnUSD token',\n );\n }\n\n migrationData = this.bnUSDMigrationService.revertMigrationData({\n srcChainId: params.srcChainId,\n legacybnUSD: params.dstbnUSD,\n newbnUSD: params.srcbnUSD,\n dstChainId: params.dstChainId,\n amount: params.amount,\n to: encodeAddress(params.dstChainId, params.to),\n });\n } else {\n throw new Error('srcbnUSD or dstbnUSD must be a legacy bnUSD token');\n }\n\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n const creatorHubWalletAddress = await deriveUserWalletAddress(spokeProvider, this.hubProvider, walletAddress);\n\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n token: params.srcbnUSD,\n amount: params.amount,\n data: migrationData,\n } as GetSpokeDepositParamsType<S>,\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: [\n txResult as TxReturnType<S, R>,\n {\n address: creatorHubWalletAddress,\n payload: migrationData,\n } satisfies RelayExtraData,\n ],\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATE_MIGRATION_INTENT_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Creates a migration of ICX to SODA intent on spoke chain (icon).\n * This function handles the migration of ICX or wICX tokens to SODA tokens on the hub chain.\n * Note: This function does not relay the transaction to the spoke chain.\n * You should call the `isAllowanceValid` function before calling this function to check if the allowance is valid.\n * You should call the `relayTxAndWaitPacket` function after calling this function to relay the transaction to the spoke chain.\n *\n * @param {MigrationParams} params - The parameters for the migration transaction.\n * @param {IconSpokeProvider} spokeProvider - The spoke provider.\n * @param {boolean} raw - Whether to return the raw transaction hash instead of the transaction receipt\n * @returns {Promise<Result<TxReturnType<IconSpokeProvider, R>, MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>>} - Returns the raw transaction payload or transaction hash\n *\n * @example\n * const result = await migrationService.createMigrateIcxToSodaIntent(\n * {\n * icx: 'cx...', // Address of the ICX or wICX token to migrate\n * amount: 1000n, // Amount to migrate (in ICX decimals, usually 18)\n * to: '0x...', // Address to receive the migrated SODA tokens\n * },\n * spokeProvider, // IconSpokeProvider instance\n * true // Optional raw flag to return the raw transaction hash instead of the transaction receipt\n * );\n *\n * if (!result.ok) {\n * // Handle error\n * }\n */\n async createMigrateIcxToSodaIntent<R extends boolean = false>(\n params: IcxMigrateParams,\n spokeProvider: IconSpokeProvider,\n raw?: R,\n ): Promise<Result<TxReturnType<IconSpokeProvider, R>, MigrationError<'CREATE_MIGRATION_INTENT_FAILED'>>> {\n try {\n invariant(params.amount > 0, 'Amount must be greater than 0');\n invariant(isAddress(params.to), 'Recipient address is required');\n invariant(\n params.address.toLowerCase() === spokeProvider.chainConfig.addresses.wICX.toLowerCase() ||\n params.address.toLowerCase() === spokeProvider.chainConfig.nativeToken.toLowerCase(),\n 'Token must be wICX or native ICX token',\n );\n invariant(spokeProvider instanceof IconSpokeProvider, 'Spoke provider must be an instance of IconSpokeProvider');\n\n // Get the available amount for migration\n const availableAmount = await this.icxMigration.getAvailableAmount();\n\n // Check if there's enough liquidity for migration\n if (availableAmount < params.amount) {\n throw new Error(\n `Insufficient liquidity. Available: ${availableAmount.toString()}, Requested: ${params.amount.toString()}`,\n );\n }\n\n // Generate migration transaction data\n const migrationData = this.icxMigration.migrateData(params);\n\n // Get wallet address for the transaction\n const walletAddress = await spokeProvider.walletProvider.getWalletAddress();\n\n // Execute the migration transaction\n const txResult = await SpokeService.deposit(\n {\n from: walletAddress,\n token: params.address,\n amount: params.amount,\n data: migrationData,\n },\n spokeProvider,\n this.hubProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<IconSpokeProvider, R>,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATE_MIGRATION_INTENT_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n\n /**\n * Creates a revert migration intent transaction on the hub chain.\n * Note: This function does not relay the transaction to the spoke chain.\n * You should call the `isAllowanceValid` function before calling this function to check if the allowance is valid.\n * You should call the `relayTxAndWaitPacket` function after calling this function to relay the transaction to the spoke chain.\n * @param {IcxCreateRevertMigrationParams} - The parameters for the revert migration transaction.\n * @param {SonicSpokeProvider} spokeProvider - The spoke provider.\n * @param {boolean} raw - Whether to return the raw transaction hash instead of the transaction receipt\n * @returns {Promise<Result<TxReturnType<SonicSpokeProvider, R>, MigrationError<'CREATE_REVERT_MIGRATION_INTENT_FAILED'>>>} - Returns the transaction hash or error\n *\n * @example\n * const result = await migrationService.createRevertSodaToIcxMigrationIntent(\n * {\n * amount: 1000n, // Amount of SODA tokens to revert\n * to: 'hx...', // Icon Address to receive the reverted SODA tokens as ICX\n * action: 'revert',\n * },\n */\n async createRevertSodaToIcxMigrationIntent<R extends boolean = false>(\n params: Omit<IcxCreateRevertMigrationParams, 'wICX'>,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): Promise<Result<TxReturnType<SonicSpokeProvider, R>, MigrationError<'CREATE_REVERT_MIGRATION_INTENT_FAILED'>>> {\n try {\n const wallet = await spokeProvider.walletProvider.getWalletAddress();\n const userRouter = await SonicSpokeService.getUserRouter(wallet, spokeProvider);\n const wICX = this.configService.spokeChainConfig[ICON_MAINNET_CHAIN_ID]?.addresses.wICX;\n invariant(wICX, 'wICX token not found');\n const data = this.icxMigration.revertMigration({\n wICX: wICX as IconAddress,\n amount: params.amount,\n to: encodeAddress(ICON_MAINNET_CHAIN_ID, params.to),\n userWallet: userRouter,\n });\n\n const txResult = await SonicSpokeService.deposit(\n {\n from: wallet,\n token: this.hubProvider.chainConfig.addresses.sodaToken,\n amount: params.amount,\n data,\n },\n spokeProvider,\n raw,\n );\n\n return {\n ok: true,\n value: txResult as TxReturnType<SonicSpokeProvider, R>,\n };\n } catch (error) {\n return {\n ok: false,\n error: {\n code: 'CREATE_REVERT_MIGRATION_INTENT_FAILED',\n data: {\n payload: params,\n error: error,\n },\n },\n };\n }\n }\n}\n","import type { Address, Hex } from 'viem';\nimport type { EvmContractCall } from '../shared/types.js';\nimport {\n encodeContractCalls,\n Erc20Service,\n EvmAssetManagerService,\n type EvmHubProvider,\n EvmVaultTokenService,\n} from '../index.js';\nimport invariant from 'tiny-invariant';\nimport { SONIC_MAINNET_CHAIN_ID, type SpokeChainId, getMoneyMarketConfig } from '@sodax/types';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\n\nexport type UnifiedBnUSDMigrateParams = {\n srcChainId: SpokeChainId; // The source chain ID where bnUSD (legacy or new) token exists\n srcbnUSD: string; // The spoke address of the bnUSD source token to migrate\n dstChainId: SpokeChainId; // The destination chain ID for the migration\n dstbnUSD: string; // The spoke address of the bnUSD destination token to receive\n amount: bigint; // The amount of bnUSD to migrate\n to: string; // The spoke address that will receive the migrated new bnUSD tokens\n};\n\ntype FormattedBnUSDMigrateParams = {\n srcChainId: SpokeChainId; // The source chain ID where the legacy bnUSD token exists\n legacybnUSD: string; // The spoke address of the legacy bnUSD token to migrate\n newbnUSD: string; // The spoke address of the new bnUSD token to receive\n amount: bigint; // The amount of legacy bnUSD to migrate\n to: Hex; // The encoded spoke address (translated to hub chain) that will receive the migrated new bnUSD tokens\n dstChainId: SpokeChainId; // The destination chain ID for the migration\n};\n\nexport type BnUSDRevertMigrationParams = {\n srcChainId: SpokeChainId; // The source chain ID where the new bnUSD token exists\n legacybnUSD: string; // The ICON address of the legacy bnUSD token to receive\n newbnUSD: string; // The ICON address of the new bnUSD token to migrate from\n amount: bigint; // The amount of new bnUSD tokens to migrate back\n to: Hex; // The spoke chain address that will receive the migrated legacy bnUSD tokens\n dstChainId: SpokeChainId; // The destination chain ID for the migration\n};\n\nexport type BnUSDMigrationServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n configService: ConfigService;\n};\n\n/**\n * Service for handling bnUSD migration operations on the hub chain.\n * Provides functionality to migrate between legacy and new bnUSD tokens.\n */\nexport class BnUSDMigrationService {\n private readonly hubProvider: EvmHubProvider;\n private readonly configService: ConfigService;\n\n constructor({ hubProvider, configService }: BnUSDMigrationServiceConstructorParams) {\n this.hubProvider = hubProvider;\n this.configService = configService;\n }\n\n /**\n * Generates transaction data for migrating legacy bnUSD tokens to new bnUSD tokens.\n * This method creates the necessary contract calls to:\n * 1. Wrap legacy bnUSD into vault tokens\n * 2. Migrate to new bnUSD vault\n * 3. Withdraw to new bnUSD tokens\n *\n * @param params - The migration parameters including token addresses, amount, and recipient\n * @returns Encoded transaction data for the migration operation\n * @throws Will throw an error if the hub asset configuration is not found\n */\n public migrateData(params: FormattedBnUSDMigrateParams): Hex {\n const calls: EvmContractCall[] = [];\n const assetConfig = this.configService.getHubAssetInfo(params.srcChainId, params.legacybnUSD);\n invariant(assetConfig, `hub asset not found for legacy bnUSD token: ${params.legacybnUSD}`);\n\n const bnUSDVault = getMoneyMarketConfig(SONIC_MAINNET_CHAIN_ID).bnUSDVault as Address;\n\n // Wrap legacy bnUSD into vault tokens\n calls.push(Erc20Service.encodeApprove(assetConfig.asset, assetConfig.vault, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(assetConfig.vault, assetConfig.asset, params.amount));\n\n // Migrate to new bnUSD vault\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(assetConfig.decimal, params.amount);\n calls.push(Erc20Service.encodeApprove(assetConfig.vault, bnUSDVault, translatedAmount));\n calls.push(EvmVaultTokenService.encodeDeposit(bnUSDVault, assetConfig.vault, translatedAmount));\n\n // check if bnUSD is getting migrated to hub chain bnUSD vault\n if (params.newbnUSD.toLowerCase() === bnUSDVault.toLowerCase()) {\n calls.push(Erc20Service.encodeTransfer(bnUSDVault, params.to, translatedAmount));\n return encodeContractCalls(calls);\n }\n\n // Withdraw to new bnUSD\n const dstAssetConfig = this.configService.getHubAssetInfo(params.dstChainId, params.newbnUSD);\n invariant(dstAssetConfig, `hub asset not found for new bnUSD token: ${params.newbnUSD}`);\n\n calls.push(EvmVaultTokenService.encodeWithdraw(bnUSDVault, dstAssetConfig.asset, translatedAmount));\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(\n dstAssetConfig.decimal,\n translatedAmount,\n );\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n dstAssetConfig.asset,\n params.to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Generates transaction data for migrating new bnUSD tokens back to legacy bnUSD tokens.\n * This method creates the necessary contract calls to:\n * 1. Wrap new bnUSD into vault tokens\n * 2. Migrate to legacy bnUSD vault\n * 3. Withdraw to legacy bnUSD tokens\n *\n * @param params - The migration parameters including token addresses, amount, and recipient\n * @returns Encoded transaction data for the migration operation\n * @throws Will throw an error if the hub asset configuration is not found\n */\n public revertMigrationData(params: BnUSDRevertMigrationParams): Hex {\n const calls: EvmContractCall[] = [];\n const bnUSDVault = getMoneyMarketConfig(SONIC_MAINNET_CHAIN_ID).bnUSDVault as Address;\n\n // Wrap new bnUSD into vault tokens\n let decimals = 18;\n if (params.newbnUSD.toLowerCase() !== bnUSDVault.toLowerCase()) {\n const assetConfig = this.configService.getHubAssetInfo(params.srcChainId, params.newbnUSD);\n invariant(assetConfig, `hub asset not found for new bnUSD token: ${params.newbnUSD}`);\n decimals = assetConfig.decimal;\n calls.push(Erc20Service.encodeApprove(assetConfig.asset, bnUSDVault, params.amount));\n calls.push(EvmVaultTokenService.encodeDeposit(bnUSDVault, assetConfig.asset, params.amount));\n }\n\n const translatedAmount = EvmVaultTokenService.translateIncomingDecimals(decimals, params.amount);\n\n // Migrate to legacy bnUSD vault'\n const dstAssetConfig = this.configService.getHubAssetInfo(params.dstChainId, params.legacybnUSD);\n invariant(dstAssetConfig, `hub asset not found for new bnUSD token: ${params.legacybnUSD}`);\n\n calls.push(EvmVaultTokenService.encodeWithdraw(bnUSDVault, dstAssetConfig.vault, translatedAmount));\n calls.push(EvmVaultTokenService.encodeWithdraw(dstAssetConfig.vault, dstAssetConfig.asset, translatedAmount));\n\n const translatedAmountOut = EvmVaultTokenService.translateOutgoingDecimals(\n dstAssetConfig.decimal,\n translatedAmount,\n );\n\n calls.push(\n EvmAssetManagerService.encodeTransfer(\n dstAssetConfig.asset,\n params.to,\n translatedAmountOut,\n this.hubProvider.chainConfig.addresses.assetManager,\n ),\n );\n\n return encodeContractCalls(calls);\n }\n}\n","import { ICON_MAINNET_CHAIN_ID } from '@sodax/types';\n// packages/sdk/src/services/hub/BalnSwapService.ts\nimport { type Address, type Hex, type HttpTransport, type PublicClient, encodeFunctionData } from 'viem';\nimport { balnSwapAbi } from '../shared/abis/balnSwap.abi.js';\nimport type { EvmContractCall, EvmReturnType, IconContractAddress, PromiseEvmTxReturnType } from '../shared/types.js';\nimport { encodeContractCalls, Erc20Service } from '../index.js';\nimport type { EvmHubProvider, SonicSpokeProvider } from '../shared/entities/index.js';\nimport invariant from 'tiny-invariant';\nimport type { ConfigService } from '../shared/config/ConfigService.js';\n\n/**\n * Lockup periods in seconds\n */\nexport enum LockupPeriod {\n NO_LOCKUP = 0,\n SIX_MONTHS = 6 * 30 * 24 * 60 * 60, // 6 months\n TWELVE_MONTHS = 12 * 30 * 24 * 60 * 60, // 12 months\n EIGHTEEN_MONTHS = 18 * 30 * 24 * 60 * 60, // 18 months\n TWENTY_FOUR_MONTHS = 24 * 30 * 24 * 60 * 60, // 24 months\n}\n\n/**\n * Reward multipliers (in basis points, 10000 = 1.0)\n */\nexport enum LockupMultiplier {\n NO_LOCKUP_MULTIPLIER = 5000, // 0.5x\n SIX_MONTHS_MULTIPLIER = 7500, // 0.75x\n TWELVE_MONTHS_MULTIPLIER = 10000, // 1.0x\n EIGHTEEN_MONTHS_MULTIPLIER = 12500, // 1.25x\n TWENTY_FOUR_MONTHS_MULTIPLIER = 15000, // 1.5x\n}\n\n/**\n * Unstake request information from the staked SODA contract.\n */\nexport type UnstakeRequest = {\n /** The amount being unstaked */\n amount: bigint;\n /** The start time of the unstake request */\n startTime: bigint;\n /** The address to receive the unstaked tokens */\n to: Address;\n};\n\n/**\n * Detailed lock information structure returned by the BALN swap contract.\n */\nexport type DetailedLock = {\n /** The amount of BALN tokens in the lock */\n balnAmount: bigint;\n /** The amount of SODA tokens in the lock */\n sodaAmount: bigint;\n /** The unlock time for the lock */\n unlockTime: bigint;\n /** The amount of xSODA tokens in the lock */\n xSodaAmount: bigint;\n /** The unstaking ID for the lock */\n unstakingId: bigint;\n /** The unstake request information */\n unstakeRequest: UnstakeRequest;\n /** The amount of staked SODA tokens */\n stakedSodaAmount: bigint;\n};\n\n/**\n * Parameters for BALN swap operations.\n */\nexport type BalnMigrateParams = {\n /** The amount of BALN tokens to swap */\n amount: bigint;\n /** The lockup period for the swap */\n lockupPeriod: LockupPeriod;\n /** The address that will receive the swapped SODA tokens */\n to: Address;\n /** Whether to stake the SODA tokens */\n stake: boolean;\n};\n\n/**\n * Parameters for BALN lock operations.\n */\nexport type BalnLockParams = {\n /** The lock ID to operate on */\n lockId: bigint;\n};\n\nexport type BalnSwapServiceConstructorParams = {\n hubProvider: EvmHubProvider;\n};\n\n/**\n * Service for handling BALN swap operations on the hub chain.\n * Provides functionality to interact directly with the BALN swap contract.\n */\nexport class BalnSwapService {\n private readonly hubProvider: EvmHubProvider;\n\n constructor({ hubProvider }: BalnSwapServiceConstructorParams) {\n this.hubProvider = hubProvider;\n }\n\n /**\n * Gets the multiplier for a given lockup period.\n * @param lockupPeriod - The lockup period\n * @returns The multiplier in basis points\n */\n getMultiplierForPeriod(lockupPeriod: LockupPeriod): bigint {\n switch (lockupPeriod) {\n case LockupPeriod.NO_LOCKUP:\n return BigInt(LockupMultiplier.NO_LOCKUP_MULTIPLIER);\n case LockupPeriod.SIX_MONTHS:\n return BigInt(LockupMultiplier.SIX_MONTHS_MULTIPLIER);\n case LockupPeriod.TWELVE_MONTHS:\n return BigInt(LockupMultiplier.TWELVE_MONTHS_MULTIPLIER);\n case LockupPeriod.EIGHTEEN_MONTHS:\n return BigInt(LockupMultiplier.EIGHTEEN_MONTHS_MULTIPLIER);\n case LockupPeriod.TWENTY_FOUR_MONTHS:\n return BigInt(LockupMultiplier.TWENTY_FOUR_MONTHS_MULTIPLIER);\n default:\n throw new Error(`Invalid lockup period: ${lockupPeriod}`);\n }\n }\n\n /**\n * Calculates the SODA amount for a given BALN amount and lockup period without calling the contract.\n * @param balnAmount - The amount of BALN tokens\n * @param lockupPeriod - The lockup period\n * @returns The calculated SODA amount\n */\n calculateSodaAmount(balnAmount: bigint, lockupPeriod: LockupPeriod): bigint {\n const multiplier = this.getMultiplierForPeriod(lockupPeriod);\n const basisPoints = 10000n;\n\n // SODA amount = BALN amount * multiplier / basis points\n return (balnAmount * multiplier) / basisPoints;\n }\n\n /**\n * Generates transaction data for swapping BALN tokens to SODA tokens.\n * This method creates the necessary contract calls to:\n * 1. Approve the BALN swap contract to spend the BALN tokens\n * 2. Execute the BALN swap with lockup period\n *\n * @param balnToken - The address of the BALN token\n * @param params - The BALN swap parameters including amount, lockup period, and recipient\n * @param configService - The config service\n * @returns Encoded transaction data for the BALN swap operation\n */\n swapData(balnToken: IconContractAddress, params: BalnMigrateParams, configService: ConfigService): Hex {\n const assetConfig = configService.getHubAssetInfo(ICON_MAINNET_CHAIN_ID, balnToken);\n invariant(assetConfig, `hub asset not found for baln token: ${balnToken}`);\n\n const calls: EvmContractCall[] = [];\n\n // Approve BALN tokens for the swap contract\n calls.push(\n Erc20Service.encodeApprove(assetConfig.asset, this.hubProvider.chainConfig.addresses.balnSwap, params.amount),\n );\n calls.push(this.encodeSwap(params.amount, params.lockupPeriod, params.to, params.stake));\n\n return encodeContractCalls(calls);\n }\n\n /**\n * Executes a claim operation directly through the wallet provider.\n * @param params - The lock parameters including lock ID\n * @param spokeProvider - The Sonic spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async claim<R extends boolean = false>(\n params: BalnLockParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const claimTx = this.encodeClaim(params.lockId);\n return await this.call(spokeProvider, claimTx, raw);\n }\n\n /**\n * Executes a claim unstaked operation directly through the wallet provider.\n * @param params - The lock parameters including lock ID\n * @param spokeProvider - The Sonic spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async claimUnstaked<R extends boolean = false>(\n params: BalnLockParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const claimUnstakedTx = this.encodeClaimUnstaked(params.lockId);\n return await this.call(spokeProvider, claimUnstakedTx, raw);\n }\n\n /**\n * Executes a stake operation directly through the wallet provider.\n * @param params - The lock parameters including lock ID\n * @param spokeProvider - The Sonic spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async stake<R extends boolean = false>(\n params: BalnLockParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const stakeTx = this.encodeStake(params.lockId);\n return await this.call(spokeProvider, stakeTx, raw);\n }\n\n /**\n * Executes an unstake operation directly through the wallet provider.\n * @param params - The lock parameters including lock ID\n * @param spokeProvider - The Sonic spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async unstake<R extends boolean = false>(\n params: BalnLockParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const unstakeTx = this.encodeUnstake(params.lockId);\n return await this.call(spokeProvider, unstakeTx, raw);\n }\n\n /**\n * Executes a cancel unstake operation directly through the wallet provider.\n * @param params - The lock parameters including lock ID\n * @param spokeProvider - The Sonic spoke provider\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async cancelUnstake<R extends boolean = false>(\n params: BalnLockParams,\n spokeProvider: SonicSpokeProvider,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const cancelUnstakeTx = this.encodeCancelUnstake(params.lockId);\n return await this.call(spokeProvider, cancelUnstakeTx, raw);\n }\n\n /**\n * Gets detailed locks for a specific user including unstake requests and staked amounts.\n *\n * @param publicClient - The public client for reading contract state\n * @param user - The user address\n * @returns Array of detailed lock information for the user\n */\n async getDetailedUserLocks(\n publicClient: PublicClient<HttpTransport>,\n user: Address,\n ): Promise<readonly DetailedLock[]> {\n return await publicClient.readContract({\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n abi: balnSwapAbi,\n functionName: 'getDetailedUserLocks',\n args: [user],\n });\n }\n\n // ===== ENCODING METHODS =====\n\n /**\n * Encodes a swap transaction for the BALN swap contract.\n *\n * @param amount - The amount of BALN tokens to swap\n * @param lockupPeriod - The lockup period for the swap\n * @param to - The address that will receive the swapped SODA tokens\n * @param stake - Whether to stake the SODA tokens\n * @returns The encoded contract call for the swap operation\n */\n encodeSwap(amount: bigint, lockupPeriod: LockupPeriod, to: Address, stake: boolean): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'swap',\n args: [amount, BigInt(lockupPeriod), to, stake],\n }),\n };\n }\n\n /**\n * Encodes a claim transaction for the BALN swap contract.\n *\n * @param lockId - The lock ID to claim from\n * @returns The encoded contract call for the claim operation\n */\n encodeClaim(lockId: bigint): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'claim',\n args: [lockId],\n }),\n };\n }\n\n /**\n * Encodes a claim unstaked transaction for the BALN swap contract.\n *\n * @param lockId - The lock ID to claim unstaked tokens from\n * @returns The encoded contract call for the claim unstaked operation\n */\n encodeClaimUnstaked(lockId: bigint): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'claimUnstaked',\n args: [lockId],\n }),\n };\n }\n\n /**\n * Encodes a stake transaction for the BALN swap contract.\n *\n * @param lockId - The lock ID to stake\n * @returns The encoded contract call for the stake operation\n */\n encodeStake(lockId: bigint): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'stake',\n args: [lockId],\n }),\n };\n }\n\n /**\n * Encodes an unstake transaction for the BALN swap contract.\n *\n * @param lockId - The lock ID to unstake\n * @returns The encoded contract call for the unstake operation\n */\n encodeUnstake(lockId: bigint): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'unstake',\n args: [lockId],\n }),\n };\n }\n\n /**\n * Encodes a cancel unstake transaction for the BALN swap contract.\n *\n * @param lockId - The lock ID to cancel unstake for\n * @returns The encoded contract call for the cancel unstake operation\n */\n encodeCancelUnstake(lockId: bigint): EvmContractCall {\n return {\n address: this.hubProvider.chainConfig.addresses.balnSwap,\n value: 0n,\n data: encodeFunctionData({\n abi: balnSwapAbi,\n functionName: 'cancelUnstake',\n args: [lockId],\n }),\n };\n }\n\n // ===== PRIVATE HELPER METHODS =====\n\n /**\n * Executes a contract call through the Sonic wallet provider.\n * @param spokeProvider - The Sonic spoke provider\n * @param rawTx - The raw contract call to execute\n * @param raw - Whether to return raw transaction data\n * @returns The transaction hash or raw transaction data\n */\n async call<R extends boolean = false>(\n spokeProvider: SonicSpokeProvider,\n rawTx: EvmContractCall,\n raw?: R,\n ): PromiseEvmTxReturnType<R> {\n const from = await spokeProvider.walletProvider.getWalletAddress();\n\n const tx = {\n from,\n to: rawTx.address,\n value: rawTx.value,\n data: rawTx.data,\n } satisfies EvmReturnType<true>;\n\n if (raw) {\n return tx as EvmReturnType<R>;\n }\n\n return spokeProvider.walletProvider.sendTransaction(tx) as PromiseEvmTxReturnType<R>;\n }\n}\n"]}
|