@xchainjs/xchain-doge 0.6.3 → 0.7.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/lib/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { AssetInfo, Fee, FeeRate, TxHash, TxParams, UTXO, UTXOClient, UtxoClientParams } from '@xchainjs/xchain-client';
1
+ /// <reference types="node" />
2
+ import { AssetInfo, FeeRate, TxHash, TxParams, UTXO, UTXOClient, UtxoClientParams } from '@xchainjs/xchain-client';
2
3
  import { Address } from '@xchainjs/xchain-util';
3
4
  import * as Dogecoin from 'bitcoinjs-lib';
4
5
  import { LedgerTxInfo, LedgerTxInfoParams } from './types/ledger';
@@ -52,7 +53,6 @@ declare class Client extends UTXOClient {
52
53
  */
53
54
  validateAddress(address: string): boolean;
54
55
  protected getSuggestedFeeRate(): Promise<FeeRate>;
55
- protected calcFee(feeRate: FeeRate, memo?: string): Promise<Fee>;
56
56
  /**
57
57
  * Transfer Doge.
58
58
  *
@@ -82,5 +82,21 @@ declare class Client extends UTXOClient {
82
82
  * @returns {LedgerTxInfo} The transaction info used for ledger sign.
83
83
  */
84
84
  createTxInfo(params: LedgerTxInfoParams): Promise<LedgerTxInfo>;
85
+ /**
86
+ * Compile memo.
87
+ *
88
+ * @param {string} memo The memo to be compiled.
89
+ * @returns {Buffer} The compiled memo.
90
+ */
91
+ protected compileMemo(memo: string): Buffer;
92
+ /**
93
+ * Get the transaction fee.
94
+ *
95
+ * @param {UTXO[]} inputs The UTXOs.
96
+ * @param {FeeRate} feeRate The fee rate.
97
+ * @param {Buffer} data The compiled memo (Optional).
98
+ * @returns {number} The fee amount.
99
+ */
100
+ protected getFeeFromUtxos(inputs: UTXO[], feeRate: FeeRate, data?: Buffer | null): number;
85
101
  }
86
102
  export { Client };
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './types';
2
2
  export * from './client';
3
3
  export * from './const';
4
- export { getDefaultFees, getDefaultFeesWithRates, validateAddress, calcFee, getPrefix } from './utils';
4
+ export { validateAddress, getPrefix } from './utils';
5
5
  export { getSendTxUrl } from './blockcypher-api';
package/lib/index.esm.js CHANGED
@@ -1,10 +1,9 @@
1
- import { ExplorerProvider, Network, standardFeeRates, calcFees, UTXOClient, checkFeeBounds } from '@xchainjs/xchain-client';
1
+ import { ExplorerProvider, Network, UTXOClient, checkFeeBounds } from '@xchainjs/xchain-client';
2
2
  import { getSeed } from '@xchainjs/xchain-crypto';
3
3
  import axios from 'axios';
4
4
  import * as Dogecoin from 'bitcoinjs-lib';
5
5
  import accumulative from 'coinselect/accumulative';
6
6
  import { SochainProvider, SochainNetwork, BlockcypherProvider, BlockcypherNetwork } from '@xchainjs/xchain-utxo-providers';
7
- import { baseAmount } from '@xchainjs/xchain-util';
8
7
  import coininfo from 'coininfo';
9
8
 
10
9
  /******************************************************************************
@@ -89,40 +88,6 @@ const TX_OUTPUT_PUBKEYHASH = 25;
89
88
  function inputBytes() {
90
89
  return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;
91
90
  }
92
- /**
93
- * Compile memo.
94
- *
95
- * @param {string} memo The memo to be compiled.
96
- * @returns {Buffer} The compiled memo.
97
- */
98
- const compileMemo = (memo) => {
99
- const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
100
- return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
101
- };
102
- /**
103
- * Get the transaction fee.
104
- *
105
- * @param {UTXO[]} inputs The UTXOs.
106
- * @param {FeeRate} feeRate The fee rate.
107
- * @param {Buffer} data The compiled memo (Optional).
108
- * @returns {number} The fee amount.
109
- */
110
- function getFee(inputs, feeRate, data = null) {
111
- let sum = TX_EMPTY_SIZE +
112
- inputs.reduce(function (a) {
113
- return a + inputBytes();
114
- }, 0) +
115
- inputs.length + // +1 byte for each input signature
116
- TX_OUTPUT_BASE +
117
- TX_OUTPUT_PUBKEYHASH +
118
- TX_OUTPUT_BASE +
119
- TX_OUTPUT_PUBKEYHASH;
120
- if (data) {
121
- sum += TX_OUTPUT_BASE + data.length;
122
- }
123
- const fee = sum * feeRate;
124
- return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
125
- }
126
91
  /**
127
92
  * Get Dogecoin network to be used with bitcoinjs.
128
93
  *
@@ -163,39 +128,6 @@ const validateAddress = (address, network) => {
163
128
  return false;
164
129
  }
165
130
  };
166
- /**
167
- * Calculate fees based on fee rate and memo.
168
- *
169
- * @param {FeeRate} feeRate
170
- * @param {string} memo
171
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
172
- */
173
- const calcFee = (feeRate, memo) => {
174
- const compiledMemo = memo ? compileMemo(memo) : null;
175
- const fee = getFee([], feeRate, compiledMemo);
176
- return baseAmount(fee);
177
- };
178
- /**
179
- * Get the default fees with rates.
180
- *
181
- * @returns {FeesWithRates} The default fees and rates.
182
- */
183
- const getDefaultFeesWithRates = () => {
184
- const rates = Object.assign({}, standardFeeRates(MIN_TX_FEE));
185
- return {
186
- fees: calcFees(rates, calcFee),
187
- rates,
188
- };
189
- };
190
- /**
191
- * Get the default fees.
192
- *
193
- * @returns {Fees} The default fees.
194
- */
195
- const getDefaultFees = () => {
196
- const { fees } = getDefaultFeesWithRates();
197
- return fees;
198
- };
199
131
  /**
200
132
  * Get address prefix based on the network.
201
133
  *
@@ -258,11 +190,11 @@ class Client extends UTXOClient {
258
190
  this.buildTx = ({ amount, recipient, memo, feeRate, sender, }) => __awaiter(this, void 0, void 0, function* () {
259
191
  if (!this.validateAddress(recipient))
260
192
  throw new Error('Invalid address');
261
- const utxos = yield this.scanUTXOs(sender);
193
+ const utxos = yield this.scanUTXOs(sender, false);
262
194
  if (utxos.length === 0)
263
195
  throw new Error('No utxos to send');
264
196
  const feeRateWhole = Number(feeRate.toFixed(0));
265
- const compiledMemo = memo ? compileMemo(memo) : null;
197
+ const compiledMemo = memo ? this.compileMemo(memo) : null;
266
198
  const targetOutputs = [];
267
199
  //1. output to recipient
268
200
  targetOutputs.push({
@@ -391,11 +323,6 @@ class Client extends UTXOClient {
391
323
  }
392
324
  });
393
325
  }
394
- calcFee(feeRate, memo) {
395
- return __awaiter(this, void 0, void 0, function* () {
396
- return calcFee(feeRate, memo);
397
- });
398
- }
399
326
  /**
400
327
  * Transfer Doge.
401
328
  *
@@ -431,6 +358,40 @@ class Client extends UTXOClient {
431
358
  return ledgerTxInfo;
432
359
  });
433
360
  }
361
+ /**
362
+ * Compile memo.
363
+ *
364
+ * @param {string} memo The memo to be compiled.
365
+ * @returns {Buffer} The compiled memo.
366
+ */
367
+ compileMemo(memo) {
368
+ const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
369
+ return Dogecoin.script.compile([Dogecoin.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
370
+ }
371
+ /**
372
+ * Get the transaction fee.
373
+ *
374
+ * @param {UTXO[]} inputs The UTXOs.
375
+ * @param {FeeRate} feeRate The fee rate.
376
+ * @param {Buffer} data The compiled memo (Optional).
377
+ * @returns {number} The fee amount.
378
+ */
379
+ getFeeFromUtxos(inputs, feeRate, data = null) {
380
+ const inputSizeBasedOnInputs = inputs.length > 0
381
+ ? inputs.reduce((a) => a + inputBytes(), 0) + inputs.length // +1 byte for each input signature
382
+ : 0;
383
+ let sum = TX_EMPTY_SIZE +
384
+ inputSizeBasedOnInputs + // +1 byte for each input signature
385
+ TX_OUTPUT_BASE +
386
+ TX_OUTPUT_PUBKEYHASH +
387
+ TX_OUTPUT_BASE +
388
+ TX_OUTPUT_PUBKEYHASH;
389
+ if (data) {
390
+ sum += TX_OUTPUT_BASE + data.length;
391
+ }
392
+ const fee = sum * feeRate;
393
+ return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
394
+ }
434
395
  }
435
396
 
436
397
  const getSendTxUrl = ({ blockcypherUrl, network }) => {
@@ -442,5 +403,5 @@ const getSendTxUrl = ({ blockcypherUrl, network }) => {
442
403
  }
443
404
  };
444
405
 
445
- export { AssetDOGE, Client, DOGEChain, DOGE_DECIMAL, LOWER_FEE_BOUND, MIN_TX_FEE, UPPER_FEE_BOUND, blockcypherDataProviders, blockstreamExplorerProviders, calcFee, defaultDogeParams, getDefaultFees, getDefaultFeesWithRates, getPrefix, getSendTxUrl, sochainDataProviders, validateAddress };
406
+ export { AssetDOGE, Client, DOGEChain, DOGE_DECIMAL, LOWER_FEE_BOUND, MIN_TX_FEE, UPPER_FEE_BOUND, blockcypherDataProviders, blockstreamExplorerProviders, defaultDogeParams, getPrefix, getSendTxUrl, sochainDataProviders, validateAddress };
446
407
  //# sourceMappingURL=index.esm.js.map
@@ -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 { FeeRate, Fees, FeesWithRates, Network, UTXO, calcFees, standardFeeRates } from '@xchainjs/xchain-client'\nimport { Address, BaseAmount, baseAmount } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nimport { MIN_TX_FEE } from './const'\n\nconst TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nconst TX_INPUT_PUBKEYHASH = 107\nconst TX_OUTPUT_BASE = 8 + 1 //9\nconst TX_OUTPUT_PUBKEYHASH = 25\n\nfunction inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\nexport const 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 */\nexport function getFee(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n let sum =\n TX_EMPTY_SIZE +\n inputs.reduce(function (a) {\n return a + inputBytes()\n }, 0) +\n inputs.length + // +1 byte for each input signature\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH +\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\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 * Calculate fees based on fee rate and memo.\n *\n * @param {FeeRate} feeRate\n * @param {string} memo\n * @returns {BaseAmount} The calculated fees based on fee rate and the memo.\n */\nexport const calcFee = (feeRate: FeeRate, memo?: string): BaseAmount => {\n const compiledMemo = memo ? compileMemo(memo) : null\n const fee = getFee([], feeRate, compiledMemo)\n return baseAmount(fee)\n}\n\n/**\n * Get the default fees with rates.\n *\n * @returns {FeesWithRates} The default fees and rates.\n */\nexport const getDefaultFeesWithRates = (): FeesWithRates => {\n const rates = {\n ...standardFeeRates(MIN_TX_FEE),\n }\n\n return {\n fees: calcFees(rates, calcFee),\n rates,\n }\n}\n\n/**\n * Get the default fees.\n *\n * @returns {Fees} The default fees.\n */\nexport const getDefaultFees = (): Fees => {\n const { fees } = getDefaultFeesWithRates()\n return fees\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 Fee,\n FeeRate,\n Network,\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 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 protected async calcFee(feeRate: FeeRate, memo?: string): Promise<Fee> {\n return Utils.calcFee(feeRate, memo)\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 fromAddressIndex = params?.walletIndex || 0\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\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 */\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)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? Utils.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 */\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\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.compileMemo","Utils.dogeNetwork","dogeNetwork","Utils.validateAddress","Utils.calcFee"],"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 = 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 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 fromAddressIndex = params?.walletIndex || 0\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\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 */\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 */\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 * 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
@@ -8,7 +8,6 @@ var axios = require('axios');
8
8
  var Dogecoin = require('bitcoinjs-lib');
9
9
  var accumulative = require('coinselect/accumulative');
10
10
  var xchainUtxoProviders = require('@xchainjs/xchain-utxo-providers');
11
- var xchainUtil = require('@xchainjs/xchain-util');
12
11
  var coininfo = require('coininfo');
13
12
 
14
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -118,40 +117,6 @@ const TX_OUTPUT_PUBKEYHASH = 25;
118
117
  function inputBytes() {
119
118
  return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;
120
119
  }
121
- /**
122
- * Compile memo.
123
- *
124
- * @param {string} memo The memo to be compiled.
125
- * @returns {Buffer} The compiled memo.
126
- */
127
- const compileMemo = (memo) => {
128
- const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
129
- return Dogecoin__namespace.script.compile([Dogecoin__namespace.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
130
- };
131
- /**
132
- * Get the transaction fee.
133
- *
134
- * @param {UTXO[]} inputs The UTXOs.
135
- * @param {FeeRate} feeRate The fee rate.
136
- * @param {Buffer} data The compiled memo (Optional).
137
- * @returns {number} The fee amount.
138
- */
139
- function getFee(inputs, feeRate, data = null) {
140
- let sum = TX_EMPTY_SIZE +
141
- inputs.reduce(function (a) {
142
- return a + inputBytes();
143
- }, 0) +
144
- inputs.length + // +1 byte for each input signature
145
- TX_OUTPUT_BASE +
146
- TX_OUTPUT_PUBKEYHASH +
147
- TX_OUTPUT_BASE +
148
- TX_OUTPUT_PUBKEYHASH;
149
- if (data) {
150
- sum += TX_OUTPUT_BASE + data.length;
151
- }
152
- const fee = sum * feeRate;
153
- return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
154
- }
155
120
  /**
156
121
  * Get Dogecoin network to be used with bitcoinjs.
157
122
  *
@@ -192,39 +157,6 @@ const validateAddress = (address, network) => {
192
157
  return false;
193
158
  }
194
159
  };
195
- /**
196
- * Calculate fees based on fee rate and memo.
197
- *
198
- * @param {FeeRate} feeRate
199
- * @param {string} memo
200
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
201
- */
202
- const calcFee = (feeRate, memo) => {
203
- const compiledMemo = memo ? compileMemo(memo) : null;
204
- const fee = getFee([], feeRate, compiledMemo);
205
- return xchainUtil.baseAmount(fee);
206
- };
207
- /**
208
- * Get the default fees with rates.
209
- *
210
- * @returns {FeesWithRates} The default fees and rates.
211
- */
212
- const getDefaultFeesWithRates = () => {
213
- const rates = Object.assign({}, xchainClient.standardFeeRates(MIN_TX_FEE));
214
- return {
215
- fees: xchainClient.calcFees(rates, calcFee),
216
- rates,
217
- };
218
- };
219
- /**
220
- * Get the default fees.
221
- *
222
- * @returns {Fees} The default fees.
223
- */
224
- const getDefaultFees = () => {
225
- const { fees } = getDefaultFeesWithRates();
226
- return fees;
227
- };
228
160
  /**
229
161
  * Get address prefix based on the network.
230
162
  *
@@ -287,11 +219,11 @@ class Client extends xchainClient.UTXOClient {
287
219
  this.buildTx = ({ amount, recipient, memo, feeRate, sender, }) => __awaiter(this, void 0, void 0, function* () {
288
220
  if (!this.validateAddress(recipient))
289
221
  throw new Error('Invalid address');
290
- const utxos = yield this.scanUTXOs(sender);
222
+ const utxos = yield this.scanUTXOs(sender, false);
291
223
  if (utxos.length === 0)
292
224
  throw new Error('No utxos to send');
293
225
  const feeRateWhole = Number(feeRate.toFixed(0));
294
- const compiledMemo = memo ? compileMemo(memo) : null;
226
+ const compiledMemo = memo ? this.compileMemo(memo) : null;
295
227
  const targetOutputs = [];
296
228
  //1. output to recipient
297
229
  targetOutputs.push({
@@ -420,11 +352,6 @@ class Client extends xchainClient.UTXOClient {
420
352
  }
421
353
  });
422
354
  }
423
- calcFee(feeRate, memo) {
424
- return __awaiter(this, void 0, void 0, function* () {
425
- return calcFee(feeRate, memo);
426
- });
427
- }
428
355
  /**
429
356
  * Transfer Doge.
430
357
  *
@@ -460,6 +387,40 @@ class Client extends xchainClient.UTXOClient {
460
387
  return ledgerTxInfo;
461
388
  });
462
389
  }
390
+ /**
391
+ * Compile memo.
392
+ *
393
+ * @param {string} memo The memo to be compiled.
394
+ * @returns {Buffer} The compiled memo.
395
+ */
396
+ compileMemo(memo) {
397
+ const data = Buffer.from(memo, 'utf8'); // converts MEMO to buffer
398
+ return Dogecoin__namespace.script.compile([Dogecoin__namespace.opcodes.OP_RETURN, data]); // Compile OP_RETURN script
399
+ }
400
+ /**
401
+ * Get the transaction fee.
402
+ *
403
+ * @param {UTXO[]} inputs The UTXOs.
404
+ * @param {FeeRate} feeRate The fee rate.
405
+ * @param {Buffer} data The compiled memo (Optional).
406
+ * @returns {number} The fee amount.
407
+ */
408
+ getFeeFromUtxos(inputs, feeRate, data = null) {
409
+ const inputSizeBasedOnInputs = inputs.length > 0
410
+ ? inputs.reduce((a) => a + inputBytes(), 0) + inputs.length // +1 byte for each input signature
411
+ : 0;
412
+ let sum = TX_EMPTY_SIZE +
413
+ inputSizeBasedOnInputs + // +1 byte for each input signature
414
+ TX_OUTPUT_BASE +
415
+ TX_OUTPUT_PUBKEYHASH +
416
+ TX_OUTPUT_BASE +
417
+ TX_OUTPUT_PUBKEYHASH;
418
+ if (data) {
419
+ sum += TX_OUTPUT_BASE + data.length;
420
+ }
421
+ const fee = sum * feeRate;
422
+ return fee > MIN_TX_FEE ? fee : MIN_TX_FEE;
423
+ }
463
424
  }
464
425
 
465
426
  const getSendTxUrl = ({ blockcypherUrl, network }) => {
@@ -480,10 +441,7 @@ exports.MIN_TX_FEE = MIN_TX_FEE;
480
441
  exports.UPPER_FEE_BOUND = UPPER_FEE_BOUND;
481
442
  exports.blockcypherDataProviders = blockcypherDataProviders;
482
443
  exports.blockstreamExplorerProviders = blockstreamExplorerProviders;
483
- exports.calcFee = calcFee;
484
444
  exports.defaultDogeParams = defaultDogeParams;
485
- exports.getDefaultFees = getDefaultFees;
486
- exports.getDefaultFeesWithRates = getDefaultFeesWithRates;
487
445
  exports.getPrefix = getPrefix;
488
446
  exports.getSendTxUrl = getSendTxUrl;
489
447
  exports.sochainDataProviders = sochainDataProviders;
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 { FeeRate, Fees, FeesWithRates, Network, UTXO, calcFees, standardFeeRates } from '@xchainjs/xchain-client'\nimport { Address, BaseAmount, baseAmount } from '@xchainjs/xchain-util'\nimport * as Dogecoin from 'bitcoinjs-lib'\nimport coininfo from 'coininfo'\n\nimport { MIN_TX_FEE } from './const'\n\nconst TX_EMPTY_SIZE = 4 + 1 + 1 + 4 //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4 // 41\nconst TX_INPUT_PUBKEYHASH = 107\nconst TX_OUTPUT_BASE = 8 + 1 //9\nconst TX_OUTPUT_PUBKEYHASH = 25\n\nfunction inputBytes(): number {\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH\n}\n\n/**\n * Compile memo.\n *\n * @param {string} memo The memo to be compiled.\n * @returns {Buffer} The compiled memo.\n */\nexport const 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 */\nexport function getFee(inputs: UTXO[], feeRate: FeeRate, data: Buffer | null = null): number {\n let sum =\n TX_EMPTY_SIZE +\n inputs.reduce(function (a) {\n return a + inputBytes()\n }, 0) +\n inputs.length + // +1 byte for each input signature\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH +\n TX_OUTPUT_BASE +\n TX_OUTPUT_PUBKEYHASH\n\n if (data) {\n sum += TX_OUTPUT_BASE + data.length\n }\n const fee = sum * feeRate\n return fee > MIN_TX_FEE ? fee : MIN_TX_FEE\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 * Calculate fees based on fee rate and memo.\n *\n * @param {FeeRate} feeRate\n * @param {string} memo\n * @returns {BaseAmount} The calculated fees based on fee rate and the memo.\n */\nexport const calcFee = (feeRate: FeeRate, memo?: string): BaseAmount => {\n const compiledMemo = memo ? compileMemo(memo) : null\n const fee = getFee([], feeRate, compiledMemo)\n return baseAmount(fee)\n}\n\n/**\n * Get the default fees with rates.\n *\n * @returns {FeesWithRates} The default fees and rates.\n */\nexport const getDefaultFeesWithRates = (): FeesWithRates => {\n const rates = {\n ...standardFeeRates(MIN_TX_FEE),\n }\n\n return {\n fees: calcFees(rates, calcFee),\n rates,\n }\n}\n\n/**\n * Get the default fees.\n *\n * @returns {Fees} The default fees.\n */\nexport const getDefaultFees = (): Fees => {\n const { fees } = getDefaultFeesWithRates()\n return fees\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 Fee,\n FeeRate,\n Network,\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 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 protected async calcFee(feeRate: FeeRate, memo?: string): Promise<Fee> {\n return Utils.calcFee(feeRate, memo)\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 fromAddressIndex = params?.walletIndex || 0\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\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 */\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)\n if (utxos.length === 0) throw new Error('No utxos to send')\n const feeRateWhole = Number(feeRate.toFixed(0))\n const compiledMemo = memo ? Utils.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 */\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\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","Dogecoin","coininfo","baseAmount","standardFeeRates","calcFees","UTXOClient","Utils.compileMemo","accumulative","Utils.dogeNetwork","dogeNetwork","getSeed","Utils.validateAddress","axios","Utils.calcFee","checkFeeBounds"],"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 = 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 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 fromAddressIndex = params?.walletIndex || 0\n const feeRate = params.feeRate || (await this.getSuggestedFeeRate())\n checkFeeBounds(this.feeBounds, feeRate)\n const { psbt } = await this.buildTx({\n ...params,\n feeRate,\n sender: this.getAddress(fromAddressIndex),\n })\n const dogeKeys = this.getDogeKeys(this.phrase, fromAddressIndex)\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 */\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 */\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 * 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/lib/utils.d.ts CHANGED
@@ -1,23 +1,12 @@
1
- /// <reference types="node" />
2
- import { FeeRate, Fees, FeesWithRates, Network, UTXO } from '@xchainjs/xchain-client';
3
- import { Address, BaseAmount } from '@xchainjs/xchain-util';
1
+ import { Network } from '@xchainjs/xchain-client';
2
+ import { Address } from '@xchainjs/xchain-util';
4
3
  import * as Dogecoin from 'bitcoinjs-lib';
5
- /**
6
- * Compile memo.
7
- *
8
- * @param {string} memo The memo to be compiled.
9
- * @returns {Buffer} The compiled memo.
10
- */
11
- export declare const compileMemo: (memo: string) => Buffer;
12
- /**
13
- * Get the transaction fee.
14
- *
15
- * @param {UTXO[]} inputs The UTXOs.
16
- * @param {FeeRate} feeRate The fee rate.
17
- * @param {Buffer} data The compiled memo (Optional).
18
- * @returns {number} The fee amount.
19
- */
20
- export declare function getFee(inputs: UTXO[], feeRate: FeeRate, data?: Buffer | null): number;
4
+ export declare const TX_EMPTY_SIZE: number;
5
+ export declare const TX_INPUT_BASE: number;
6
+ export declare const TX_INPUT_PUBKEYHASH = 107;
7
+ export declare const TX_OUTPUT_BASE: number;
8
+ export declare const TX_OUTPUT_PUBKEYHASH = 25;
9
+ export declare function inputBytes(): number;
21
10
  /**
22
11
  * Get the average value of an array.
23
12
  *
@@ -40,26 +29,6 @@ export declare const dogeNetwork: (network: Network) => Dogecoin.networks.Networ
40
29
  * @returns {boolean} `true` or `false`.
41
30
  */
42
31
  export declare const validateAddress: (address: Address, network: Network) => boolean;
43
- /**
44
- * Calculate fees based on fee rate and memo.
45
- *
46
- * @param {FeeRate} feeRate
47
- * @param {string} memo
48
- * @returns {BaseAmount} The calculated fees based on fee rate and the memo.
49
- */
50
- export declare const calcFee: (feeRate: FeeRate, memo?: string) => BaseAmount;
51
- /**
52
- * Get the default fees with rates.
53
- *
54
- * @returns {FeesWithRates} The default fees and rates.
55
- */
56
- export declare const getDefaultFeesWithRates: () => FeesWithRates;
57
- /**
58
- * Get the default fees.
59
- *
60
- * @returns {Fees} The default fees.
61
- */
62
- export declare const getDefaultFees: () => Fees;
63
32
  /**
64
33
  * Get address prefix based on the network.
65
34
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xchainjs/xchain-doge",
3
- "version": "0.6.3",
3
+ "version": "0.7.0",
4
4
  "description": "Custom Doge client and utilities used by XChain clients",
5
5
  "keywords": [
6
6
  "Xchain",
@@ -33,10 +33,10 @@
33
33
  "postversion": "git push --follow-tags"
34
34
  },
35
35
  "devDependencies": {
36
- "@xchainjs/xchain-client": "^0.14.2",
36
+ "@xchainjs/xchain-client": "^0.15.0",
37
37
  "@xchainjs/xchain-crypto": "^0.3.0",
38
38
  "@xchainjs/xchain-util": "^0.13.1",
39
- "@xchainjs/xchain-utxo-providers": "^0.2.2",
39
+ "@xchainjs/xchain-utxo-providers": "^0.2.5",
40
40
  "@types/wif": "^2.0.2",
41
41
  "axios": "^1.3.6",
42
42
  "axios-mock-adapter": "^1.20.0",
@@ -46,10 +46,10 @@
46
46
  "wif": "^2.0.6"
47
47
  },
48
48
  "peerDependencies": {
49
- "@xchainjs/xchain-client": "^0.14.2",
49
+ "@xchainjs/xchain-client": "^0.15.0",
50
50
  "@xchainjs/xchain-crypto": "^0.3.0",
51
51
  "@xchainjs/xchain-util": "^0.13.1",
52
- "@xchainjs/xchain-utxo-providers": "^0.2.2",
52
+ "@xchainjs/xchain-utxo-providers": "^0.2.5",
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
+ }