@xchainjs/xchain-doge 0.7.2 → 0.7.4
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/README.md +1 -1
- package/lib/const.d.ts +1 -1
- package/lib/index.esm.js +1 -1
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -73,7 +73,7 @@ You can specify own array of providers, whoch will be executed in array-order, t
|
|
|
73
73
|
### example sochain v3, blockcypher backup
|
|
74
74
|
|
|
75
75
|
```typescript
|
|
76
|
-
import { Client, defaultDogeParams, AssetDOGE, SochainDataProviders,
|
|
76
|
+
import { Client, defaultDogeParams, AssetDOGE, SochainDataProviders, blockcypherDataProviders } from '@xchainjs/xchain-doge'
|
|
77
77
|
import { SochainNetwork, SochainProvider } from '@xchainjs/xchain-utxo-providers'
|
|
78
78
|
import { Network, UtxoClientParams } from '@xchainjs/xchain-client'
|
|
79
79
|
|
package/lib/const.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { BlockcypherProvider, SochainProvider } from '@xchainjs/xchain-utxo-prov
|
|
|
8
8
|
*/
|
|
9
9
|
export declare const MIN_TX_FEE = 100000;
|
|
10
10
|
export declare const DOGE_DECIMAL = 8;
|
|
11
|
-
export declare const LOWER_FEE_BOUND =
|
|
11
|
+
export declare const LOWER_FEE_BOUND = 100;
|
|
12
12
|
export declare const UPPER_FEE_BOUND = 20000000;
|
|
13
13
|
/**
|
|
14
14
|
* Chain identifier for Dogecoin
|
package/lib/index.esm.js
CHANGED
|
@@ -38,7 +38,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
38
38
|
*/
|
|
39
39
|
const MIN_TX_FEE = 100000;
|
|
40
40
|
const DOGE_DECIMAL = 8;
|
|
41
|
-
const LOWER_FEE_BOUND =
|
|
41
|
+
const LOWER_FEE_BOUND = 100; // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md
|
|
42
42
|
const UPPER_FEE_BOUND = 20000000;
|
|
43
43
|
/**
|
|
44
44
|
* Chain identifier for Dogecoin
|
package/lib/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts","../src/blockcypher-api.ts"],"sourcesContent":["import { ExplorerProvider, Network } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\n/**\n * Minimum transaction fee\n * 100000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/dogecoin/dogecoin/blob/master/src/validation.h#L58\n */\nexport const MIN_TX_FEE = 100000\nexport const DOGE_DECIMAL = 8\nexport const LOWER_FEE_BOUND = 40_000\nexport const UPPER_FEE_BOUND = 20_000_000\n\n/**\n * Chain identifier for Dogecoin\n *\n */\nexport const DOGEChain = 'DOGE' as const\n\n/**\n * Base \"chain\" asset on dogecoin\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetDOGE: Asset = { chain: DOGEChain, symbol: 'DOGE', ticker: 'DOGE', synth: false }\n\n// https://blockchair.com/\n\nconst DOGE_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockchair.com/dogecoin',\n 'https://blockchair.com/dogecoin/address/%%ADDRESS%%',\n 'https://blockchair.com/dogecoin/transaction/%%TX_ID%%',\n)\nconst DOGE_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockexplorer.one/dogecoin/testnet',\n 'https://blockexplorer.one/dogecoin/testnet/address/%%ADDRESS%%',\n 'https://blockexplorer.one/dogecoin/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: DOGE_TESTNET_EXPLORER,\n [Network.Stagenet]: DOGE_MAINNET_EXPLORER,\n [Network.Mainnet]: DOGE_MAINNET_EXPLORER,\n}\n\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGETEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGE,\n)\nexport const sochainDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n\n//======================\n// Blockcypher\n//======================\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n DOGEChain,\n AssetDOGE,\n 8,\n BlockcypherNetwork.DOGE,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const blockcypherDataProviders = {\n [Network.Testnet]: undefined, //no provider here\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport function inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport function arrayAverage(array: number[]): number {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Dogecoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Dogecoin.networks.Network} The Doge network.\n */\nexport const dogeNetwork = (network: Network): Dogecoin.networks.Network => {\n switch (network) {\n case Network.Mainnet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Stagenet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Testnet: {\n // Latest coininfo on NPM doesn't contain dogetest config information\n const bip32 = {\n private: 0x04358394,\n public: 0x043587cf,\n }\n const test = coininfo.dogecoin.test\n test.versions.bip32 = bip32\n return test.toBitcoinJS()\n }\n }\n}\n\n/**\n * Validate the Doge address.\n *\n * @param {string} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Dogecoin.address.toOutputScript(address, dogeNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return ''\n case Network.Testnet:\n return 'n'\n }\n}\n","import {\n AssetInfo,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetDOGE,\n DOGEChain,\n DOGE_DECIMAL,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockcypherDataProviders,\n blockstreamExplorerProviders,\n} from './const'\nimport { LedgerTxInfo, LedgerTxInfoParams } from './types/ledger'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\nexport const defaultDogeParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [blockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `m/44'/3'/0'/0/`,\n [Network.Stagenet]: `m/44'/3'/0'/0/`,\n [Network.Testnet]: `m/44'/1'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Dogecoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n * Pass strict null as nodeAuth to disable auth for node json rpc\n *\n * @param {DogecoinClientParams} params\n */\n constructor(params = defaultDogeParams) {\n super(DOGEChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n const dogeKeys = this.getDogeKeys(this.phrase, index)\n\n const { address } = Dogecoin.payments.p2pkh({\n pubkey: dogeKeys.publicKey,\n network: dogeNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns Doge asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetDOGE,\n decimal: DOGE_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating Doge keys from the given phrase\n * */\n private getDogeKeys(phrase: string, index = 0): Dogecoin.ECPairInterface {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Dogecoin.bip32.fromSeed(seed, dogeNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Dogecoin.ECPair.fromPrivateKey(master.privateKey, { network: dogeNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n try {\n const response = await axios.get(`https://api.blockcypher.com/v1/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Transfer Doge.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\n const psbt = Dogecoin.Psbt.fromBase64(rawUnsignedTx, { maximumFeeRate: 7500000 })\n\n psbt.signAllInputs(dogeKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n return await this.roundRobinBroadcastTx(txHex)\n }\n\n /**\n * Build transcation.\n *\n * @param {BuildParams} params The transaction build options.\n * @returns {Transaction}\n * @deprecated\n */\n public buildTx = async ({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n }): Promise<{ psbt: Dogecoin.Psbt; utxos: UTXO[] }> => {\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n\n const utxos = await this.scanUTXOs(sender, false)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n //1. output to recipient\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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 psbt = new Dogecoin.Psbt({ network: Utils.dogeNetwork(this.network) }) // Network-specific\n // TODO: Doge recommended fees is greater than the recommended by Bitcoinjs-lib (for BTC),\n // so we need to increase the maximum fee rate. Currently, the fast rate fee is near ~750000sats/byte\n // https://thornode.ninerealms.com/thorchain/inbound_addresses?height=7526662 (09-27-2022)\n // For now we increase it by 10x\n psbt.setMaximumFeeRate(7500000)\n // const params = { sochainUrl, network, address: sender }\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n nonWitnessUtxo: Buffer.from(utxo.txHex, 'hex'),\n })\n }\n\n // Outputs\n outputs.forEach((output: Dogecoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change address\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos }\n }\n\n /**\n * Create transaction info.\n *\n * @param {LedgerTxInfoParams} params The transaction build options.\n * @returns {LedgerTxInfo} The transaction info used for ledger sign.\n * @deprecated\n */\n public async createTxInfo(params: LedgerTxInfoParams): Promise<LedgerTxInfo> {\n const { psbt, utxos } = await this.buildTx(params)\n const ledgerTxInfo: LedgerTxInfo = {\n utxos,\n newTxHex: psbt.data.globalMap.unsignedTx.toBuffer().toString('hex'),\n }\n return ledgerTxInfo\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a) => a + Utils.inputBytes(), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs + // +1 byte for each input signature\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n}\n\nexport { Client }\n","import { Network } from '@xchainjs/xchain-client'\nimport axios from 'axios'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\n/**\n * Get Dogecoin suggested transaction fee.\n *\n * @returns {number} The Dogecoin suggested transaction fee per bytes in sat.\n */\nexport const getSuggestedTxFee = async ({ blockcypherUrl }: { blockcypherUrl: string }): Promise<number> => {\n try {\n const response = await axios.get(`${blockcypherUrl}/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n}\n\nexport const getSendTxUrl = ({ blockcypherUrl, network }: { blockcypherUrl: string; network: Network }) => {\n if (network === 'testnet') {\n throw new Error('Testnet URL is not available for blockcypher')\n } else {\n return `${blockcypherUrl}/doge/main/txs/push`\n }\n}\n"],"names":["Utils.dogeNetwork","dogeNetwork","Utils.validateAddress","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts","../src/blockcypher-api.ts"],"sourcesContent":["import { ExplorerProvider, Network } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\n/**\n * Minimum transaction fee\n * 100000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/dogecoin/dogecoin/blob/master/src/validation.h#L58\n */\nexport const MIN_TX_FEE = 100000\nexport const DOGE_DECIMAL = 8\nexport const LOWER_FEE_BOUND = 100 // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md\nexport const UPPER_FEE_BOUND = 20_000_000\n\n/**\n * Chain identifier for Dogecoin\n *\n */\nexport const DOGEChain = 'DOGE' as const\n\n/**\n * Base \"chain\" asset on dogecoin\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetDOGE: Asset = { chain: DOGEChain, symbol: 'DOGE', ticker: 'DOGE', synth: false }\n\n// https://blockchair.com/\n\nconst DOGE_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockchair.com/dogecoin',\n 'https://blockchair.com/dogecoin/address/%%ADDRESS%%',\n 'https://blockchair.com/dogecoin/transaction/%%TX_ID%%',\n)\nconst DOGE_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockexplorer.one/dogecoin/testnet',\n 'https://blockexplorer.one/dogecoin/testnet/address/%%ADDRESS%%',\n 'https://blockexplorer.one/dogecoin/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: DOGE_TESTNET_EXPLORER,\n [Network.Stagenet]: DOGE_MAINNET_EXPLORER,\n [Network.Mainnet]: DOGE_MAINNET_EXPLORER,\n}\n\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGETEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGE,\n)\nexport const sochainDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n\n//======================\n// Blockcypher\n//======================\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n DOGEChain,\n AssetDOGE,\n 8,\n BlockcypherNetwork.DOGE,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const blockcypherDataProviders = {\n [Network.Testnet]: undefined, //no provider here\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport function inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport function arrayAverage(array: number[]): number {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Dogecoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Dogecoin.networks.Network} The Doge network.\n */\nexport const dogeNetwork = (network: Network): Dogecoin.networks.Network => {\n switch (network) {\n case Network.Mainnet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Stagenet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Testnet: {\n // Latest coininfo on NPM doesn't contain dogetest config information\n const bip32 = {\n private: 0x04358394,\n public: 0x043587cf,\n }\n const test = coininfo.dogecoin.test\n test.versions.bip32 = bip32\n return test.toBitcoinJS()\n }\n }\n}\n\n/**\n * Validate the Doge address.\n *\n * @param {string} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Dogecoin.address.toOutputScript(address, dogeNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return ''\n case Network.Testnet:\n return 'n'\n }\n}\n","import {\n AssetInfo,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetDOGE,\n DOGEChain,\n DOGE_DECIMAL,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockcypherDataProviders,\n blockstreamExplorerProviders,\n} from './const'\nimport { LedgerTxInfo, LedgerTxInfoParams } from './types/ledger'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\nexport const defaultDogeParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [blockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `m/44'/3'/0'/0/`,\n [Network.Stagenet]: `m/44'/3'/0'/0/`,\n [Network.Testnet]: `m/44'/1'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Dogecoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n * Pass strict null as nodeAuth to disable auth for node json rpc\n *\n * @param {DogecoinClientParams} params\n */\n constructor(params = defaultDogeParams) {\n super(DOGEChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n const dogeKeys = this.getDogeKeys(this.phrase, index)\n\n const { address } = Dogecoin.payments.p2pkh({\n pubkey: dogeKeys.publicKey,\n network: dogeNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns Doge asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetDOGE,\n decimal: DOGE_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating Doge keys from the given phrase\n * */\n private getDogeKeys(phrase: string, index = 0): Dogecoin.ECPairInterface {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Dogecoin.bip32.fromSeed(seed, dogeNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Dogecoin.ECPair.fromPrivateKey(master.privateKey, { network: dogeNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n try {\n const response = await axios.get(`https://api.blockcypher.com/v1/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Transfer Doge.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\n const psbt = Dogecoin.Psbt.fromBase64(rawUnsignedTx, { maximumFeeRate: 7500000 })\n\n psbt.signAllInputs(dogeKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n return await this.roundRobinBroadcastTx(txHex)\n }\n\n /**\n * Build transcation.\n *\n * @param {BuildParams} params The transaction build options.\n * @returns {Transaction}\n * @deprecated\n */\n public buildTx = async ({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n }): Promise<{ psbt: Dogecoin.Psbt; utxos: UTXO[] }> => {\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n\n const utxos = await this.scanUTXOs(sender, false)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n //1. output to recipient\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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 psbt = new Dogecoin.Psbt({ network: Utils.dogeNetwork(this.network) }) // Network-specific\n // TODO: Doge recommended fees is greater than the recommended by Bitcoinjs-lib (for BTC),\n // so we need to increase the maximum fee rate. Currently, the fast rate fee is near ~750000sats/byte\n // https://thornode.ninerealms.com/thorchain/inbound_addresses?height=7526662 (09-27-2022)\n // For now we increase it by 10x\n psbt.setMaximumFeeRate(7500000)\n // const params = { sochainUrl, network, address: sender }\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n nonWitnessUtxo: Buffer.from(utxo.txHex, 'hex'),\n })\n }\n\n // Outputs\n outputs.forEach((output: Dogecoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change address\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos }\n }\n\n /**\n * Create transaction info.\n *\n * @param {LedgerTxInfoParams} params The transaction build options.\n * @returns {LedgerTxInfo} The transaction info used for ledger sign.\n * @deprecated\n */\n public async createTxInfo(params: LedgerTxInfoParams): Promise<LedgerTxInfo> {\n const { psbt, utxos } = await this.buildTx(params)\n const ledgerTxInfo: LedgerTxInfo = {\n utxos,\n newTxHex: psbt.data.globalMap.unsignedTx.toBuffer().toString('hex'),\n }\n return ledgerTxInfo\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a) => a + Utils.inputBytes(), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs + // +1 byte for each input signature\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n}\n\nexport { Client }\n","import { Network } from '@xchainjs/xchain-client'\nimport axios from 'axios'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\n/**\n * Get Dogecoin suggested transaction fee.\n *\n * @returns {number} The Dogecoin suggested transaction fee per bytes in sat.\n */\nexport const getSuggestedTxFee = async ({ blockcypherUrl }: { blockcypherUrl: string }): Promise<number> => {\n try {\n const response = await axios.get(`${blockcypherUrl}/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n}\n\nexport const getSendTxUrl = ({ blockcypherUrl, network }: { blockcypherUrl: string; network: Network }) => {\n if (network === 'testnet') {\n throw new Error('Testnet URL is not available for blockcypher')\n } else {\n return `${blockcypherUrl}/doge/main/txs/push`\n }\n}\n"],"names":["Utils.dogeNetwork","dogeNetwork","Utils.validateAddress","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -67,7 +67,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
67
67
|
*/
|
|
68
68
|
const MIN_TX_FEE = 100000;
|
|
69
69
|
const DOGE_DECIMAL = 8;
|
|
70
|
-
const LOWER_FEE_BOUND =
|
|
70
|
+
const LOWER_FEE_BOUND = 100; // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md
|
|
71
71
|
const UPPER_FEE_BOUND = 20000000;
|
|
72
72
|
/**
|
|
73
73
|
* Chain identifier for Dogecoin
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts","../src/blockcypher-api.ts"],"sourcesContent":["import { ExplorerProvider, Network } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\n/**\n * Minimum transaction fee\n * 100000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/dogecoin/dogecoin/blob/master/src/validation.h#L58\n */\nexport const MIN_TX_FEE = 100000\nexport const DOGE_DECIMAL = 8\nexport const LOWER_FEE_BOUND = 40_000\nexport const UPPER_FEE_BOUND = 20_000_000\n\n/**\n * Chain identifier for Dogecoin\n *\n */\nexport const DOGEChain = 'DOGE' as const\n\n/**\n * Base \"chain\" asset on dogecoin\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetDOGE: Asset = { chain: DOGEChain, symbol: 'DOGE', ticker: 'DOGE', synth: false }\n\n// https://blockchair.com/\n\nconst DOGE_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockchair.com/dogecoin',\n 'https://blockchair.com/dogecoin/address/%%ADDRESS%%',\n 'https://blockchair.com/dogecoin/transaction/%%TX_ID%%',\n)\nconst DOGE_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockexplorer.one/dogecoin/testnet',\n 'https://blockexplorer.one/dogecoin/testnet/address/%%ADDRESS%%',\n 'https://blockexplorer.one/dogecoin/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: DOGE_TESTNET_EXPLORER,\n [Network.Stagenet]: DOGE_MAINNET_EXPLORER,\n [Network.Mainnet]: DOGE_MAINNET_EXPLORER,\n}\n\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGETEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGE,\n)\nexport const sochainDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n\n//======================\n// Blockcypher\n//======================\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n DOGEChain,\n AssetDOGE,\n 8,\n BlockcypherNetwork.DOGE,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const blockcypherDataProviders = {\n [Network.Testnet]: undefined, //no provider here\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport function inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport function arrayAverage(array: number[]): number {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Dogecoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Dogecoin.networks.Network} The Doge network.\n */\nexport const dogeNetwork = (network: Network): Dogecoin.networks.Network => {\n switch (network) {\n case Network.Mainnet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Stagenet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Testnet: {\n // Latest coininfo on NPM doesn't contain dogetest config information\n const bip32 = {\n private: 0x04358394,\n public: 0x043587cf,\n }\n const test = coininfo.dogecoin.test\n test.versions.bip32 = bip32\n return test.toBitcoinJS()\n }\n }\n}\n\n/**\n * Validate the Doge address.\n *\n * @param {string} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Dogecoin.address.toOutputScript(address, dogeNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return ''\n case Network.Testnet:\n return 'n'\n }\n}\n","import {\n AssetInfo,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetDOGE,\n DOGEChain,\n DOGE_DECIMAL,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockcypherDataProviders,\n blockstreamExplorerProviders,\n} from './const'\nimport { LedgerTxInfo, LedgerTxInfoParams } from './types/ledger'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\nexport const defaultDogeParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [blockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `m/44'/3'/0'/0/`,\n [Network.Stagenet]: `m/44'/3'/0'/0/`,\n [Network.Testnet]: `m/44'/1'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Dogecoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n * Pass strict null as nodeAuth to disable auth for node json rpc\n *\n * @param {DogecoinClientParams} params\n */\n constructor(params = defaultDogeParams) {\n super(DOGEChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n const dogeKeys = this.getDogeKeys(this.phrase, index)\n\n const { address } = Dogecoin.payments.p2pkh({\n pubkey: dogeKeys.publicKey,\n network: dogeNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns Doge asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetDOGE,\n decimal: DOGE_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating Doge keys from the given phrase\n * */\n private getDogeKeys(phrase: string, index = 0): Dogecoin.ECPairInterface {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Dogecoin.bip32.fromSeed(seed, dogeNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Dogecoin.ECPair.fromPrivateKey(master.privateKey, { network: dogeNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n try {\n const response = await axios.get(`https://api.blockcypher.com/v1/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Transfer Doge.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\n const psbt = Dogecoin.Psbt.fromBase64(rawUnsignedTx, { maximumFeeRate: 7500000 })\n\n psbt.signAllInputs(dogeKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n return await this.roundRobinBroadcastTx(txHex)\n }\n\n /**\n * Build transcation.\n *\n * @param {BuildParams} params The transaction build options.\n * @returns {Transaction}\n * @deprecated\n */\n public buildTx = async ({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n }): Promise<{ psbt: Dogecoin.Psbt; utxos: UTXO[] }> => {\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n\n const utxos = await this.scanUTXOs(sender, false)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n //1. output to recipient\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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 psbt = new Dogecoin.Psbt({ network: Utils.dogeNetwork(this.network) }) // Network-specific\n // TODO: Doge recommended fees is greater than the recommended by Bitcoinjs-lib (for BTC),\n // so we need to increase the maximum fee rate. Currently, the fast rate fee is near ~750000sats/byte\n // https://thornode.ninerealms.com/thorchain/inbound_addresses?height=7526662 (09-27-2022)\n // For now we increase it by 10x\n psbt.setMaximumFeeRate(7500000)\n // const params = { sochainUrl, network, address: sender }\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n nonWitnessUtxo: Buffer.from(utxo.txHex, 'hex'),\n })\n }\n\n // Outputs\n outputs.forEach((output: Dogecoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change address\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos }\n }\n\n /**\n * Create transaction info.\n *\n * @param {LedgerTxInfoParams} params The transaction build options.\n * @returns {LedgerTxInfo} The transaction info used for ledger sign.\n * @deprecated\n */\n public async createTxInfo(params: LedgerTxInfoParams): Promise<LedgerTxInfo> {\n const { psbt, utxos } = await this.buildTx(params)\n const ledgerTxInfo: LedgerTxInfo = {\n utxos,\n newTxHex: psbt.data.globalMap.unsignedTx.toBuffer().toString('hex'),\n }\n return ledgerTxInfo\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a) => a + Utils.inputBytes(), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs + // +1 byte for each input signature\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n}\n\nexport { Client }\n","import { Network } from '@xchainjs/xchain-client'\nimport axios from 'axios'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\n/**\n * Get Dogecoin suggested transaction fee.\n *\n * @returns {number} The Dogecoin suggested transaction fee per bytes in sat.\n */\nexport const getSuggestedTxFee = async ({ blockcypherUrl }: { blockcypherUrl: string }): Promise<number> => {\n try {\n const response = await axios.get(`${blockcypherUrl}/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n}\n\nexport const getSendTxUrl = ({ blockcypherUrl, network }: { blockcypherUrl: string; network: Network }) => {\n if (network === 'testnet') {\n throw new Error('Testnet URL is not available for blockcypher')\n } else {\n return `${blockcypherUrl}/doge/main/txs/push`\n }\n}\n"],"names":["ExplorerProvider","Network","SochainProvider","SochainNetwork","BlockcypherProvider","BlockcypherNetwork","coininfo","Dogecoin","UTXOClient","accumulative","Utils.dogeNetwork","dogeNetwork","getSeed","Utils.validateAddress","axios","checkFeeBounds","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/const.ts","../src/utils.ts","../src/client.ts","../src/blockcypher-api.ts"],"sourcesContent":["import { ExplorerProvider, Network } from '@xchainjs/xchain-client'\nimport { Asset } from '@xchainjs/xchain-util'\nimport {\n BlockcypherNetwork,\n BlockcypherProvider,\n SochainNetwork,\n SochainProvider,\n} from '@xchainjs/xchain-utxo-providers'\n/**\n * Minimum transaction fee\n * 100000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/dogecoin/dogecoin/blob/master/src/validation.h#L58\n */\nexport const MIN_TX_FEE = 100000\nexport const DOGE_DECIMAL = 8\nexport const LOWER_FEE_BOUND = 100 // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md\nexport const UPPER_FEE_BOUND = 20_000_000\n\n/**\n * Chain identifier for Dogecoin\n *\n */\nexport const DOGEChain = 'DOGE' as const\n\n/**\n * Base \"chain\" asset on dogecoin\n *\n * Based on definition in Thorchain `common`\n * @see https://gitlab.com/thorchain/thornode/-/blob/master/common/asset.go#L12-24\n */\nexport const AssetDOGE: Asset = { chain: DOGEChain, symbol: 'DOGE', ticker: 'DOGE', synth: false }\n\n// https://blockchair.com/\n\nconst DOGE_MAINNET_EXPLORER = new ExplorerProvider(\n 'https://blockchair.com/dogecoin',\n 'https://blockchair.com/dogecoin/address/%%ADDRESS%%',\n 'https://blockchair.com/dogecoin/transaction/%%TX_ID%%',\n)\nconst DOGE_TESTNET_EXPLORER = new ExplorerProvider(\n 'https://blockexplorer.one/dogecoin/testnet',\n 'https://blockexplorer.one/dogecoin/testnet/address/%%ADDRESS%%',\n 'https://blockexplorer.one/dogecoin/testnet/tx/%%TX_ID%%',\n)\nexport const blockstreamExplorerProviders = {\n [Network.Testnet]: DOGE_TESTNET_EXPLORER,\n [Network.Stagenet]: DOGE_MAINNET_EXPLORER,\n [Network.Mainnet]: DOGE_MAINNET_EXPLORER,\n}\n\n//======================\n// sochain\n//======================\n\nconst testnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGETEST,\n)\nconst mainnetSochainProvider = new SochainProvider(\n 'https://sochain.com/api/v3',\n process.env['SOCHAIN_API_KEY'] || '',\n DOGEChain,\n AssetDOGE,\n 8,\n SochainNetwork.DOGE,\n)\nexport const sochainDataProviders = {\n [Network.Testnet]: testnetSochainProvider,\n [Network.Stagenet]: mainnetSochainProvider,\n [Network.Mainnet]: mainnetSochainProvider,\n}\n\n//======================\n// Blockcypher\n//======================\n\nconst mainnetBlockcypherProvider = new BlockcypherProvider(\n 'https://api.blockcypher.com/v1',\n DOGEChain,\n AssetDOGE,\n 8,\n BlockcypherNetwork.DOGE,\n process.env['BlOCKCYPHER_API_KEY'] || '',\n)\nexport const blockcypherDataProviders = {\n [Network.Testnet]: undefined, //no provider here\n [Network.Stagenet]: mainnetBlockcypherProvider,\n [Network.Mainnet]: mainnetBlockcypherProvider,\n}\n","import { Network } from '@xchainjs/xchain-client'\nimport { Address } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nexport const TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nexport const TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nexport const TX_INPUT_PUBKEYHASH = 107\nexport const TX_OUTPUT_BASE = 8 + 1 //9\nexport const TX_OUTPUT_PUBKEYHASH = 25\n\nexport function inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Get the average value of an array.\n *\n * @param {number[]} array\n * @returns {number} The average value.\n */\nexport function arrayAverage(array: number[]): number {\n let sum = 0\n array.forEach((value) => (sum += value))\n return sum / array.length\n}\n\n/**\n * Get Dogecoin network to be used with bitcoinjs.\n *\n * @param {Network} network\n * @returns {Dogecoin.networks.Network} The Doge network.\n */\nexport const dogeNetwork = (network: Network): Dogecoin.networks.Network => {\n switch (network) {\n case Network.Mainnet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Stagenet:\n return coininfo.dogecoin.main.toBitcoinJS()\n case Network.Testnet: {\n // Latest coininfo on NPM doesn't contain dogetest config information\n const bip32 = {\n private: 0x04358394,\n public: 0x043587cf,\n }\n const test = coininfo.dogecoin.test\n test.versions.bip32 = bip32\n return test.toBitcoinJS()\n }\n }\n}\n\n/**\n * Validate the Doge address.\n *\n * @param {string} address\n * @param {Network} network\n * @returns {boolean} `true` or `false`.\n */\nexport const validateAddress = (address: Address, network: Network): boolean => {\n try {\n Dogecoin.address.toOutputScript(address, dogeNetwork(network))\n return true\n } catch (error) {\n return false\n }\n}\n\n/**\n * Get address prefix based on the network.\n *\n * @param {Network} network\n * @returns {string} The address prefix based on the network.\n *\n **/\nexport const getPrefix = (network: Network) => {\n switch (network) {\n case Network.Mainnet:\n case Network.Stagenet:\n return ''\n case Network.Testnet:\n return 'n'\n }\n}\n","import {\n AssetInfo,\n FeeRate,\n Network,\n PreparedTx,\n TxHash,\n TxParams,\n UTXO,\n UTXOClient,\n UtxoClientParams,\n checkFeeBounds,\n} from '@xchainjs/xchain-client'\nimport { getSeed } from '@xchainjs/xchain-crypto'\nimport { Address } from '@xchainjs/xchain-util'\nimport axios from 'axios'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport accumulative from 'coinselect/accumulative'\n\nimport {\n AssetDOGE,\n DOGEChain,\n DOGE_DECIMAL,\n LOWER_FEE_BOUND,\n MIN_TX_FEE,\n UPPER_FEE_BOUND,\n blockcypherDataProviders,\n blockstreamExplorerProviders,\n} from './const'\nimport { LedgerTxInfo, LedgerTxInfoParams } from './types/ledger'\nimport * as Utils from './utils'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\nexport const defaultDogeParams: UtxoClientParams = {\n network: Network.Mainnet,\n phrase: '',\n explorerProviders: blockstreamExplorerProviders,\n dataProviders: [blockcypherDataProviders],\n rootDerivationPaths: {\n [Network.Mainnet]: `m/44'/3'/0'/0/`,\n [Network.Stagenet]: `m/44'/3'/0'/0/`,\n [Network.Testnet]: `m/44'/1'/0'/0/`,\n },\n feeBounds: {\n lower: LOWER_FEE_BOUND,\n upper: UPPER_FEE_BOUND,\n },\n}\n/**\n * Custom Dogecoin client\n */\nclass Client extends UTXOClient {\n /**\n * Constructor\n * Client is initialised with network type\n * Pass strict null as nodeAuth to disable auth for node json rpc\n *\n * @param {DogecoinClientParams} params\n */\n constructor(params = defaultDogeParams) {\n super(DOGEChain, {\n network: params.network,\n rootDerivationPaths: params.rootDerivationPaths,\n phrase: params.phrase,\n feeBounds: params.feeBounds,\n explorerProviders: params.explorerProviders,\n dataProviders: params.dataProviders,\n })\n }\n\n /**\n * Get the current address.\n *\n * Generates a network-specific key-pair by first converting the buffer to a Wallet-Import-Format (WIF)\n * The address is then decoded into type P2WPKH and returned.\n *\n * @returns {Address} The current address.\n *\n * @throws {\"Phrase must be provided\"} Thrown if phrase has not been set before.\n * @throws {\"Address not defined\"} Thrown if failed creating account from phrase.\n */\n getAddress(index = 0): Address {\n if (index < 0) {\n throw new Error('index must be greater than zero')\n }\n if (this.phrase) {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n const dogeKeys = this.getDogeKeys(this.phrase, index)\n\n const { address } = Dogecoin.payments.p2pkh({\n pubkey: dogeKeys.publicKey,\n network: dogeNetwork,\n })\n if (!address) {\n throw new Error('Address not defined')\n }\n return address\n }\n throw new Error('Phrase must be provided')\n }\n\n /**\n *\n * @returns Doge asset info\n */\n getAssetInfo(): AssetInfo {\n const assetInfo: AssetInfo = {\n asset: AssetDOGE,\n decimal: DOGE_DECIMAL,\n }\n return assetInfo\n }\n\n /**\n * @private\n * Get private key.\n *\n * Private function to get keyPair from the this.phrase\n *\n * @param {string} phrase The phrase to be used for generating privkey\n * @returns {ECPairInterface} The privkey generated from the given phrase\n *\n * @throws {\"Could not get private key from phrase\"} Throws an error if failed creating Doge keys from the given phrase\n * */\n private getDogeKeys(phrase: string, index = 0): Dogecoin.ECPairInterface {\n const dogeNetwork = Utils.dogeNetwork(this.network)\n\n const seed = getSeed(phrase)\n const master = Dogecoin.bip32.fromSeed(seed, dogeNetwork).derivePath(this.getFullDerivationPath(index))\n\n if (!master.privateKey) {\n throw new Error('Could not get private key from phrase')\n }\n\n return Dogecoin.ECPair.fromPrivateKey(master.privateKey, { network: dogeNetwork })\n }\n\n /**\n * Validate the given address.\n *\n * @param {Address} address\n * @returns {boolean} `true` or `false`\n */\n validateAddress(address: string): boolean {\n return Utils.validateAddress(address, this.network)\n }\n\n protected async getSuggestedFeeRate(): Promise<FeeRate> {\n try {\n const response = await axios.get(`https://api.blockcypher.com/v1/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n }\n\n /**\n * Transfer Doge.\n *\n * @param {TxParams&FeeRate} params The transfer options.\n * @returns {TxHash} The transaction hash.\n */\n async transfer(params: TxParams & { feeRate?: FeeRate }): Promise<TxHash> {\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n\n const fromAddressIndex = params?.walletIndex || 0\n const { rawUnsignedTx } = await this.prepareTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\n const psbt = Dogecoin.Psbt.fromBase64(rawUnsignedTx, { maximumFeeRate: 7500000 })\n\n psbt.signAllInputs(dogeKeys) // Sign all inputs\n psbt.finalizeAllInputs() // Finalise inputs\n const txHex = psbt.extractTransaction().toHex() // TX extracted and formatted to hex\n\n return await this.roundRobinBroadcastTx(txHex)\n }\n\n /**\n * Build transcation.\n *\n * @param {BuildParams} params The transaction build options.\n * @returns {Transaction}\n * @deprecated\n */\n public buildTx = async ({\n amount,\n recipient,\n memo,\n feeRate,\n sender,\n }: TxParams & {\n feeRate: FeeRate\n sender: Address\n }): Promise<{ psbt: Dogecoin.Psbt; utxos: UTXO[] }> => {\n if (!this.validateAddress(recipient)) throw new Error('Invalid address')\n\n const utxos = await this.scanUTXOs(sender, false)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? this.compileMemo(memo) : null\n\n const targetOutputs = []\n //1. output to recipient\n targetOutputs.push({\n address: recipient,\n value: amount.amount().toNumber(),\n })\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 })\n }\n const { inputs, outputs } = accumulative(utxos, targetOutputs, feeRateWhole)\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 psbt = new Dogecoin.Psbt({ network: Utils.dogeNetwork(this.network) }) // Network-specific\n // TODO: Doge recommended fees is greater than the recommended by Bitcoinjs-lib (for BTC),\n // so we need to increase the maximum fee rate. Currently, the fast rate fee is near ~750000sats/byte\n // https://thornode.ninerealms.com/thorchain/inbound_addresses?height=7526662 (09-27-2022)\n // For now we increase it by 10x\n psbt.setMaximumFeeRate(7500000)\n // const params = { sochainUrl, network, address: sender }\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n nonWitnessUtxo: Buffer.from(utxo.txHex, 'hex'),\n })\n }\n\n // Outputs\n outputs.forEach((output: Dogecoin.PsbtTxOutput) => {\n if (!output.address) {\n //an empty address means this is the change address\n output.address = sender\n }\n if (!output.script) {\n psbt.addOutput(output)\n } else {\n //we need to add the compiled memo this way to\n //avoid dust error tx when accumulating memo output with 0 value\n if (compiledMemo) {\n psbt.addOutput({ script: compiledMemo, value: 0 })\n }\n }\n })\n\n return { psbt, utxos }\n }\n\n /**\n * Create transaction info.\n *\n * @param {LedgerTxInfoParams} params The transaction build options.\n * @returns {LedgerTxInfo} The transaction info used for ledger sign.\n * @deprecated\n */\n public async createTxInfo(params: LedgerTxInfoParams): Promise<LedgerTxInfo> {\n const { psbt, utxos } = await this.buildTx(params)\n const ledgerTxInfo: LedgerTxInfo = {\n utxos,\n newTxHex: psbt.data.globalMap.unsignedTx.toBuffer().toString('hex'),\n }\n return ledgerTxInfo\n }\n\n /**\n * Prepare transfer.\n *\n * @param {TxParams&Address&FeeRate&boolean} params The transfer options.\n * @returns {PreparedTx} The raw unsigned transaction.\n */\n async prepareTx({\n sender,\n memo,\n amount,\n recipient,\n feeRate,\n }: TxParams & {\n sender: Address\n feeRate: FeeRate\n spendPendingUTXO?: boolean\n }): Promise<PreparedTx> {\n const { psbt } = await this.buildTx({\n sender,\n recipient,\n amount,\n feeRate,\n memo,\n })\n\n return { rawUnsignedTx: psbt.toBase64() }\n }\n /**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\n protected compileMemo(memo: string): Buffer {\n const data = Buffer.from(memo, 'utf8') // converts MEMO to buffer\n return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]) // Compile OP_RETURN script\n }\n\n /**\n * Get the transaction fee.\n *\n * @param {UTXO[]} inputs The UTXOs.\n * @param {FeeRate} feeRate The fee rate.\n * @param {Buffer} data The compiled memo (Optional).\n * @returns {number} The fee amount.\n */\n protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n const inputSizeBasedOnInputs =\n inputs.length > 0\n ? inputs.reduce((a) => a + Utils.inputBytes(), 0) + inputs.length // +1 byte for each input signature\n : 0\n let sum =\n Utils.TX_EMPTY_SIZE +\n inputSizeBasedOnInputs + // +1 byte for each input signature\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH +\n Utils.TX_OUTPUT_BASE +\n Utils.TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += Utils.TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\n }\n}\n\nexport { Client }\n","import { Network } from '@xchainjs/xchain-client'\nimport axios from 'axios'\n\nconst DEFAULT_SUGGESTED_TRANSACTION_FEE = 150000\n\n/**\n * Get Dogecoin suggested transaction fee.\n *\n * @returns {number} The Dogecoin suggested transaction fee per bytes in sat.\n */\nexport const getSuggestedTxFee = async ({ blockcypherUrl }: { blockcypherUrl: string }): Promise<number> => {\n try {\n const response = await axios.get(`${blockcypherUrl}/doge/main`)\n return response.data.low_fee_per_kb / 1000 // feePerKb to feePerByte\n } catch (error) {\n return DEFAULT_SUGGESTED_TRANSACTION_FEE\n }\n}\n\nexport const getSendTxUrl = ({ blockcypherUrl, network }: { blockcypherUrl: string; network: Network }) => {\n if (network === 'testnet') {\n throw new Error('Testnet URL is not available for blockcypher')\n } else {\n return `${blockcypherUrl}/doge/main/txs/push`\n }\n}\n"],"names":["ExplorerProvider","Network","SochainProvider","SochainNetwork","BlockcypherProvider","BlockcypherNetwork","coininfo","Dogecoin","UTXOClient","accumulative","Utils.dogeNetwork","dogeNetwork","getSeed","Utils.validateAddress","axios","checkFeeBounds","Utils.inputBytes","Utils.TX_EMPTY_SIZE","Utils.TX_OUTPUT_BASE","Utils.TX_OUTPUT_PUBKEYHASH"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xchainjs/xchain-doge",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "Custom Doge client and utilities used by XChain clients",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Xchain",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@xchainjs/xchain-client": "^0.15.1",
|
|
37
37
|
"@xchainjs/xchain-crypto": "^0.3.0",
|
|
38
38
|
"@xchainjs/xchain-util": "^0.13.1",
|
|
39
|
-
"@xchainjs/xchain-utxo-providers": "^0.2.
|
|
39
|
+
"@xchainjs/xchain-utxo-providers": "^0.2.6",
|
|
40
40
|
"@types/wif": "^2.0.2",
|
|
41
41
|
"axios": "^1.3.6",
|
|
42
42
|
"axios-mock-adapter": "^1.20.0",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@xchainjs/xchain-client": "^0.15.1",
|
|
50
50
|
"@xchainjs/xchain-crypto": "^0.3.0",
|
|
51
51
|
"@xchainjs/xchain-util": "^0.13.1",
|
|
52
|
-
"@xchainjs/xchain-utxo-providers": "^0.2.
|
|
52
|
+
"@xchainjs/xchain-utxo-providers": "^0.2.6",
|
|
53
53
|
"axios": "^1.3.6",
|
|
54
54
|
"bitcoinjs-lib": "5.2.0",
|
|
55
55
|
"coininfo": "5.1.0",
|
|
@@ -59,4 +59,4 @@
|
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
}
|
|
62
|
-
}
|
|
62
|
+
}
|