@swapkit/toolboxes 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-fazw0jvt.js +3 -0
- package/dist/chunk-fazw0jvt.js.map +9 -0
- package/dist/chunk-tvrdndbw.js +4 -0
- package/dist/chunk-tvrdndbw.js.map +9 -0
- package/dist/cosmos/index.cjs +3 -0
- package/dist/cosmos/index.cjs.map +19 -0
- package/dist/cosmos/index.js +3 -0
- package/dist/cosmos/index.js.map +19 -0
- package/dist/evm/index.cjs +3 -0
- package/dist/evm/index.cjs.map +24 -0
- package/dist/evm/index.js +3 -0
- package/dist/evm/index.js.map +24 -0
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +9 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +9 -0
- package/dist/radix/index.cjs +3 -0
- package/dist/radix/index.cjs.map +10 -0
- package/dist/radix/index.js +3 -0
- package/dist/radix/index.js.map +10 -0
- package/dist/solana/index.cjs +3 -0
- package/dist/solana/index.cjs.map +10 -0
- package/dist/solana/index.js +3 -0
- package/dist/solana/index.js.map +10 -0
- package/dist/substrate/index.cjs +3 -0
- package/dist/substrate/index.cjs.map +12 -0
- package/dist/substrate/index.js +3 -0
- package/dist/substrate/index.js.map +12 -0
- package/dist/utxo/index.cjs +3 -0
- package/dist/utxo/index.cjs.map +18 -0
- package/dist/utxo/index.js +3 -0
- package/dist/utxo/index.js.map +18 -0
- package/package.json +105 -0
- package/src/cosmos/index.ts +11 -0
- package/src/cosmos/thorchainUtils/addressFormat.ts +24 -0
- package/src/cosmos/thorchainUtils/index.ts +4 -0
- package/src/cosmos/thorchainUtils/messages.ts +244 -0
- package/src/cosmos/thorchainUtils/registry.ts +47 -0
- package/src/cosmos/thorchainUtils/types/client-types.ts +80 -0
- package/src/cosmos/thorchainUtils/types/index.ts +1 -0
- package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.js +2806 -0
- package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.ts +2802 -0
- package/src/cosmos/thorchainUtils/util.ts +46 -0
- package/src/cosmos/toolbox/BaseCosmosToolbox.ts +254 -0
- package/src/cosmos/toolbox/gaia.ts +39 -0
- package/src/cosmos/toolbox/getToolboxByChain.ts +29 -0
- package/src/cosmos/toolbox/kujira.ts +61 -0
- package/src/cosmos/toolbox/thorchain.ts +321 -0
- package/src/cosmos/types.ts +31 -0
- package/src/cosmos/util.ts +230 -0
- package/src/evm/__tests__/ethereum.test.ts +147 -0
- package/src/evm/api.ts +157 -0
- package/src/evm/contracts/eth/multicall.ts +165 -0
- package/src/evm/contracts/op/gasOracle.ts +151 -0
- package/src/evm/helpers.ts +145 -0
- package/src/evm/index.ts +20 -0
- package/src/evm/provider.ts +6 -0
- package/src/evm/toolbox/EVMToolbox.ts +662 -0
- package/src/evm/toolbox/arb.ts +61 -0
- package/src/evm/toolbox/avax.ts +36 -0
- package/src/evm/toolbox/base.ts +42 -0
- package/src/evm/toolbox/bsc.ts +34 -0
- package/src/evm/toolbox/eth.ts +44 -0
- package/src/evm/toolbox/getToolboxByChain.ts +42 -0
- package/src/evm/toolbox/matic.ts +42 -0
- package/src/evm/toolbox/op.ts +163 -0
- package/src/evm/types.ts +118 -0
- package/src/index.ts +0 -0
- package/src/radix/index.ts +151 -0
- package/src/radix/toolbox.ts +693 -0
- package/src/solana/index.ts +49 -0
- package/src/solana/toolbox.ts +272 -0
- package/src/substrate/index.ts +3 -0
- package/src/substrate/toolbox/baseSubstrateToolbox.ts +286 -0
- package/src/substrate/toolbox/index.ts +40 -0
- package/src/substrate/types/index.ts +2 -0
- package/src/substrate/types/network.ts +42 -0
- package/src/substrate/types/wallet.ts +78 -0
- package/src/utxo/helpers/api.ts +431 -0
- package/src/utxo/helpers/bchaddrjs.ts +177 -0
- package/src/utxo/helpers/coinselect.ts +96 -0
- package/src/utxo/helpers/index.ts +5 -0
- package/src/utxo/helpers/txSize.ts +104 -0
- package/src/utxo/helpers/utils.ts +45 -0
- package/src/utxo/index.ts +9 -0
- package/src/utxo/toolbox/bitcoinCash.ts +281 -0
- package/src/utxo/toolbox/index.ts +37 -0
- package/src/utxo/toolbox/utxo.ts +360 -0
- package/src/utxo/types.ts +70 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utxo/index.ts", "../src/utxo/toolbox/index.ts", "../src/utxo/toolbox/bitcoinCash.ts", "../src/utxo/helpers/api.ts", "../src/utxo/helpers/utils.ts", "../src/utxo/helpers/bchaddrjs.ts", "../src/utxo/helpers/coinselect.ts", "../src/utxo/helpers/txSize.ts", "../src/utxo/toolbox/utxo.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export { type Network, networks, Psbt, Transaction } from \"bitcoinjs-lib\";\n\n/**\n * Package\n */\nexport * from \"./toolbox/index\";\nexport * from \"./toolbox/utxo\";\nexport * from \"./helpers/index\";\nexport * from \"./types\";\n",
|
|
6
|
+
"import { Chain } from \"@swapkit/helpers\";\n\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { BaseUTXOToolbox } from \"./utxo\";\n\ntype ToolboxType = {\n BCH: typeof BCHToolbox;\n BTC: typeof BTCToolbox;\n DOGE: typeof DOGEToolbox;\n LTC: typeof LTCToolbox;\n DASH: typeof DASHToolbox;\n};\n\nexport const BCHToolbox = createBCHToolbox;\nexport const BTCToolbox = () => BaseUTXOToolbox(Chain.Bitcoin);\nexport const DASHToolbox = () => BaseUTXOToolbox(Chain.Dash);\nexport const DOGEToolbox = () => BaseUTXOToolbox(Chain.Dogecoin);\nexport const LTCToolbox = () => BaseUTXOToolbox(Chain.Litecoin);\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(chain: T): ToolboxType[T] => {\n switch (chain) {\n case Chain.BitcoinCash:\n return BCHToolbox as ToolboxType[T];\n case Chain.Bitcoin:\n return BTCToolbox as ToolboxType[T];\n case Chain.Dogecoin:\n return DOGEToolbox as ToolboxType[T];\n case Chain.Litecoin:\n return LTCToolbox as ToolboxType[T];\n case Chain.Dash:\n return DASHToolbox as ToolboxType[T];\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n\nexport { stripToCashAddress, stripPrefix, validateAddress } from \"./bitcoinCash\";\n",
|
|
7
|
+
"import * as secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport {\n HDNode,\n Transaction,\n TransactionBuilder,\n address as bchAddress,\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n} from \"@psf/bitcoincashjs-lib\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { Chain, DerivationPath, FeeOption, type UTXOChain } from \"@swapkit/helpers\";\nimport { Psbt } from \"bitcoinjs-lib\";\n\nimport {\n accumulative,\n Network as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getNetwork,\n getUtxoApi,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n TargetOutput,\n TransactionBuilderType,\n TransactionType,\n UTXOBuildTxParams,\n UTXOType,\n UTXOWalletTransferParams,\n} from \"../types\";\n\nimport { BaseUTXOToolbox } from \"./utxo\";\n\n// needed because TS can not infer types\ntype BCHMethods = {\n stripPrefix: (address: string) => string;\n stripToCashAddress: (address: string) => string;\n validateAddress: (address: string, chain?: UTXOChain) => boolean;\n createKeysForPath: (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => Promise<{ getAddress: (index?: number) => string }>;\n getAddressFromKeys: (keys: { getAddress: (index?: number) => string }) => string;\n buildBCHTx: (\n params: UTXOBuildTxParams,\n ) => Promise<{ builder: TransactionBuilderType; utxos: UTXOType[] }>;\n buildTx: (params: UTXOBuildTxParams) => Promise<{ psbt: Psbt }>;\n transfer: (\n params: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >,\n ) => Promise<string>;\n};\n\nconst chain = Chain.BitcoinCash as UTXOChain;\n\nexport const stripToCashAddress = (address: string) => stripPrefix(toCashAddress(address));\n\nconst buildBCHTx: BCHMethods[\"buildBCHTx\"] = async ({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n}) => {\n if (!validateAddress(recipient)) throw new Error(\"Invalid address\");\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const compiledMemo = memo ? compileMemo(memo) : null;\n\n const targetOutputs: TargetOutput[] = [];\n // output to recipient\n targetOutputs.push({ address: recipient, value: assetValue.getBaseValue(\"number\") });\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\n\n const builder = new TransactionBuilder(getNetwork(chain));\n\n await Promise.all(\n inputs.map(async (utxo: UTXOType) => {\n const txHex = await getUtxoApi(chain).getRawTx(utxo.hash);\n\n builder.addInput(Transaction.fromBuffer(Buffer.from(txHex, \"hex\")), utxo.index);\n }),\n );\n\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const outputScript = bchAddress.toOutputScript(toLegacyAddress(address), getNetwork(chain));\n\n builder.addOutput(outputScript, output.value);\n }\n\n // add output for memo\n if (compiledMemo) {\n builder.addOutput(compiledMemo, 0); // Add OP_RETURN {script, value}\n }\n\n return { builder, utxos: inputs };\n};\n\nconst transfer = async ({\n signTransaction,\n from,\n recipient,\n assetValue,\n broadcastTx,\n getFeeRates,\n ...rest\n}: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n> & {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n}) => {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"signTransaction must be provided\");\n\n const feeRate = rest.feeRate || (await getFeeRates())[FeeOption.Fast];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await buildBCHTx({\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n });\n\n const tx = await signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n};\n\nconst buildTx = async ({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n}: UTXOBuildTxParams) => {\n const recipientCashAddress = toCashAddress(recipient);\n if (!validateAddress(recipientCashAddress)) throw new Error(\"Invalid address\");\n\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const feeRateWhole = Number(feeRate.toFixed(0));\n const compiledMemo = memo ? compileMemo(memo) : null;\n\n const targetOutputs = [] as TargetOutput[];\n\n // output to recipient\n targetOutputs.push({\n address: toLegacyAddress(recipient),\n value: assetValue.getBaseValue(\"number\"),\n });\n\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 });\n }\n\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate: feeRateWhole,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\n const psbt = new Psbt({ network: getNetwork(chain) }); // Network-specific\n\n for (const { hash, index, witnessUtxo } of inputs) {\n psbt.addInput({ hash, index, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos, inputs: inputs as UTXOType[] };\n};\n\nexport const stripPrefix = (address: string) => address.replace(/(bchtest:|bitcoincash:)/, \"\");\n\nexport const validateAddress = (address: string) => {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n};\n\nconst createKeysForPath: BCHMethods[\"createKeysForPath\"] = async ({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n}) => {\n const { ECPairFactory } = await import(\"ecpair\");\n\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPairFactory(secp256k1).fromWIF(wif, network);\n }\n if (!phrase) throw new Error(\"No phrase provided\");\n\n const masterHDNode = HDNode.fromSeedBuffer(Buffer.from(mnemonicToSeedSync(phrase)), network);\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n // TODO: Figure out same pattern as in BTC\n // const testWif = keyPair.toWIF();\n // const k = ECPairFactory(secp256k1).fromWIF(testWif, network);\n // const a = payments.p2pkh({ pubkey: k.publicKey, network });\n\n return keyPair;\n};\n\nconst getAddressFromKeys = (keys: { getAddress: (index?: number) => string }) => {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n};\n\nexport const createBCHToolbox = (): Omit<\n ReturnType<typeof BaseUTXOToolbox>,\n \"getAddressFromKeys\" | \"transfer\" | \"createKeysForPath\"\n> &\n BCHMethods => {\n const { getBalance, ...toolbox } = BaseUTXOToolbox(Chain.BitcoinCash);\n\n return {\n ...toolbox,\n stripPrefix,\n stripToCashAddress,\n validateAddress,\n createKeysForPath,\n getAddressFromKeys,\n buildBCHTx,\n buildTx,\n getBalance: (address: string, _potentialScamFilter?: boolean) =>\n getBalance(stripPrefix(toCashAddress(address))),\n transfer: (\n params: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >,\n ) =>\n transfer({ ...params, getFeeRates: toolbox.getFeeRates, broadcastTx: toolbox.broadcastTx }),\n };\n};\n",
|
|
8
|
+
"import { Chain, RequestClient, SKConfig, type UTXOChain, warnOnce } from \"@swapkit/helpers\";\nimport { uniqid } from \"./utils\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new Error(`failed to broadcast a transaction: ${response.error?.message}`);\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new Error(\"Invalid transaction: the transaction amount was too low\");\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n try {\n const response = await RequestClient.get<BlockchairResponse<T>>(url);\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n } catch (error) {\n if (!apiKey) throw error;\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `&key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n }\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getConfirmedBalance({\n chain,\n address,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const response = await blockchairRequest<BlockchairMultipleBalancesResponse>(\n `${baseUrl(chain)}/addresses/balances?addresses=${address}`,\n apiKey,\n );\n\n return response[address] || 0;\n } catch (_error) {\n return 0;\n }\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash) throw new Error(\"txHash is required\");\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getConfirmedBalance: (address: string) => getConfirmedBalance({ chain, address, apiKey }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\ninterface BlockchairMultipleBalancesResponse {\n [key: string]: number;\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
|
|
9
|
+
"import { Chain, FeeOption } from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\n// @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\nimport coininfo from \"coininfo\";\n\nconst pid = typeof process !== \"undefined\" && process.pid ? process.pid.toString(36) : \"\";\n\nexport const getNetwork = (chain: Chain) => {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n default:\n throw new Error(\"Invalid chain\");\n }\n};\n\nexport const standardFeeRates = (rate: number) => ({\n [FeeOption.Average]: rate,\n [FeeOption.Fast]: rate * 1.5,\n [FeeOption.Fastest]: rate * 2.0,\n});\n\nlet last = 0;\nconst now = () => {\n const time = Date.now();\n const lastTime = last || time;\n last = lastTime;\n\n return time > last ? time : lastTime + 1;\n};\n\nexport const uniqid = () => pid + now().toString(36);\n",
|
|
10
|
+
"import base58check from \"bs58check\";\n// @ts-expect-error\nimport cashaddr from \"cashaddrjs\";\n\nenum Format {\n Legacy = \"legacy\",\n Bitpay = \"bitpay\",\n Cashaddr = \"cashaddr\",\n}\nenum Network {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 0,\n [Type.P2SH]: 5,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n [Format.Bitpay]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 28,\n [Type.P2SH]: 40,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n};\n\ntype DecodedType = {\n format: Format;\n network: Network;\n type: Type;\n hash: any;\n};\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction detectAddressNetwork(address: string) {\n return decodeAddress(address)?.network;\n}\n\nfunction toLegacyAddress(address: string): string {\n const decoded = decodeAddress(address);\n if (decoded?.format === Format.Legacy) {\n return address;\n }\n return encodeAsLegacy(decoded);\n}\n\nfunction toCashAddress(address: string): string {\n const decoded = decodeAddress(address);\n return encodeAsCashaddr(decoded);\n}\n\nfunction decodeAddress(address: string) {\n try {\n return decodeBase58Address(address);\n } catch (_error) {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n return decodeCashAddress(address);\n } catch (_error) {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n}\n\nfunction decodeBase58Address(address: string) {\n try {\n const payload = base58check.decode(address);\n\n // BASE_58_CHECK_PAYLOAD_LENGTH\n if (payload.length !== 21)\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2SH };\n\n default:\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch (_error) {\n // Try to decode as legacy if cashaddr decoding fails.\n }\n } else {\n const prefixes = [\"bitcoincash\", \"bchtest\", \"bchreg\"];\n for (const prefix of prefixes) {\n try {\n return decodeCashAddressWithPrefix(`${prefix}:${address}`);\n } catch (_error) {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n}\n\nfunction decodeCashAddressWithPrefix(address: string): DecodedType {\n try {\n const { hash, prefix, type } = cashaddr.decode(address);\n\n return {\n format: Format.Cashaddr,\n hash: Array.prototype.slice.call(hash, 0),\n network: prefix === \"bitcoincash\" ? Network.Mainnet : Network.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n}\n\nfunction encodeAsLegacy(decoded: DecodedType) {\n const versionByte = VERSION_BYTE[Format.Legacy][decoded.network][decoded.type];\n const buffer = Buffer.alloc(1 + decoded.hash.length);\n buffer[0] = versionByte;\n buffer.set(decoded.hash, 1);\n return base58check.encode(buffer);\n}\n\nfunction encodeAsCashaddr(decoded: DecodedType) {\n const prefix = decoded.network === Network.Mainnet ? \"bitcoincash\" : \"bchtest\";\n const type = decoded.type === Type.P2PKH ? \"P2PKH\" : \"P2SH\";\n const hash = new Uint8Array(decoded.hash);\n return cashaddr.encode(prefix, type, hash);\n}\n\nexport { detectAddressNetwork, isValidAddress, Network, toCashAddress, toLegacyAddress };\n",
|
|
11
|
+
"import { Chain, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n TX_OVERHEAD,\n UTXOScriptType,\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport const getDustThreshold = (chain: UTXOChain) => {\n switch (chain) {\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n return 550;\n case Chain.Dash:\n case Chain.Litecoin:\n return 5500;\n case Chain.Dogecoin:\n return 100000;\n default:\n throw new Error(\"Invalid Chain\");\n }\n};\n\nexport const accumulative = ({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain }) => {\n const feeRate = Math.ceil(initialFeeRate);\n\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n // skip input if adding it would cost more than input is worth\n const filteredInputs = inputs.filter((input) => getInputSize(input) * feeRate <= input.value);\n\n const txSizeWithoutInputs =\n TX_OVERHEAD + outputs.reduce((total, output) => total + getOutputSize(output, newTxType), 0);\n\n const amountToSend = outputs.reduce((total, output) => total + output.value, 0);\n\n let fees = txSizeWithoutInputs * feeRate;\n let inputsValue = 0;\n const inputsToUse: typeof inputs = [];\n\n for (const input of filteredInputs) {\n const inputSize = getInputSize(input);\n const inputFee = feeRate * inputSize;\n\n fees += inputFee;\n inputsValue += input.value;\n\n inputsToUse.push(input);\n\n const totalCost = fees + amountToSend;\n\n // we need more inputs\n if (inputsValue < totalCost) continue;\n\n const remainder = inputsValue - totalCost;\n\n const feeForExtraOutput = feeRate * getOutputSize({ address: \"\", value: 0 }, newTxType);\n\n // potential change address\n if (remainder > feeForExtraOutput) {\n const feeAfterExtraOutput = feeForExtraOutput + fees;\n const remainderAfterExtraOutput = inputsValue - (amountToSend + feeAfterExtraOutput);\n\n // is it worth a change output aka can we send it in the future?\n if (\n remainderAfterExtraOutput >\n Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))\n ) {\n return {\n inputs: inputsToUse,\n outputs: outputs.concat({ value: remainderAfterExtraOutput, address: \"\" }),\n fee: feeAfterExtraOutput,\n };\n }\n }\n return {\n inputs: inputsToUse,\n outputs,\n fee: fees,\n };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ inputs, outputs, feeRate }) };\n};\n",
|
|
12
|
+
"import { opcodes, script } from \"bitcoinjs-lib\";\n\nimport type {\n TargetOutput,\n UTXOCalculateTxSizeParams,\n UTXOInputWithScriptType,\n UTXOType,\n} from \"../types\";\n\n/**\n * Minimum transaction fee\n * 1000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/bitcoin/bitcoin/blob/db88db47278d2e7208c50d16ab10cb355067d071/src/validation.h#L56\n */\nexport const MIN_TX_FEE = 1000;\nexport const TX_OVERHEAD = 4 + 1 + 1 + 4; //10\nexport const OP_RETURN_OVERHEAD = 1 + 8 + 1; //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4; // 41\nconst TX_INPUT_PUBKEYHASH = 107;\n\nexport const compileMemo = (memo: string) => {\n const data = Buffer.from(memo, \"utf8\"); // converts MEMO to buffer\n return script.compile([opcodes.OP_RETURN as number, data]); // Compile OP_RETURN script\n};\n\nexport enum UTXOScriptType {\n P2PKH = \"P2PKH\", // legacy\n // P2SH = 'P2SH', // multisig\n P2WPKH = \"P2WPKH\", // bech32 - native segwit\n // P2TR = \"P2TR\", // taproot\n}\n\nexport const InputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 148,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 68,\n};\n\nexport const OutputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 34,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 31,\n};\n\nexport const getScriptTypeForAddress = (address: string) => {\n if (address.startsWith(\"bc1\") || address.startsWith(\"ltc1\")) {\n return UTXOScriptType.P2WPKH;\n }\n // if (address.startsWith('3') || address.startsWith('M')) {\n // return UTXOScriptType.P2SH;\n // }\n if (\n address.startsWith(\"1\") ||\n address.startsWith(\"3\") ||\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"X\") ||\n address.startsWith(\"D\") ||\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"q\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n throw new Error(\"Invalid address\");\n};\n\nexport const calculateTxSize = ({ inputs, outputs, feeRate }: UTXOCalculateTxSizeParams) => {\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n const inputSize = inputs\n .filter(\n (utxo) =>\n utxo.value >=\n InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate),\n )\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize =\n outputs?.reduce((total, output) => total + getOutputSize(output), 0) || OutputSizes[newTxType];\n\n return TX_OVERHEAD + inputSize + outputSize;\n};\n\nexport const getInputSize = (input: UTXOInputWithScriptType | UTXOType) => {\n if (\"type\" in input) {\n return InputSizes[input.type];\n }\n if (\"address\" in input && input.address) {\n return InputSizes[getScriptTypeForAddress(input.address as string)];\n }\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;\n};\n\nexport const getOutputSize = (output: TargetOutput, scriptType?: UTXOScriptType) => {\n if (output?.script) {\n return OP_RETURN_OVERHEAD + output.script.length + (output.script.length >= 74 ? 2 : 1);\n }\n if (scriptType) {\n return OutputSizes[scriptType];\n }\n return OutputSizes[UTXOScriptType.P2PKH];\n};\n",
|
|
13
|
+
"import * as secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n FeeOption,\n SwapKitNumber,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport { Psbt, address as btcLibAddress, initEccLib, payments } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\n\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getNetwork,\n getUtxoApi,\n standardFeeRates,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOBuildTxParams, UTXOType, UTXOWalletTransferParams } from \"../types\";\nimport { validateAddress as validateBCHAddress } from \"./bitcoinCash\";\nimport type { BCHToolbox, BTCToolbox, DASHToolbox, DOGEToolbox, LTCToolbox } from \"./index\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nasync function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n chain,\n}: { phrase?: string; wif?: string; derivationPath: string; chain: Chain }) {\n const { ECPairFactory } = await import(\"ecpair\");\n if (!(wif || phrase)) throw new Error(\"Either phrase or wif must be provided\");\n\n const factory = ECPairFactory(secp256k1);\n const network = getNetwork(chain);\n\n if (wif) return factory.fromWIF(wif, network);\n\n const seed = mnemonicToSeedSync(phrase as string);\n const master = HDKey.fromMasterSeed(seed, network).derive(derivationPath);\n if (!master.privateKey) throw new Error(\"Could not get private key from phrase\");\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n}\n\nfunction validateAddress({ address, chain }: { address: string; chain: UTXOChain }) {\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction getAddressFromKeys({ keys, chain }: { chain: UTXOChain; keys: ECPairInterface }) {\n if (!keys) throw new Error(\"Keys must be provided\");\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ pubkey: keys.publicKey, network: getNetwork(chain) });\n if (!address) throw new Error(\"Address not defined\");\n\n return address;\n}\n\nfunction transfer(chain: UTXOChain) {\n return async function transfer({\n signTransaction,\n from,\n memo,\n recipient,\n feeOptionKey,\n broadcastTx,\n feeRate,\n assetValue,\n }: UTXOWalletTransferParams<Psbt, Psbt>) {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"Sign transaction must be provided\");\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await buildTx(chain)({\n recipient,\n feeRate: txFeeRate,\n sender: from,\n fetchTxHex: nonSegwitChains.includes(chain),\n assetValue,\n memo,\n });\n const signedPsbt = await signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nconst getBalance = async ({ address, chain }: { address: string; chain: UTXOChain }) => {\n const baseBalance = await getUtxoApi(chain).getBalance(address);\n const balance = SwapKitNumber.fromBigInt(BigInt(baseBalance), BaseDecimal[chain]).getValue(\n \"string\",\n );\n const asset = AssetValue.from({ asset: `${chain}.${chain}`, value: balance });\n\n return [asset];\n};\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return standardFeeRates(suggestedFeeRate);\n}\n\nfunction getInputsAndTargetOutputs(chain: UTXOChain) {\n return async function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex = false,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n sender: string;\n fetchTxHex?: boolean;\n }) {\n const inputs = await getUtxoApi(chain).scanUTXOs({ address: sender, fetchTxHex });\n\n //1. add output amount and recipient to targets\n //2. add output memo to targets (optional)\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: Number(assetValue.bigIntValue) },\n ...(memo ? [{ address: \"\", script: compileMemo(memo), value: 0 }] : []),\n ],\n };\n };\n}\n\nexport function buildTx(chain: UTXOChain) {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n return async function buildTx({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n }: UTXOBuildTxParams): Promise<{\n psbt: Psbt;\n utxos: UTXOType[];\n inputs: UTXOType[];\n }> {\n const compiledMemo = memo ? compileMemo(memo) : null;\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex,\n });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, feeRate, chain });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Insufficient Balance for transaction\");\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n ...(!!utxo.witnessUtxo &&\n !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo }),\n ...(nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n }),\n });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n initEccLib(secp256k1);\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos: inputsAndOutputs.inputs, inputs };\n };\n}\n\nfunction getInputsOutputsFee(chain: UTXOChain) {\n return async function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n fetchTxHex = false,\n memo,\n recipient,\n from,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n from: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) {\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender: from,\n fetchTxHex,\n });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, feeRate: feeRateWhole, chain });\n };\n}\n\nfunction estimateMaxSendableAmount(chain: UTXOChain) {\n return async function estimateMaxSendableAmount({\n from,\n memo,\n feeRate,\n feeOptionKey = FeeOption.Fast,\n recipients = 1,\n }: {\n from: string;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n recipients?: number | TargetOutput[];\n }) {\n const addressData = await getUtxoApi(chain).getAddressData(from);\n const feeRateWhole = feeRate ? Math.ceil(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n const inputs = addressData?.utxo\n .map((utxo) => ({\n ...utxo,\n // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n hash: \"\",\n }))\n .filter(\n (utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole),\n );\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({\n chain,\n value: inputs.reduce((sum, utxo) => sum + utxo.value, 0),\n });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({\n address: from,\n value: 0,\n })) as TargetOutput[])\n : recipients;\n\n if (memo) {\n const compiledMemo = compileMemo(memo);\n outputs.push({ address: from, script: compiledMemo, value: 0 });\n }\n\n const txSize = calculateTxSize({ inputs, outputs, feeRate: feeRateWhole });\n\n const fee = txSize * feeRateWhole;\n\n return balance.sub(fee);\n };\n}\n\nexport const BaseUTXOToolbox = (chain: UTXOChain) => ({\n accumulative,\n calculateTxSize,\n getFeeRates: () => getFeeRates(chain),\n buildTx: buildTx(chain),\n transfer: transfer(chain),\n getInputsOutputsFee: getInputsOutputsFee(chain),\n\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n getAddressFromKeys: (keys: ECPairInterface) => getAddressFromKeys({ keys, chain }),\n validateAddress: (address: string) => validateAddress({ address, chain }),\n createKeysForPath: (params: any) => createKeysForPath({ ...params, chain }),\n\n getPrivateKeyFromMnemonic: async (params: {\n phrase: string;\n derivationPath: string;\n }) => {\n const keys = await createKeysForPath({ ...params, chain });\n return keys.toWIF();\n },\n\n getBalance: async (address: string, _potentialScamFilter?: boolean) =>\n getBalance({ address, chain }),\n\n estimateTransactionFee: async (params: {\n assetValue: AssetValue;\n recipient: string;\n from: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const getInputsFee = getInputsOutputsFee(chain);\n const inputFees = await getInputsFee(params);\n\n return AssetValue.from({\n chain,\n value: SwapKitNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\"),\n });\n },\n\n estimateMaxSendableAmount: async (params: any) => estimateMaxSendableAmount({ ...params, chain }),\n});\n\nexport function utxoValidateAddress({ chain, address }: { chain: UTXOChain; address: string }) {\n return chain === Chain.BitcoinCash\n ? validateBCHAddress(address)\n : validateAddress({ address, chain });\n}\n\nexport type BaseUTXOWallet = ReturnType<typeof BaseUTXOToolbox>;\ntype UTXOWalletType = {\n [Chain.Bitcoin]: ReturnType<typeof BTCToolbox>;\n [Chain.BitcoinCash]: ReturnType<typeof BCHToolbox>;\n [Chain.Dogecoin]: ReturnType<typeof DOGEToolbox>;\n [Chain.Litecoin]: ReturnType<typeof LTCToolbox>;\n [Chain.Dash]: ReturnType<typeof DASHToolbox>;\n};\nexport type UTXOWallets = { [chain in UTXOChain]: BaseUTXOWallet & UTXOWalletType[chain] };\n"
|
|
14
|
+
],
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "FF559E672E52B03064756E2164756E21",
|
|
17
|
+
"names": []
|
|
18
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "SwapKit - Toolboxes",
|
|
3
|
+
"files": [
|
|
4
|
+
"src/",
|
|
5
|
+
"dist/"
|
|
6
|
+
],
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@bitcoinerlab/secp256k1": "1.2.0",
|
|
9
|
+
"@cosmjs/amino": "0.33.0",
|
|
10
|
+
"@cosmjs/crypto": "0.33.0",
|
|
11
|
+
"@cosmjs/encoding": "0.33.0",
|
|
12
|
+
"@cosmjs/proto-signing": "0.33.0",
|
|
13
|
+
"@cosmjs/stargate": "0.33.0",
|
|
14
|
+
"@polkadot/api": "15.6.1",
|
|
15
|
+
"@polkadot/api-base": "15.6.1",
|
|
16
|
+
"@polkadot/keyring": "13.4.3",
|
|
17
|
+
"@polkadot/util": "13.4.3",
|
|
18
|
+
"@polkadot/util-crypto": "13.4.3",
|
|
19
|
+
"@psf/bitcoincashjs-lib": "4.0.3",
|
|
20
|
+
"@radixdlt/babylon-gateway-api-sdk": "1.9.2",
|
|
21
|
+
"@radixdlt/radix-dapp-toolkit": "2.2.1",
|
|
22
|
+
"@radixdlt/wallet-sdk": "1.0.1",
|
|
23
|
+
"@scure/base": "1.2.4",
|
|
24
|
+
"@scure/bip32": "1.6.2",
|
|
25
|
+
"@scure/bip39": "1.5.4",
|
|
26
|
+
"@solana/spl-memo": "0.2.5",
|
|
27
|
+
"@solana/spl-token": "0.4.12",
|
|
28
|
+
"@solana/spl-token-registry": "0.2.4574",
|
|
29
|
+
"@solana/web3.js": "1.98.0",
|
|
30
|
+
"@swapkit/helpers": "3.0.0-beta.0",
|
|
31
|
+
"base64-js": "1.5.1",
|
|
32
|
+
"bitcoinjs-lib": "6.1.7",
|
|
33
|
+
"bs58check": "4.0.0",
|
|
34
|
+
"cashaddrjs": "0.4.4",
|
|
35
|
+
"coininfo": "5.2.1",
|
|
36
|
+
"cosmjs-types": "0.9.0",
|
|
37
|
+
"ecpair": "2.1.0",
|
|
38
|
+
"ethers": "6.13.5",
|
|
39
|
+
"micro-key-producer": "0.7.5",
|
|
40
|
+
"protobufjs": "7.4.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@nomicfoundation/hardhat-ethers": "3.0.8",
|
|
44
|
+
"@nomicfoundation/hardhat-toolbox": "5.0.0",
|
|
45
|
+
"@polkadot/types": "15.6.1",
|
|
46
|
+
"@types/bn.js": "5.1.6",
|
|
47
|
+
"@types/crypto-js": "4.2.2",
|
|
48
|
+
"@types/elliptic": "6.4.18",
|
|
49
|
+
"hardhat": "2.22.18"
|
|
50
|
+
},
|
|
51
|
+
"exports": {
|
|
52
|
+
".": {
|
|
53
|
+
"default": "./dist/index.js",
|
|
54
|
+
"require": "./dist/index.cjs",
|
|
55
|
+
"types": "./src/index.ts"
|
|
56
|
+
},
|
|
57
|
+
"./cosmos": {
|
|
58
|
+
"default": "./dist/cosmos/index.js",
|
|
59
|
+
"require": "./dist/cosmos/index.cjs",
|
|
60
|
+
"types": "./src/cosmos/index.ts"
|
|
61
|
+
},
|
|
62
|
+
"./evm": {
|
|
63
|
+
"default": "./dist/evm/index.js",
|
|
64
|
+
"require": "./dist/evm/index.cjs",
|
|
65
|
+
"types": "./src/evm/index.ts"
|
|
66
|
+
},
|
|
67
|
+
"./radix": {
|
|
68
|
+
"default": "./dist/radix/index.js",
|
|
69
|
+
"require": "./dist/radix/index.cjs",
|
|
70
|
+
"types": "./src/radix/index.ts"
|
|
71
|
+
},
|
|
72
|
+
"./solana": {
|
|
73
|
+
"default": "./dist/solana/index.js",
|
|
74
|
+
"require": "./dist/solana/index.cjs",
|
|
75
|
+
"types": "./src/solana/index.ts"
|
|
76
|
+
},
|
|
77
|
+
"./substrate": {
|
|
78
|
+
"default": "./dist/substrate/index.js",
|
|
79
|
+
"require": "./dist/substrate/index.cjs",
|
|
80
|
+
"types": "./src/substrate/index.ts"
|
|
81
|
+
},
|
|
82
|
+
"./utxo": {
|
|
83
|
+
"default": "./dist/utxo/index.js",
|
|
84
|
+
"require": "./dist/utxo/index.cjs",
|
|
85
|
+
"types": "./src/utxo/index.ts"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"homepage": "https://github.com/thorswap/SwapKit",
|
|
89
|
+
"license": "Apache-2.0",
|
|
90
|
+
"name": "@swapkit/toolboxes",
|
|
91
|
+
"repository": {
|
|
92
|
+
"type": "git",
|
|
93
|
+
"url": "git+https://github.com/thorswap/SwapKit.git"
|
|
94
|
+
},
|
|
95
|
+
"scripts": {
|
|
96
|
+
"build": "bun run ./build.ts",
|
|
97
|
+
"clean": "rm -rf dist node_modules *.tsbuildinfo",
|
|
98
|
+
"lint": "biome check --write ./src",
|
|
99
|
+
"test": "echo 'bun test'",
|
|
100
|
+
"test:ci": "bun test --coverage",
|
|
101
|
+
"type-check": "tsc --noEmit"
|
|
102
|
+
},
|
|
103
|
+
"type": "module",
|
|
104
|
+
"version": "1.0.0-beta.0"
|
|
105
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package
|
|
3
|
+
*/
|
|
4
|
+
export * from "./thorchainUtils/index";
|
|
5
|
+
export * from "./toolbox/BaseCosmosToolbox";
|
|
6
|
+
export * from "./toolbox/gaia";
|
|
7
|
+
export * from "./toolbox/getToolboxByChain";
|
|
8
|
+
export * from "./toolbox/kujira";
|
|
9
|
+
export * from "./toolbox/thorchain";
|
|
10
|
+
export * from "./types";
|
|
11
|
+
export * from "./util";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { toBech32 } from "@cosmjs/encoding";
|
|
2
|
+
import { base64, bech32 } from "@scure/base";
|
|
3
|
+
import { fromByteArray, toByteArray } from "base64-js";
|
|
4
|
+
|
|
5
|
+
export function bech32ToBase64(address: string) {
|
|
6
|
+
return base64.encode(
|
|
7
|
+
Uint8Array.from(bech32.fromWords(bech32.decode(address as `${string}1${string}`).words)),
|
|
8
|
+
);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function base64ToBech32(address: string, prefix = "thor") {
|
|
12
|
+
return toBech32(prefix, base64.decode(address));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function toBase64(data: Uint8Array) {
|
|
16
|
+
return fromByteArray(data);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function fromBase64(base64String: string) {
|
|
20
|
+
if (!base64String.match(/^[a-zA-Z0-9+/]*={0,2}$/)) {
|
|
21
|
+
throw new Error("Invalid base64 string format");
|
|
22
|
+
}
|
|
23
|
+
return toByteArray(base64String);
|
|
24
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import type { TxBodyEncodeObject } from "@cosmjs/proto-signing";
|
|
2
|
+
import { AssetValue, Chain, ChainToChainId } from "@swapkit/helpers";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
createStargateClient,
|
|
6
|
+
getDefaultChainFee,
|
|
7
|
+
getDenomWithChain,
|
|
8
|
+
getMsgSendDenom,
|
|
9
|
+
} from "../util";
|
|
10
|
+
|
|
11
|
+
import { createDefaultAminoTypes, createDefaultRegistry } from "./registry";
|
|
12
|
+
import type { ThorchainDepositTxParams, ThorchainTransferTxParams } from "./types/client-types";
|
|
13
|
+
|
|
14
|
+
type MsgSend = ReturnType<typeof transferMsgAmino>;
|
|
15
|
+
type MsgDeposit = ReturnType<typeof depositMsgAmino>;
|
|
16
|
+
type DirectMsgSendForBroadcast = ReturnType<typeof parseAminoMessageForDirectSigning<MsgSend>>;
|
|
17
|
+
type DirectMsgDepositForBroadcast = ReturnType<
|
|
18
|
+
typeof parseAminoMessageForDirectSigning<MsgDeposit>
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
export const THORCHAIN_GAS_VALUE = getDefaultChainFee(Chain.THORChain).gas;
|
|
22
|
+
export const MAYA_GAS_VALUE = getDefaultChainFee(Chain.Maya).gas;
|
|
23
|
+
|
|
24
|
+
export const transferMsgAmino = ({
|
|
25
|
+
from,
|
|
26
|
+
recipient,
|
|
27
|
+
assetValue,
|
|
28
|
+
chain,
|
|
29
|
+
}: {
|
|
30
|
+
from: string;
|
|
31
|
+
recipient?: string;
|
|
32
|
+
assetValue: AssetValue;
|
|
33
|
+
chain: Chain.THORChain | Chain.Maya;
|
|
34
|
+
}) => ({
|
|
35
|
+
type: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgSend` as const,
|
|
36
|
+
value: {
|
|
37
|
+
from_address: from,
|
|
38
|
+
to_address: recipient,
|
|
39
|
+
amount: [
|
|
40
|
+
{
|
|
41
|
+
amount: assetValue.getBaseValue("string"),
|
|
42
|
+
denom: getMsgSendDenom(assetValue.symbol, true),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export const depositMsgAmino = ({
|
|
49
|
+
from,
|
|
50
|
+
assetValue,
|
|
51
|
+
memo = "",
|
|
52
|
+
chain,
|
|
53
|
+
}: {
|
|
54
|
+
from: string;
|
|
55
|
+
assetValue: AssetValue;
|
|
56
|
+
memo?: string;
|
|
57
|
+
chain: Chain.THORChain | Chain.Maya;
|
|
58
|
+
}) => {
|
|
59
|
+
return {
|
|
60
|
+
type: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgDeposit` as const,
|
|
61
|
+
value: {
|
|
62
|
+
coins: [
|
|
63
|
+
{
|
|
64
|
+
amount: assetValue.getBaseValue("string"),
|
|
65
|
+
asset: getDenomWithChain(assetValue),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
signer: from,
|
|
69
|
+
memo,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const buildAminoMsg = ({
|
|
75
|
+
from,
|
|
76
|
+
recipient,
|
|
77
|
+
assetValue,
|
|
78
|
+
memo,
|
|
79
|
+
chain,
|
|
80
|
+
}: {
|
|
81
|
+
from: string;
|
|
82
|
+
recipient?: string;
|
|
83
|
+
assetValue: AssetValue;
|
|
84
|
+
memo?: string;
|
|
85
|
+
chain: Chain.THORChain | Chain.Maya;
|
|
86
|
+
}) => {
|
|
87
|
+
const isDeposit = !recipient;
|
|
88
|
+
const msg = isDeposit
|
|
89
|
+
? depositMsgAmino({ from, assetValue, memo, chain })
|
|
90
|
+
: transferMsgAmino({ from, recipient, assetValue, chain });
|
|
91
|
+
|
|
92
|
+
return msg;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// TODO I think the msg typing is wrong it should be not prepared for broadcast
|
|
96
|
+
export const convertToSignable = async (
|
|
97
|
+
msg: DirectMsgDepositForBroadcast | DirectMsgSendForBroadcast | MsgSend | MsgDeposit,
|
|
98
|
+
chain: Chain.THORChain | Chain.Maya,
|
|
99
|
+
) => {
|
|
100
|
+
const aminoTypes = await createDefaultAminoTypes(chain);
|
|
101
|
+
|
|
102
|
+
return aminoTypes.fromAmino(msg);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const getAccount = async ({
|
|
106
|
+
rpcUrl,
|
|
107
|
+
from,
|
|
108
|
+
}: {
|
|
109
|
+
from: string;
|
|
110
|
+
rpcUrl: string;
|
|
111
|
+
}) => {
|
|
112
|
+
const client = await createStargateClient(rpcUrl);
|
|
113
|
+
|
|
114
|
+
const account = await client.getAccount(from);
|
|
115
|
+
|
|
116
|
+
if (!account) {
|
|
117
|
+
throw new Error("Account does not exist");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return account;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const buildTransferTx =
|
|
124
|
+
(rpcUrl: string) =>
|
|
125
|
+
async ({
|
|
126
|
+
from,
|
|
127
|
+
recipient,
|
|
128
|
+
assetValue,
|
|
129
|
+
memo = "",
|
|
130
|
+
chain,
|
|
131
|
+
asSignable = true,
|
|
132
|
+
asAminoMessage = false,
|
|
133
|
+
}: ThorchainTransferTxParams) => {
|
|
134
|
+
const account = await getAccount({ rpcUrl, from });
|
|
135
|
+
|
|
136
|
+
const transferMsg = transferMsgAmino({
|
|
137
|
+
from,
|
|
138
|
+
recipient,
|
|
139
|
+
assetValue,
|
|
140
|
+
chain,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
const msg = asSignable
|
|
144
|
+
? await convertToSignable(
|
|
145
|
+
asAminoMessage ? transferMsg : parseAminoMessageForDirectSigning(transferMsg),
|
|
146
|
+
chain,
|
|
147
|
+
)
|
|
148
|
+
: transferMsg;
|
|
149
|
+
|
|
150
|
+
const transaction = {
|
|
151
|
+
chainId: ChainToChainId[chain],
|
|
152
|
+
accountNumber: account.accountNumber,
|
|
153
|
+
sequence: account.sequence,
|
|
154
|
+
msgs: [msg],
|
|
155
|
+
fee: getDefaultChainFee(assetValue.chain as Chain.THORChain | Chain.Maya),
|
|
156
|
+
memo,
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
return transaction;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export const buildDepositTx =
|
|
163
|
+
(rpcUrl: string) =>
|
|
164
|
+
async ({
|
|
165
|
+
from,
|
|
166
|
+
assetValue,
|
|
167
|
+
memo = "",
|
|
168
|
+
chain,
|
|
169
|
+
asSignable = true,
|
|
170
|
+
asAminoMessage = false,
|
|
171
|
+
}: ThorchainDepositTxParams) => {
|
|
172
|
+
const account = await getAccount({ rpcUrl, from });
|
|
173
|
+
|
|
174
|
+
const depositMsg = depositMsgAmino({ from, assetValue, memo, chain });
|
|
175
|
+
|
|
176
|
+
const msg = asSignable
|
|
177
|
+
? await convertToSignable(
|
|
178
|
+
asAminoMessage ? depositMsg : parseAminoMessageForDirectSigning<MsgDeposit>(depositMsg),
|
|
179
|
+
chain,
|
|
180
|
+
)
|
|
181
|
+
: depositMsg;
|
|
182
|
+
|
|
183
|
+
const transaction = {
|
|
184
|
+
chainId: ChainToChainId[chain],
|
|
185
|
+
accountNumber: account.accountNumber,
|
|
186
|
+
sequence: account.sequence,
|
|
187
|
+
msgs: [msg],
|
|
188
|
+
fee: getDefaultChainFee(assetValue.chain as Chain.THORChain | Chain.Maya),
|
|
189
|
+
memo,
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
return transaction;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
export function parseAminoMessageForDirectSigning<T extends MsgDeposit | MsgSend>(msg: T) {
|
|
196
|
+
if (msg.type === "thorchain/MsgSend" || msg.type === "mayachain/MsgSend") return msg as MsgSend;
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
...msg,
|
|
200
|
+
value: {
|
|
201
|
+
...msg.value,
|
|
202
|
+
coins: (msg as MsgDeposit).value.coins.map((coin: { asset: string; amount: string }) => {
|
|
203
|
+
const assetValue = AssetValue.from({ asset: coin.asset });
|
|
204
|
+
|
|
205
|
+
const symbol = (
|
|
206
|
+
assetValue.isSynthetic ? assetValue.symbol.split("/")?.[1] : assetValue.symbol
|
|
207
|
+
)?.toUpperCase();
|
|
208
|
+
const chain = (
|
|
209
|
+
assetValue.isSynthetic ? assetValue.symbol.split("/")?.[0] : assetValue.chain
|
|
210
|
+
)?.toUpperCase();
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
...coin,
|
|
214
|
+
asset: {
|
|
215
|
+
chain,
|
|
216
|
+
symbol,
|
|
217
|
+
ticker: symbol,
|
|
218
|
+
synth: assetValue.isSynthetic,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}),
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export async function buildEncodedTxBody({
|
|
227
|
+
chain,
|
|
228
|
+
memo,
|
|
229
|
+
msgs,
|
|
230
|
+
}: {
|
|
231
|
+
msgs: DirectMsgDepositForBroadcast[] | DirectMsgSendForBroadcast[];
|
|
232
|
+
memo: string;
|
|
233
|
+
chain: Chain.THORChain | Chain.Maya;
|
|
234
|
+
}) {
|
|
235
|
+
const registry = await createDefaultRegistry();
|
|
236
|
+
const aminoTypes = await createDefaultAminoTypes(chain);
|
|
237
|
+
|
|
238
|
+
const signedTxBody: TxBodyEncodeObject = {
|
|
239
|
+
typeUrl: "/cosmos.tx.v1beta1.TxBody",
|
|
240
|
+
value: { memo, messages: msgs.map((msg) => aminoTypes.fromAmino(msg)) },
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
return registry.encode(signedTxBody);
|
|
244
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Chain } from "@swapkit/helpers";
|
|
2
|
+
import * as types from "../thorchainUtils/types/proto/MsgCompiled";
|
|
3
|
+
import { base64ToBech32, bech32ToBase64 } from "./addressFormat";
|
|
4
|
+
|
|
5
|
+
export async function createDefaultRegistry() {
|
|
6
|
+
const { Registry } = await import("@cosmjs/proto-signing");
|
|
7
|
+
const { defaultRegistryTypes } = await import("@cosmjs/stargate");
|
|
8
|
+
|
|
9
|
+
return new Registry([
|
|
10
|
+
...defaultRegistryTypes,
|
|
11
|
+
["/types.MsgSend", { ...types.default.types.MsgSend }],
|
|
12
|
+
["/types.MsgDeposit", { ...types.default.types.MsgDeposit }],
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function createDefaultAminoTypes(chain: Chain.THORChain | Chain.Maya) {
|
|
17
|
+
const { AminoTypes } = await import("@cosmjs/stargate");
|
|
18
|
+
|
|
19
|
+
return new AminoTypes({
|
|
20
|
+
"/types.MsgSend": {
|
|
21
|
+
aminoType: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgSend`,
|
|
22
|
+
toAmino: (params: any) => ({
|
|
23
|
+
from_address: base64ToBech32(params.fromAddress),
|
|
24
|
+
to_address: base64ToBech32(params.toAddress),
|
|
25
|
+
amount: [...params.amount],
|
|
26
|
+
}),
|
|
27
|
+
fromAmino: (params: any) => ({
|
|
28
|
+
fromAddress: bech32ToBase64(params.from_address),
|
|
29
|
+
toAddress: bech32ToBase64(params.to_address),
|
|
30
|
+
amount: [...params.amount],
|
|
31
|
+
}),
|
|
32
|
+
},
|
|
33
|
+
"/types.MsgDeposit": {
|
|
34
|
+
aminoType: `${chain === Chain.Maya ? "mayachain" : "thorchain"}/MsgDeposit`,
|
|
35
|
+
toAmino: (params: any) => ({
|
|
36
|
+
signer: base64ToBech32(params.signer),
|
|
37
|
+
memo: params.memo,
|
|
38
|
+
coins: [...params.coins],
|
|
39
|
+
}),
|
|
40
|
+
fromAmino: (params: any) => ({
|
|
41
|
+
signer: bech32ToBase64(params.signer),
|
|
42
|
+
memo: params.memo,
|
|
43
|
+
coins: [...params.coins],
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|