@depay/web3-payments-evm
Version:
JavaScript library to scan crypto wallets for liquefiable assets and perform cost-effective, auto-converted payments on-chain.
855 lines (775 loc) • 141 kB
JavaScript
import Exchanges from '@depay/web3-exchanges';
import Token from '@depay/web3-tokens';
import Blockchains from '@depay/web3-blockchains';
import { BN, struct, u64, i64, bool, u8, ComputeBudgetProgram, SystemProgram, PublicKey, Buffer, TransactionInstruction, u128 } from '@depay/solana-web3.js';
import { ethers } from 'ethers';
import { request, getProvider } from '@depay/web3-client';
const config = {
endpoints: {
routesBest: 'https://public.depay.com/routes/best'
}
};
const API = [{"inputs":[{"internalType":"address","name":"_PERMIT2","type":"address"},{"internalType":"address","name":"_FORWARDER","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExchangeCallFailed","type":"error"},{"inputs":[],"name":"ExchangeCallMissing","type":"error"},{"inputs":[],"name":"ExchangeNotApproved","type":"error"},{"inputs":[],"name":"ForwardingPaymentFailed","type":"error"},{"inputs":[],"name":"InsufficientBalanceInAfterPayment","type":"error"},{"inputs":[],"name":"InsufficientBalanceOutAfterPayment","type":"error"},{"inputs":[],"name":"InsufficientProtocolAmount","type":"error"},{"inputs":[],"name":"NativeFeePaymentFailed","type":"error"},{"inputs":[],"name":"NativePaymentFailed","type":"error"},{"inputs":[],"name":"PaymentDeadlineReached","type":"error"},{"inputs":[],"name":"PaymentToZeroAddressNotAllowed","type":"error"},{"inputs":[],"name":"WrongAmountPaidIn","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchange","type":"address"}],"name":"Disabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"exchange","type":"address"}],"name":"Enabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"deadline","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageInAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageOutAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenInAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"feeReceiverAddress","type":"address"},{"indexed":false,"internalType":"address","name":"feeReceiverAddress2","type":"address"}],"name":"Payment","type":"event"},{"inputs":[],"name":"FORWARDER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exchange","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"},{"components":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPermit2.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct IPermit2.PermitTransferFrom","name":"permitTransferFrom","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IDePayRouterV3.PermitTransferFromAndSignature","name":"permitTransferFromAndSignature","type":"tuple"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount2","type":"uint256"},{"internalType":"uint256","name":"protocolAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"tokenInAddress","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"address","name":"tokenOutAddress","type":"address"},{"internalType":"address","name":"paymentReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress","type":"address"},{"internalType":"address","name":"feeReceiverAddress2","type":"address"},{"internalType":"uint8","name":"exchangeType","type":"uint8"},{"internalType":"uint8","name":"receiverType","type":"uint8"},{"internalType":"bool","name":"permit2","type":"bool"},{"internalType":"bytes","name":"exchangeCallData","type":"bytes"},{"internalType":"bytes","name":"receiverCallData","type":"bytes"}],"internalType":"struct IDePayRouterV3.Payment","name":"payment","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"uint48","name":"nonce","type":"uint48"}],"internalType":"struct IPermit2.PermitDetails","name":"details","type":"tuple"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"sigDeadline","type":"uint256"}],"internalType":"struct IPermit2.PermitSingle","name":"permitSingle","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"pay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}];
var routers$2 = {
ethereum: {
address: '0x365f7B56D2fB16C8Af89D7d33b420E4e013461e8',
api: API
},
bsc: {
address: '0x5F565EDfB9C446976a9F9910631cfeDb6A87220c',
api: API
},
polygon: {
address: '0xe04b08Dfc6CaA0F4Ec523a3Ae283Ece7efE00019',
api: API
},
avalanche: {
address: '0x39E7C98BF4ac3E4C394dD600397f5f7Ee3779BE8',
api: API
},
gnosis: {
address: '0x328FE8bbd30487BB7b5A8eEb909f892E9E229271',
api: API
},
arbitrum: {
address: '0x328FE8bbd30487BB7b5A8eEb909f892E9E229271',
api: API
},
optimism: {
address: '0x558302715e3011Be6695605c11A65526D2ba2245',
api: API
},
base: {
address: '0x48825133EF08327535D0b24d73779E82BE6Ea4d9',
api: API
},
worldchain: {
address: '0x886eb82a7e5E7310F66A0E83748662A17E391eb0',
api: API
},
};
var routers$1 = {
solana: {
address: 'DePayR1gQfDmViCPKctnZXNtUgqRwnEqMax8LX9ho1Zg',
exchanges: {
orca: 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc',
raydiumCP: 'CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C',
raydiumCL: 'CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK',
},
alt: '8bYq3tcwX1NM2K2JYMjrEqAPtCXFPCjzPazFothc618e',
api: {
createEscrowSolAccount: {
anchorDiscriminator: new BN("2482112285991870004"),
layout: struct([
u64("anchorDiscriminator"),
])
},
createEscrowTokenAccount: {
anchorDiscriminator: new BN("16156440424245087"),
layout: struct([
u64("anchorDiscriminator"),
])
},
routeSol: {
anchorDiscriminator: new BN("6497164560834983274"),
layout: struct([
u64("anchorDiscriminator"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeToken: {
anchorDiscriminator: new BN("13483873682232752277"),
layout: struct([
u64("anchorDiscriminator"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaSwap: {
anchorDiscriminator: new BN("9797248061404332986"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
bool("aToB"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaSwapSolOut: {
anchorDiscriminator: new BN("13662217913752830165"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
bool("aToB"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaSwapSolIn: {
anchorDiscriminator: new BN("16115018480206947614"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
bool("aToB"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaTwoHopSwap: {
anchorDiscriminator: new BN("15695720599845325801"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
bool("aToBOne"),
bool("aToBTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaTwoHopSwapSolOut: {
anchorDiscriminator: new BN("15074061855608091530"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
bool("aToBOne"),
bool("aToBTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeOrcaTwoHopSwapSolIn: {
anchorDiscriminator: new BN("2678451299937372540"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
bool("aToBOne"),
bool("aToBTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumClSwap: {
anchorDiscriminator: new BN("2954182973248174268"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumClSwapSolOut: {
anchorDiscriminator: new BN("18389700643710627390"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumClSwapSolIn: {
anchorDiscriminator: new BN("564150378912976829"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumClTwoHopSwap: {
anchorDiscriminator: new BN("3828760301615328551"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
u8("remainingAccountsSplit"),
])
},
routeRaydiumClTwoHopSwapSolOut: {
anchorDiscriminator: new BN("11373220799455718953"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
u8("remainingAccountsSplit"),
])
},
routeRaydiumClTwoHopSwapSolIn: {
anchorDiscriminator: new BN("1635173573630140652"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
u8("remainingAccountsSplit"),
])
},
routeRaydiumCpSwap: {
anchorDiscriminator: new BN("7437765211943645137"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumCpSwapSolOut: {
anchorDiscriminator: new BN("9045257739866411286"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumCpSwapSolIn: {
anchorDiscriminator: new BN("432305509198797158"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountIn"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumCpTwoHopSwap: {
anchorDiscriminator: new BN("3384279312781294015"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumCpTwoHopSwapSolOut: {
anchorDiscriminator: new BN("18428464202744806632"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
},
routeRaydiumCpTwoHopSwapSolIn: {
anchorDiscriminator: new BN("16266677464406446072"),
layout: struct([
u64("anchorDiscriminator"),
u64("amountInOne"),
u64("amountInTwo"),
u64("paymentAmount"),
u64("feeAmount"),
u64("feeAmount2"),
u64("protocolAmount"),
i64("deadline"),
])
}
}
},
};
var routers = {... routers$2, ...routers$1};
function _optionalChain$2(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
const EXCHANGE_PROXIES = {
'arbitrum': {
[Blockchains.arbitrum.wrapped.address]: '0x7E655088214d0657251A51aDccE9109CFd23B5B5'
},
'avalanche': {
[Blockchains.avalanche.wrapped.address]: '0x2d0a6275eaDa0d03226919ce6D93661E589B2d59'
},
'base': {
[Blockchains.base.wrapped.address]: '0xD1711710843B125a6a01FfDF9b95fDc3064BeF7A'
},
'bsc': {
[Blockchains.bsc.wrapped.address]: '0xeEb80d14abfB058AA78DE38813fe705c3e3b243E'
},
'ethereum': {
[Blockchains.ethereum.wrapped.address]: '0x298f4980525594b3b982779cf74ba76819708D43'
},
'fantom': {
[Blockchains.fantom.wrapped.address]: '0x2d0a6275eaDa0d03226919ce6D93661E589B2d59'
},
'gnosis': {
[Blockchains.gnosis.wrapped.address]: '0x2d0a6275eaDa0d03226919ce6D93661E589B2d59'
},
'optimism': {
[Blockchains.optimism.wrapped.address]: '0x69594057e2C0224deb1180c7a5Df9ec9d5B611B5'
},
'polygon': {
[Blockchains.polygon.wrapped.address]: '0xaE59C9d3E055BdFAa583E169aA5Ebe395689476a'
},
'worldchain': {
[Blockchains.worldchain.wrapped.address]: '0x2CA727BC33915823e3D05fe043d310B8c5b2dC5b'
},
'solana': {}
};
const getTransaction$3 = async({ paymentRoute, options })=> {
let deadline = _optionalChain$2([options, 'optionalAccess', _ => _.deadline]) || Math.ceil(new Date())+(1800*1000); // 30 minutes in ms (default)
const transaction = {
blockchain: paymentRoute.blockchain,
to: transactionAddress({ paymentRoute, options }),
api: transactionApi({ paymentRoute, options }),
method: transactionMethod({ paymentRoute, options }),
params: await transactionParams({ paymentRoute, options, deadline }),
value: transactionValue({ paymentRoute })
};
transaction.deadline = deadline;
return transaction
};
const transactionAddress = ({ paymentRoute, options })=> {
if(paymentRoute.directTransfer && !paymentRoute.fee && !paymentRoute.fee2 && _optionalChain$2([options, 'optionalAccess', _2 => _2.wallet, 'optionalAccess', _3 => _3.name]) !== 'World App') {
if(paymentRoute.toToken.address == Blockchains[paymentRoute.blockchain].currency.address) {
return paymentRoute.toAddress
} else {
return paymentRoute.toToken.address
}
} else {
return routers$2[paymentRoute.blockchain].address
}
};
const transactionApi = ({ paymentRoute, options })=> {
if(paymentRoute.directTransfer && !paymentRoute.fee && !paymentRoute.fee2 && _optionalChain$2([options, 'optionalAccess', _4 => _4.wallet, 'optionalAccess', _5 => _5.name]) !== 'World App') {
if(paymentRoute.toToken.address == Blockchains[paymentRoute.blockchain].currency.address) {
return undefined
} else {
return Token[paymentRoute.blockchain].DEFAULT
}
} else {
return routers$2[paymentRoute.blockchain].api
}
};
const transactionMethod = ({ paymentRoute, options })=> {
if(paymentRoute.directTransfer && !paymentRoute.fee && !paymentRoute.fee2 && _optionalChain$2([options, 'optionalAccess', _6 => _6.wallet, 'optionalAccess', _7 => _7.name]) !== 'World App') {
if(paymentRoute.toToken.address == Blockchains[paymentRoute.blockchain].currency.address) {
return undefined
} else { // standard token transfer
return 'transfer'
}
} else {
return 'pay'
}
};
const getExchangeType = ({ exchangeRoute, blockchain })=> {
if( typeof exchangeRoute === 'undefined' ) { return 0 }
if(exchangeRoute.exchange[blockchain].router.address === Blockchains[blockchain].wrapped.address) {
return 2 // push
} else {
return 1 // pull
}
};
const getExchangeCallData = ({ exchangeTransaction })=>{
const contract = new ethers.Contract(exchangeTransaction.to, exchangeTransaction.api);
const method = exchangeTransaction.method;
const params = exchangeTransaction.params;
let contractMethod;
let fragment;
fragment = contract.interface.fragments.find((fragment) => {
return(
fragment.name == method &&
(fragment.inputs && params && typeof(params) === 'object' ? fragment.inputs.length == Object.keys(params).length : true)
)
});
let paramsToEncode;
if(fragment.inputs.length === 1 && fragment.inputs[0].type === 'tuple') {
contractMethod = method;
paramsToEncode = [params[fragment.inputs[0].name]];
} else {
contractMethod = `${method}(${fragment.inputs.map((input)=>input.type).join(',')})`;
paramsToEncode = fragment.inputs.map((input) => {
if(input.type === 'tuple') {
let tuple = {};
input.components.forEach((component, index)=>{
tuple[component.name] = params[input.name][index];
});
contractMethod = method;
return tuple
} else {
return params[input.name]
}
});
}
return contract.interface.encodeFunctionData(contractMethod, paramsToEncode)
};
const getPermit2SignatureTransferNonce = async({ address, blockchain })=>{
const getBitmap = (address, word)=>request({
blockchain: blockchain,
address: Blockchains[blockchain].permit2,
api: [{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"AllowanceExpired","type":"error"},{"inputs":[],"name":"ExcessiveInvalidation","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidContractSignature","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidSignatureLength","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"LengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"signatureDeadline","type":"uint256"}],"name":"SignatureExpired","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint160","name":"amount","type":"uint160"},{"indexed":false,"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"}],"name":"Lockdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint48","name":"newNonce","type":"uint48"},{"indexed":false,"internalType":"uint48","name":"oldNonce","type":"uint48"}],"name":"NonceInvalidation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint160","name":"amount","type":"uint160"},{"indexed":false,"internalType":"uint48","name":"expiration","type":"uint48"},{"indexed":false,"internalType":"uint48","name":"nonce","type":"uint48"}],"name":"Permit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"word","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mask","type":"uint256"}],"name":"UnorderedNonceInvalidation","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"uint48","name":"nonce","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint48","name":"newNonce","type":"uint48"}],"name":"invalidateNonces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wordPos","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"name":"invalidateUnorderedNonces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"internalType":"struct IAllowanceTransfer.TokenSpenderPair[]","name":"approvals","type":"tuple[]"}],"name":"lockdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonceBitmap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"uint48","name":"nonce","type":"uint48"}],"internalType":"struct IAllowanceTransfer.PermitDetails[]","name":"details","type":"tuple[]"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"sigDeadline","type":"uint256"}],"internalType":"struct IAllowanceTransfer.PermitBatch","name":"permitBatch","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"uint48","name":"expiration","type":"uint48"},{"internalType":"uint48","name":"nonce","type":"uint48"}],"internalType":"struct IAllowanceTransfer.PermitDetails","name":"details","type":"tuple"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"sigDeadline","type":"uint256"}],"internalType":"struct IAllowanceTransfer.PermitSingle","name":"permitSingle","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails","name":"transferDetails","type":"tuple"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions[]","name":"permitted","type":"tuple[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitBatchTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails[]","name":"transferDetails","type":"tuple[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails","name":"transferDetails","type":"tuple"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"witness","type":"bytes32"},{"internalType":"string","name":"witnessTypeString","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitWitnessTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions[]","name":"permitted","type":"tuple[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitBatchTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails[]","name":"transferDetails","type":"tuple[]"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"witness","type":"bytes32"},{"internalType":"string","name":"witnessTypeString","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitWitnessTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"address","name":"token","type":"address"}],"internalType":"struct IAllowanceTransfer.AllowanceTransferDetails[]","name":"transferDetails","type":"tuple[]"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint160","name":"amount","type":"uint160"},{"internalType":"address","name":"token","type":"address"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}],
method: 'nonceBitmap',
params: [address, word]
});
const getFirstUnsetBit = (bitmap)=>{
for (let i = 0; i < 256; i++) {
if (bitmap.shr(i).and(1).eq(0)) {
return i
}
}
return -1
};
function buildNonce(word, bitPos) {
return ethers.BigNumber.from(word).mul(256).add(bitPos)
}
let word = 0;
while(word < 1) {
const bitmap = await getBitmap(address, word);
if(bitmap.toString() != Blockchains[blockchain].maxInt) {
const bitPos = getFirstUnsetBit(bitmap);
if (bitPos >= 0) {
// Build and return the nonce
const nonce = buildNonce(word, bitPos);
return nonce
}
}
word = word+1;
}
};
const transactionParams = async ({ paymentRoute, options, deadline })=> {
if(paymentRoute.directTransfer && !paymentRoute.fee && !paymentRoute.fee2 && _optionalChain$2([options, 'optionalAccess', _8 => _8.wallet, 'optionalAccess', _9 => _9.name]) !== 'World App') {
if(paymentRoute.toToken.address == Blockchains[paymentRoute.blockchain].currency.address) {
return undefined
} else { // standard token transfer
return [paymentRoute.toAddress, paymentRoute.toAmount]
}
} else {
const exchangeRoute = paymentRoute.exchangeRoutes[0];
const exchangeType = getExchangeType({ exchangeRoute, blockchain: paymentRoute.blockchain });
const exchangeTransaction = !exchangeRoute ? undefined : await exchangeRoute.getTransaction({
account: routers$2[paymentRoute.blockchain].address,
inputTokenPushed: exchangeType === 2
});
const exchangeCallData = !exchangeTransaction ? Blockchains[paymentRoute.blockchain].zero : getExchangeCallData({ exchangeTransaction });
let exchangeAddress = Blockchains[paymentRoute.blockchain].zero;
if (exchangeRoute) {
if(
paymentRoute.blockchain === 'bsc' &&
exchangeRoute.exchange.name === 'pancakeswap_v3' &&
paymentRoute.toToken.address === Blockchains[paymentRoute.blockchain].currency.address
) {
// bsc pancakeswap_v3 requries smart router exchange address for converting and paying out BNB/NATIVE
exchangeAddress = exchangeRoute.exchange[paymentRoute.blockchain].smartRouter.address;
} else { // proxy exchange or exchange directly
exchangeAddress = EXCHANGE_PROXIES[exchangeTransaction.blockchain][exchangeRoute.exchange[paymentRoute.blockchain].router.address] || exchangeRoute.exchange[paymentRoute.blockchain].router.address;
}
}
let params;
if(options && _optionalChain$2([options, 'optionalAccess', _10 => _10.wallet, 'optionalAccess', _11 => _11.name]) === 'World App' && paymentRoute.blockchain === 'worldchain'){
const permitDeadline = Math.floor(Date.now() / 1000) + 30 * 60; // 60 minutes in seconds (default)
const nonce = await getPermit2SignatureTransferNonce({ blockchain: paymentRoute.blockchain, address: paymentRoute.fromAddress });
const permitTransfer = {
permitted: {
token: paymentRoute.fromToken.address,
amount: paymentRoute.fromAmount.toString(),
},
nonce: nonce.toString(),
deadline: permitDeadline.toString(),
};
params = {
args: [
[ // payment
paymentRoute.fromAmount.toString(), // amountIn
paymentRoute.toAmount.toString(), // paymentAmount
(paymentRoute.feeAmount || 0).toString(), // feeAmount
(paymentRoute.feeAmount2 || 0).toString(), // feeAmount
(paymentRoute.protocolFeeAmount || 0).toString(), // protocolAmount
deadline.toString(), // deadline
paymentRoute.fromToken.address, // tokenInAddress
exchangeAddress, // exchangeAddress
paymentRoute.toToken.address, // tokenOutAddress
paymentRoute.toAddress, // paymentReceiverAddress
paymentRoute.fee ? paymentRoute.fee.receiver : Blockchains[paymentRoute.blockchain].zero, // feeReceiverAddress
paymentRoute.fee2 ? paymentRoute.fee2.receiver : Blockchains[paymentRoute.blockchain].zero, // feeReceiverAddress2
exchangeType, // exchangeType
0, // receiverType
true, // permit2
exchangeCallData, // exchangeCallData
'0x', // receiverCallData
],
[ // permitTransferFromAndSignature
[ // permitTransferFrom
[ // permitted
paymentRoute.fromToken.address, // token
paymentRoute.fromAmount.toString() // amount
],
nonce.toString(), // nonce
permitDeadline.toString() // deadline
],
"PERMIT2_SIGNATURE_PLACEHOLDER_0"
]
],
permit2: {
...permitTransfer,
spender: routers$2[paymentRoute.blockchain].address,
},
};
} else {
params = {
payment: {
amountIn: paymentRoute.fromAmount,
paymentAmount: paymentRoute.toAmount,
feeAmount: (paymentRoute.feeAmount || 0).toString(),
feeAmount2: (paymentRoute.feeAmount2 || 0).toString(),
protocolAmount: (paymentRoute.protocolFeeAmount || 0).toString(),
tokenInAddress: paymentRoute.fromToken.address,
exchangeAddress,
tokenOutAddress: paymentRoute.toToken.address,
paymentReceiverAddress: paymentRoute.toAddress,
feeReceiverAddress: paymentRoute.fee ? paymentRoute.fee.receiver : Blockchains[paymentRoute.blockchain].zero,
feeReceiverAddress2: paymentRoute.fee2 ? paymentRoute.fee2.receiver : Blockchains[paymentRoute.blockchain].zero,
exchangeType: exchangeType,
receiverType: 0,
exchangeCallData: exchangeCallData,
receiverCallData: Blockchains[paymentRoute.blockchain].zero,
deadline,
}
};
if(_optionalChain$2([options, 'optionalAccess', _12 => _12.signature])) {
params = [
{...params.payment, permit2: true},
{ // permitTransferFromAndSignature
permitTransferFrom: {
permitted: {
token: paymentRoute.fromToken.address,
amount: paymentRoute.fromAmount.toString(),
},
nonce: options.signatureNonce,
deadline: options.signatureDeadline
},
signature: options.signature
}
];
}
}
return params
}
};
const transactionValue = ({ paymentRoute })=> {
if(paymentRoute.fromToken.address == Blockchains[paymentRoute.blockchain].currency.address) {
if(!paymentRoute.directTransfer) {
return paymentRoute.fromAmount.toString()
} else { // direct payment
return paymentRoute.toAmount.toString()
}
} else {
return ethers.BigNumber.from('0').toString()
}
};
function _optionalChain$1(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
const getRouterApprovalTransaction$1 = async({ paymentRoute, options })=> {
return({
blockchain: paymentRoute.blockchain,
to: paymentRoute.fromToken.address,
api: Token[paymentRoute.blockchain].DEFAULT,
method: 'approve',
params: [routers$2[paymentRoute.blockchain].address, (_optionalChain$1([options, 'optionalAccess', _ => _.amount]) || Blockchains[paymentRoute.blockchain].maxInt)]
})
};
const getPermit2ApprovalTransaction$1 = async({ paymentRoute, options })=> {
return({
blockchain: paymentRoute.blockchain,
to: paymentRoute.fromToken.address,
api: Token[paymentRoute.blockchain].DEFAULT,
method: 'approve',
params: [Blockchains[paymentRoute.blockchain].permit2, (_optionalChain$1([options, 'optionalAccess', _2 => _2.amount]) || Blockchains[paymentRoute.blockchain].maxInt)]
})
};
const getPermit2ApprovalSignature$1 = async({ paymentRoute, options })=> {
const domain = {
name: "Permit2",
chainId: Blockchains[paymentRoute.blockchain].networkId,
verifyingContract: Blockchains[paymentRoute.blockchain].permit2
};
const types = {
TokenPermissions: [
{ name: "token", type: "address" },
{ name: "amount", type: "uint256" },
],
EIP712Domain: [
{ name: "name", type: "string" },
{ name: "chainId", type: "uint256" },
{ name: "verifyingContract", type: "address" }
],
PermitTransferFrom: [
{ name: "permitted", type: "TokenPermissions" },
{ name: "spender", type: "address" },
{ name: "nonce", type: "uint256" },
{ name: "deadline", type: "uint256" }
],
};
let deadline = _optionalChain$1([options, 'optionalAccess', _3 => _3.deadline]) || Math.ceil(new Date()/1000)+(3600); // 60 minutes in seconds (default)
const nonce = await getPermit2SignatureTransferNonce({ blockchain: paymentRoute.blockchain, address: paymentRoute.fromAddress });
const data = {
permitted: {
token: paymentRoute.fromToken.address,
amount: paymentRoute.fromAmount.toString(),
},
spender: routers$2[paymentRoute.blockchain].address,
nonce: nonce.toString(),
deadline: deadline.toString()
};
return {
domain,
types,
message: data,
primaryType: "PermitTransferFrom"
}
};
let supported = ['ethereum', 'bsc', 'polygon', 'solana', 'arbitrum', 'avalanche', 'gnosis', 'optimism', 'base', 'worldchain'];
supported.evm = ['ethereum', 'bsc', 'polygon', 'arbitrum', 'avalanche', 'gnosis', 'optimism', 'base', 'worldchain'];
supported.svm = ['solana'];
const getRouterApprovalTransaction = ({ paymentRoute, options })=>{
if(supported.evm.includes(paymentRoute.blockchain)) {
return getRouterApprovalTransaction$1({ paymentRoute, options })
} else if(supported.svm.includes(paymentRoute.blockchain)) ; else {
throw('Blockchain not supported!')
}
};
const getPermit2ApprovalTransaction = ({ paymentRoute, options })=>{
if(supported.evm.includes(paymentRoute.blockchain)) {
return getPermit2ApprovalTransaction$1({ paymentRoute, options })
} else if(supported.svm.includes(paymentRoute.blockchain)) ; else {
throw('Blockchain not supported!')
}
};
const getPermit2ApprovalSignature = ({ paymentRoute, options })=>{
if(supported.evm.includes(paymentRoute.blockchain)) {
return getPermit2ApprovalSignature$1({ paymentRoute, options })
} else if(supported.svm.includes(paymentRoute.blockchain)) ; else {
throw('Blockchain not supported!')
}
};
const createComputeInstruction = async ({ paymentRoute })=> {
if(
paymentRoute.exchangeRoutes.length > 0 &&
getFixedPath(paymentRoute.exchangeRoutes[0].path).length > 2 &&
paymentRoute.exchangeRoutes[0].exchange.name == 'raydium_cl'
) {
return ComputeBudgetProgram.setComputeUnitLimit({ units: 300000 })
}
};
const getMiddleToken = ({ paymentRoute })=>{
let path = [...paymentRoute.exchangeRoutes[0].path];
if(path.indexOf(Blockchains.solana.currency.address) > -1) { path.splice(path.indexOf(Blockchains.solana.currency.address), 1); }
if(path.indexOf(paymentRoute.fromToken.address) > -1) { path.splice(path.indexOf(paymentRoute.fromToken.address), 1); }
if(path.indexOf(paymentRoute.toToken.address) > -1) { path.splice(path.indexOf(paymentRoute.toToken.address), 1); }
if(path.length === 2 && path[0] === Blockchains.solana.wrapped.address) {
return path[1]
} else {
return path[0]
}
};
const getMiddleTokenAccountAddress = async ({ paymentRoute })=>{
return await Token.solana.findProgramAddress({
token: getMiddleToken({ paymentRoute }),
owner: paymentRoute.fromAddress
})
};
const getMiddleTokenAccount = async ({ paymentRoute })=> {
return await request({
blockchain: 'solana',
address: await getMiddleTokenAccountAddress({ paymentRoute }),
api: Token.solana.TOKEN_LAYOUT,
cache: 1000
})
};
const createTokenMiddleAccount = async ({ paymentRoute })=>{
if(
paymentRoute.exchangeRoutes.length === 0 ||
getFixedPath(paymentRoute.exchangeRoutes[0].path).length <= 2
) {
return
}
const middleTokenAccount = await getMiddleTokenAccount({ paymentRoute });
if(middleTokenAccount) {
return
}
return Token.solana.createAssociatedTokenAccountInstruction({
token: getMiddleToken({ paymentRoute }),
owner: paymentRoute.fromAddress,
payer: paymentRoute.fromAddress,
})
};
const getPaymentSenderTokenAccountAddress = async ({ paymentRoute })=> {
return await Token.solana.findProgramAddress({
token: paymentRoute.fromToken.address,
owner: paymentRoute.fromAddress
})
};
const getPaymentReceiverTokenAccountAddress = async ({ paymentRoute })=> {
return await Token.solana.findProgramAddress({
token: paymentRoute.toToken.address,
owner: paymentRoute.toAddress
})
};
const getPaymentReceiverTokenAccount = async ({ paymentRoute })=> {
return await Token.solana.findAccount({
token: paymentRoute.toToken.address,
owner: paymentRoute.toAddress
})
};
const createPaymentReceiverAccount = async({ paymentRoute })=> {
if(paymentRoute.toToken.address === Blockchains.solana.currency.address) {
const payment