From 75e70196de85f81c314864f9cc5d9e8ad58d9d49 Mon Sep 17 00:00:00 2001 From: josephroyking Date: Thu, 6 Feb 2020 09:46:18 +0100 Subject: [PATCH 1/7] Bug fix, TokenType1 send to many breaks in validation --- lib/TokenType1.js | 11 +-- src/TokenType1.ts | 222 +++++++++++++++++++++++----------------------- 2 files changed, 118 insertions(+), 115 deletions(-) diff --git a/lib/TokenType1.js b/lib/TokenType1.js index 7a29060..b9fedc8 100644 --- a/lib/TokenType1.js +++ b/lib/TokenType1.js @@ -157,9 +157,7 @@ var TokenType1 = /** @class */ (function () { return [2 /*return*/, sendTxid]; case 4: utxos = []; - return [4 /*yield*/, bitboxNetwork.getAllSlpBalancesAndUtxos(sendConfig.fundingAddress) - // Sign and add input token UTXOs - ]; + return [4 /*yield*/, bitboxNetwork.getAllSlpBalancesAndUtxos(sendConfig.fundingAddress)]; case 5: balances = _a.sent(); tokenBalances = balances.filter(function (i) { @@ -270,8 +268,11 @@ var TokenType1 = /** @class */ (function () { // validate tokenReceiverAddress format // single tokenReceiverAddress if (config.tokenReceiverAddress && - !addy.isSLPAddress(config.tokenReceiverAddress)) - throw Error("Token Receiver Address must be simpleledger format"); + !Array.isArray(config.tokenReceiverAddress)) { + if (!addy.isSLPAddress(config.tokenReceiverAddress)) { + throw Error("Token Receiver Address must be simpleledger format"); + } + } // bulk tokenReceiverAddress if (config.tokenReceiverAddress && Array.isArray(config.tokenReceiverAddress)) { diff --git a/src/TokenType1.ts b/src/TokenType1.ts index f3498d9..631f7c7 100644 --- a/src/TokenType1.ts +++ b/src/TokenType1.ts @@ -1,59 +1,59 @@ // require deps // imports -import { BITBOX } from "bitbox-sdk" -import Address from "./Address" +import { BITBOX } from "bitbox-sdk"; +import Address from "./Address"; import { IBurnConfig, ICreateConfig, IMintConfig, ISendConfig -} from "./interfaces/SLPInterfaces" +} from "./interfaces/SLPInterfaces"; // consts -const BigNumber: any = require("bignumber.js") -const slpjs: any = require("slpjs") -const addy: any = new Address() +const BigNumber: any = require("bignumber.js"); +const slpjs: any = require("slpjs"); +const addy: any = new Address(); class TokenType1 { - restURL: string + restURL: string; constructor(restURL?: string) { - this.restURL = restURL + this.restURL = restURL; } async create(createConfig: ICreateConfig) { // validate address formats - this.validateAddressFormat(createConfig) + this.validateAddressFormat(createConfig); // determine mainnet/testnet - const network: string = this.returnNetwork(createConfig.fundingAddress) + const network: string = this.returnNetwork(createConfig.fundingAddress); // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network) + const BITBOX: any = this.returnBITBOXInstance(network); // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); - let batonReceiverAddress: string + let batonReceiverAddress: string; if ( createConfig.batonReceiverAddress !== undefined && createConfig.batonReceiverAddress !== "" && createConfig.batonReceiverAddress !== null ) - batonReceiverAddress = createConfig.batonReceiverAddress - else batonReceiverAddress = null + batonReceiverAddress = createConfig.batonReceiverAddress; + else batonReceiverAddress = null; const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( createConfig.fundingAddress - ) + ); - let initialTokenQty: number = createConfig.initialTokenQty + let initialTokenQty: number = createConfig.initialTokenQty; initialTokenQty = new BigNumber(initialTokenQty).times( 10 ** createConfig.decimals - ) + ); balances.nonSlpUtxos.forEach( (txo: any) => (txo.wif = createConfig.fundingWif) - ) + ); const genesisTxid = await bitboxNetwork.simpleTokenGenesis( createConfig.name, createConfig.symbol, @@ -65,46 +65,46 @@ class TokenType1 { batonReceiverAddress, createConfig.bchChangeReceiverAddress, balances.nonSlpUtxos - ) - return genesisTxid + ); + return genesisTxid; } async mint(mintConfig: IMintConfig) { // validate address formats - this.validateAddressFormat(mintConfig) + this.validateAddressFormat(mintConfig); // determine mainnet/testnet - const network: string = this.returnNetwork(mintConfig.fundingAddress) + const network: string = this.returnNetwork(mintConfig.fundingAddress); // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network) + const BITBOX: any = this.returnBITBOXInstance(network); // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); const batonReceiverAddress: string = addy.toSLPAddress( mintConfig.batonReceiverAddress - ) + ); const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( mintConfig.fundingAddress - ) + ); if (!balances.slpBatonUtxos[mintConfig.tokenId]) - throw Error("You don't have the minting baton for this token") + throw Error("You don't have the minting baton for this token"); const tokenInfo: any = await bitboxNetwork.getTokenInformation( mintConfig.tokenId - ) + ); const mintQty = new BigNumber(mintConfig.additionalTokenQty).times( 10 ** tokenInfo.decimals - ) + ); - let inputUtxos = balances.slpBatonUtxos[mintConfig.tokenId] + let inputUtxos = balances.slpBatonUtxos[mintConfig.tokenId]; - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); - inputUtxos.forEach((txo: any) => (txo.wif = mintConfig.fundingWif)) + inputUtxos.forEach((txo: any) => (txo.wif = mintConfig.fundingWif)); const mintTxid = await bitboxNetwork.simpleTokenMint( mintConfig.tokenId, @@ -113,58 +113,59 @@ class TokenType1 { mintConfig.tokenReceiverAddress, batonReceiverAddress, mintConfig.bchChangeReceiverAddress - ) - return mintTxid + ); + return mintTxid; } async send(sendConfig: ISendConfig) { // validate address formats - this.validateAddressFormat(sendConfig) + this.validateAddressFormat(sendConfig); // determine mainnet/testnet - let network: string + let network: string; if (!Array.isArray(sendConfig.fundingAddress)) - network = this.returnNetwork(sendConfig.fundingAddress) - else network = this.returnNetwork(sendConfig.fundingAddress[0]) + network = this.returnNetwork(sendConfig.fundingAddress); + else network = this.returnNetwork(sendConfig.fundingAddress[0]); // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network) + const BITBOX: any = this.returnBITBOXInstance(network); // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); - const tokenId: string = sendConfig.tokenId + const tokenId: string = sendConfig.tokenId; const bchChangeReceiverAddress: string = addy.toSLPAddress( sendConfig.bchChangeReceiverAddress - ) + ); - const tokenInfo: any = await bitboxNetwork.getTokenInformation(tokenId) - const tokenDecimals: number = tokenInfo.decimals + const tokenInfo: any = await bitboxNetwork.getTokenInformation(tokenId); + const tokenDecimals: number = tokenInfo.decimals; if (!Array.isArray(sendConfig.fundingAddress)) { - let amount: any = sendConfig.amount + let amount: any = sendConfig.amount; const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( sendConfig.fundingAddress - ) + ); if (!Array.isArray(amount)) { - amount = new BigNumber(amount).times(10 ** tokenDecimals) // Don't forget to account for token precision + amount = new BigNumber(amount).times(10 ** tokenDecimals); // Don't forget to account for token precision } else { amount.forEach((amt: number, index: number) => { - amount[index] = new BigNumber(amt).times(10 ** tokenDecimals) // Don't forget to account for token precision - }) + amount[index] = new BigNumber(amt).times(10 ** tokenDecimals); // Don't forget to account for token precision + }); } - let inputUtxos = balances.slpTokenUtxos[tokenId] + let inputUtxos = balances.slpTokenUtxos[tokenId]; // console.log(`inputUtxos: ${JSON.stringify(inputUtxos, null, 2)}`) // console.log(`balances.nonSlpUtxos: ${JSON.stringify(balances.nonSlpUtxos, null, 2)}`) - if(inputUtxos === undefined) throw new Error(`Could not find any SLP token UTXOs`) + if (inputUtxos === undefined) + throw new Error(`Could not find any SLP token UTXOs`); - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); - inputUtxos.forEach((txo: any) => (txo.wif = sendConfig.fundingWif)) + inputUtxos.forEach((txo: any) => (txo.wif = sendConfig.fundingWif)); const sendTxid = await bitboxNetwork.simpleTokenSend( tokenId, @@ -172,65 +173,63 @@ class TokenType1 { inputUtxos, sendConfig.tokenReceiverAddress, bchChangeReceiverAddress - ) - return sendTxid + ); + return sendTxid; } - const utxos: any[] = [] + const utxos: any[] = []; const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( sendConfig.fundingAddress - ) + ); // Sign and add input token UTXOs const tokenBalances = balances.filter((i: any) => { try { - return i.result.slpTokenBalances[tokenId].isGreaterThan(0) + return i.result.slpTokenBalances[tokenId].isGreaterThan(0); } catch (_) { - return false + return false; } - }) + }); tokenBalances.map((i: any) => i.result.slpTokenUtxos[tokenId].forEach( (j: any) => (j.wif = sendConfig.fundingWif[i.address]) ) - ) + ); tokenBalances.forEach((a: any) => { try { - a.result.slpTokenUtxos[tokenId].forEach((txo: any) => utxos.push(txo)) + a.result.slpTokenUtxos[tokenId].forEach((txo: any) => utxos.push(txo)); } catch (_) {} - }) + }); // Sign and add input BCH (non-token) UTXOs const bchBalances = balances.filter( (i: any) => i.result.nonSlpUtxos.length > 0 - ) + ); bchBalances.map((i: any) => i.result.nonSlpUtxos.forEach( (j: any) => (j.wif = sendConfig.fundingWif[i.address]) ) - ) + ); bchBalances.forEach((a: any) => a.result.nonSlpUtxos.forEach((txo: any) => utxos.push(txo)) - ) + ); utxos.forEach((txo: any) => { if (Array.isArray(sendConfig.fundingAddress)) { - sendConfig.fundingAddress.forEach( - (address: string, index: number) => { - if (txo.cashAddress === addy.toCashAddress(address)) - txo.wif = sendConfig.fundingWif[index] - } - ) + sendConfig.fundingAddress.forEach((address: string, index: number) => { + if (txo.cashAddress === addy.toCashAddress(address)) + txo.wif = sendConfig.fundingWif[index]; + }); } - }) + }); - let amount: any = sendConfig.amount + let amount: any = sendConfig.amount; if (!Array.isArray(amount)) { - amount = new BigNumber(amount).times(10 ** tokenDecimals) // Don't forget to account for token precision + amount = new BigNumber(amount).times(10 ** tokenDecimals); // Don't forget to account for token precision } else { amount.forEach((amt: number, index: number) => { - amount[index] = new BigNumber(amt).times(10 ** tokenDecimals) // Don't forget to account for token precision - }) + amount[index] = new BigNumber(amt).times(10 ** tokenDecimals); // Don't forget to account for token precision + }); } return await bitboxNetwork.simpleTokenSend( tokenId, @@ -238,59 +237,59 @@ class TokenType1 { utxos, sendConfig.tokenReceiverAddress, bchChangeReceiverAddress - ) + ); } async burn(burnConfig: IBurnConfig) { // validate address formats - this.validateAddressFormat(burnConfig) + this.validateAddressFormat(burnConfig); // determine mainnet/testnet - const network: string = this.returnNetwork(burnConfig.fundingAddress) + const network: string = this.returnNetwork(burnConfig.fundingAddress); // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network) + const BITBOX: any = this.returnBITBOXInstance(network); // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); const bchChangeReceiverAddress: string = addy.toSLPAddress( burnConfig.bchChangeReceiverAddress - ) + ); const tokenInfo = await bitboxNetwork.getTokenInformation( burnConfig.tokenId - ) - const tokenDecimals = tokenInfo.decimals + ); + const tokenDecimals = tokenInfo.decimals; const balances = await bitboxNetwork.getAllSlpBalancesAndUtxos( burnConfig.fundingAddress - ) - const amount = new BigNumber(burnConfig.amount).times(10 ** tokenDecimals) - let inputUtxos = balances.slpTokenUtxos[burnConfig.tokenId] + ); + const amount = new BigNumber(burnConfig.amount).times(10 ** tokenDecimals); + let inputUtxos = balances.slpTokenUtxos[burnConfig.tokenId]; - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); - inputUtxos.forEach((txo: any) => (txo.wif = burnConfig.fundingWif)) + inputUtxos.forEach((txo: any) => (txo.wif = burnConfig.fundingWif)); const burnTxid = await bitboxNetwork.simpleTokenBurn( burnConfig.tokenId, amount, inputUtxos, bchChangeReceiverAddress - ) - return burnTxid + ); + return burnTxid; } returnNetwork(address: string): string { - return addy.detectAddressNetwork(address) + return addy.detectAddressNetwork(address); } returnBITBOXInstance(network: string): any { - let tmpBITBOX: any + let tmpBITBOX: any; - let restURL: string - if (network === "mainnet") restURL = "https://rest.bitcoin.com/v2/" - else restURL = "https://trest.bitcoin.com/v2/" + let restURL: string; + if (network === "mainnet") restURL = "https://rest.bitcoin.com/v2/"; + else restURL = "https://trest.bitcoin.com/v2/"; - return new BITBOX({ restURL: restURL }) + return new BITBOX({ restURL: restURL }); } validateAddressFormat(config: any): string | void { @@ -300,23 +299,26 @@ class TokenType1 { // validate fundingAddress format // single fundingAddress if (config.fundingAddress && !addy.isSLPAddress(config.fundingAddress)) - throw Error("Funding Address must be simpleledger format") + throw Error("Funding Address must be simpleledger format"); // bulk fundingAddress if (config.fundingAddress && Array.isArray(config.fundingAddress)) { config.fundingAddress.forEach((address: string) => { if (!addy.isSLPAddress(address)) - throw Error("Funding Address must be simpleledger format") - }) + throw Error("Funding Address must be simpleledger format"); + }); } // validate tokenReceiverAddress format // single tokenReceiverAddress if ( config.tokenReceiverAddress && - !addy.isSLPAddress(config.tokenReceiverAddress) - ) - throw Error("Token Receiver Address must be simpleledger format") + !Array.isArray(config.tokenReceiverAddress) + ) { + if (!addy.isSLPAddress(config.tokenReceiverAddress)) { + throw Error("Token Receiver Address must be simpleledger format"); + } + } // bulk tokenReceiverAddress if ( @@ -325,8 +327,8 @@ class TokenType1 { ) { config.tokenReceiverAddress.forEach((address: string) => { if (!addy.isSLPAddress(address)) - throw Error("Token Receiver Address must be simpleledger format") - }) + throw Error("Token Receiver Address must be simpleledger format"); + }); } // validate bchChangeReceiverAddress format @@ -334,15 +336,15 @@ class TokenType1 { config.bchChangeReceiverAddress && !addy.isCashAddress(config.bchChangeReceiverAddress) ) - throw Error("BCH Change Receiver Address must be cash address format") + throw Error("BCH Change Receiver Address must be cash address format"); // validate batonReceiverAddress format if ( config.batonReceiverAddress && !addy.isSLPAddress(config.batonReceiverAddress) ) - throw Error("Baton Receiver Address must be simpleledger format") + throw Error("Baton Receiver Address must be simpleledger format"); } } -export default TokenType1 +export default TokenType1; From f2514f4e50538c7c888d0b9996bd390a9b22e100 Mon Sep 17 00:00:00 2001 From: josephroyking Date: Thu, 6 Feb 2020 10:58:43 +0100 Subject: [PATCH 2/7] Same issue for multiple funding addresses --- lib/TokenType1.js | 7 +++++-- src/TokenType1.ts | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/TokenType1.js b/lib/TokenType1.js index b9fedc8..97c1753 100644 --- a/lib/TokenType1.js +++ b/lib/TokenType1.js @@ -256,8 +256,11 @@ var TokenType1 = /** @class */ (function () { // bchChangeReceiverAddress can be either simpleledger or cashAddr format // validate fundingAddress format // single fundingAddress - if (config.fundingAddress && !addy.isSLPAddress(config.fundingAddress)) - throw Error("Funding Address must be simpleledger format"); + if (config.fundingAddress && !Array.isArray(config.fundingAddress)) { + if (!addy.isSLPAddress(config.fundingAddress)) { + throw Error("Token Receiver Address must be simpleledger format"); + } + } // bulk fundingAddress if (config.fundingAddress && Array.isArray(config.fundingAddress)) { config.fundingAddress.forEach(function (address) { diff --git a/src/TokenType1.ts b/src/TokenType1.ts index 631f7c7..91db0fc 100644 --- a/src/TokenType1.ts +++ b/src/TokenType1.ts @@ -298,8 +298,12 @@ class TokenType1 { // bchChangeReceiverAddress can be either simpleledger or cashAddr format // validate fundingAddress format // single fundingAddress - if (config.fundingAddress && !addy.isSLPAddress(config.fundingAddress)) - throw Error("Funding Address must be simpleledger format"); + + if (config.fundingAddress && !Array.isArray(config.fundingAddress)) { + if (!addy.isSLPAddress(config.fundingAddress)) { + throw Error("Token Receiver Address must be simpleledger format"); + } + } // bulk fundingAddress if (config.fundingAddress && Array.isArray(config.fundingAddress)) { From c8c002f4707981b9817bc781e090a3b3a29f1fb3 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 6 Feb 2020 08:39:32 -0800 Subject: [PATCH 3/7] fixing linting --- src/TokenType1.ts | 214 +++++++++++++++++++++++----------------------- 1 file changed, 106 insertions(+), 108 deletions(-) diff --git a/src/TokenType1.ts b/src/TokenType1.ts index 91db0fc..5c5fd00 100644 --- a/src/TokenType1.ts +++ b/src/TokenType1.ts @@ -1,59 +1,59 @@ // require deps // imports -import { BITBOX } from "bitbox-sdk"; -import Address from "./Address"; +import { BITBOX } from "bitbox-sdk" +import Address from "./Address" import { IBurnConfig, ICreateConfig, IMintConfig, ISendConfig -} from "./interfaces/SLPInterfaces"; +} from "./interfaces/SLPInterfaces" // consts -const BigNumber: any = require("bignumber.js"); -const slpjs: any = require("slpjs"); -const addy: any = new Address(); +const BigNumber: any = require("bignumber.js") +const slpjs: any = require("slpjs") +const addy: any = new Address() class TokenType1 { - restURL: string; + restURL: string constructor(restURL?: string) { - this.restURL = restURL; + this.restURL = restURL } async create(createConfig: ICreateConfig) { // validate address formats - this.validateAddressFormat(createConfig); + this.validateAddressFormat(createConfig) // determine mainnet/testnet - const network: string = this.returnNetwork(createConfig.fundingAddress); + const network: string = this.returnNetwork(createConfig.fundingAddress) // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network); + const BITBOX: any = this.returnBITBOXInstance(network) // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) - let batonReceiverAddress: string; + let batonReceiverAddress: string if ( createConfig.batonReceiverAddress !== undefined && createConfig.batonReceiverAddress !== "" && createConfig.batonReceiverAddress !== null ) - batonReceiverAddress = createConfig.batonReceiverAddress; - else batonReceiverAddress = null; + batonReceiverAddress = createConfig.batonReceiverAddress + else batonReceiverAddress = null const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( createConfig.fundingAddress - ); + ) - let initialTokenQty: number = createConfig.initialTokenQty; + let initialTokenQty: number = createConfig.initialTokenQty initialTokenQty = new BigNumber(initialTokenQty).times( 10 ** createConfig.decimals - ); + ) balances.nonSlpUtxos.forEach( (txo: any) => (txo.wif = createConfig.fundingWif) - ); + ) const genesisTxid = await bitboxNetwork.simpleTokenGenesis( createConfig.name, createConfig.symbol, @@ -65,46 +65,46 @@ class TokenType1 { batonReceiverAddress, createConfig.bchChangeReceiverAddress, balances.nonSlpUtxos - ); - return genesisTxid; + ) + return genesisTxid } async mint(mintConfig: IMintConfig) { // validate address formats - this.validateAddressFormat(mintConfig); + this.validateAddressFormat(mintConfig) // determine mainnet/testnet - const network: string = this.returnNetwork(mintConfig.fundingAddress); + const network: string = this.returnNetwork(mintConfig.fundingAddress) // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network); + const BITBOX: any = this.returnBITBOXInstance(network) // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) const batonReceiverAddress: string = addy.toSLPAddress( mintConfig.batonReceiverAddress - ); + ) const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( mintConfig.fundingAddress - ); + ) if (!balances.slpBatonUtxos[mintConfig.tokenId]) - throw Error("You don't have the minting baton for this token"); + throw Error("You don't have the minting baton for this token") const tokenInfo: any = await bitboxNetwork.getTokenInformation( mintConfig.tokenId - ); + ) const mintQty = new BigNumber(mintConfig.additionalTokenQty).times( 10 ** tokenInfo.decimals - ); + ) - let inputUtxos = balances.slpBatonUtxos[mintConfig.tokenId]; + let inputUtxos = balances.slpBatonUtxos[mintConfig.tokenId] - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) - inputUtxos.forEach((txo: any) => (txo.wif = mintConfig.fundingWif)); + inputUtxos.forEach((txo: any) => (txo.wif = mintConfig.fundingWif)) const mintTxid = await bitboxNetwork.simpleTokenMint( mintConfig.tokenId, @@ -113,59 +113,59 @@ class TokenType1 { mintConfig.tokenReceiverAddress, batonReceiverAddress, mintConfig.bchChangeReceiverAddress - ); - return mintTxid; + ) + return mintTxid } async send(sendConfig: ISendConfig) { // validate address formats - this.validateAddressFormat(sendConfig); + this.validateAddressFormat(sendConfig) // determine mainnet/testnet - let network: string; + let network: string if (!Array.isArray(sendConfig.fundingAddress)) - network = this.returnNetwork(sendConfig.fundingAddress); - else network = this.returnNetwork(sendConfig.fundingAddress[0]); + network = this.returnNetwork(sendConfig.fundingAddress) + else network = this.returnNetwork(sendConfig.fundingAddress[0]) // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network); + const BITBOX: any = this.returnBITBOXInstance(network) // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) - const tokenId: string = sendConfig.tokenId; + const tokenId: string = sendConfig.tokenId const bchChangeReceiverAddress: string = addy.toSLPAddress( sendConfig.bchChangeReceiverAddress - ); + ) - const tokenInfo: any = await bitboxNetwork.getTokenInformation(tokenId); - const tokenDecimals: number = tokenInfo.decimals; + const tokenInfo: any = await bitboxNetwork.getTokenInformation(tokenId) + const tokenDecimals: number = tokenInfo.decimals if (!Array.isArray(sendConfig.fundingAddress)) { - let amount: any = sendConfig.amount; + let amount: any = sendConfig.amount const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( sendConfig.fundingAddress - ); + ) if (!Array.isArray(amount)) { - amount = new BigNumber(amount).times(10 ** tokenDecimals); // Don't forget to account for token precision + amount = new BigNumber(amount).times(10 ** tokenDecimals) // Don't forget to account for token precision } else { amount.forEach((amt: number, index: number) => { - amount[index] = new BigNumber(amt).times(10 ** tokenDecimals); // Don't forget to account for token precision - }); + amount[index] = new BigNumber(amt).times(10 ** tokenDecimals) // Don't forget to account for token precision + }) } - let inputUtxos = balances.slpTokenUtxos[tokenId]; + let inputUtxos = balances.slpTokenUtxos[tokenId] // console.log(`inputUtxos: ${JSON.stringify(inputUtxos, null, 2)}`) // console.log(`balances.nonSlpUtxos: ${JSON.stringify(balances.nonSlpUtxos, null, 2)}`) if (inputUtxos === undefined) - throw new Error(`Could not find any SLP token UTXOs`); + throw new Error(`Could not find any SLP token UTXOs`) - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) - inputUtxos.forEach((txo: any) => (txo.wif = sendConfig.fundingWif)); + inputUtxos.forEach((txo: any) => (txo.wif = sendConfig.fundingWif)) const sendTxid = await bitboxNetwork.simpleTokenSend( tokenId, @@ -173,63 +173,63 @@ class TokenType1 { inputUtxos, sendConfig.tokenReceiverAddress, bchChangeReceiverAddress - ); - return sendTxid; + ) + return sendTxid } - const utxos: any[] = []; + const utxos: any[] = [] const balances: any = await bitboxNetwork.getAllSlpBalancesAndUtxos( sendConfig.fundingAddress - ); + ) // Sign and add input token UTXOs const tokenBalances = balances.filter((i: any) => { try { - return i.result.slpTokenBalances[tokenId].isGreaterThan(0); + return i.result.slpTokenBalances[tokenId].isGreaterThan(0) } catch (_) { - return false; + return false } - }); + }) tokenBalances.map((i: any) => i.result.slpTokenUtxos[tokenId].forEach( (j: any) => (j.wif = sendConfig.fundingWif[i.address]) ) - ); + ) tokenBalances.forEach((a: any) => { try { - a.result.slpTokenUtxos[tokenId].forEach((txo: any) => utxos.push(txo)); + a.result.slpTokenUtxos[tokenId].forEach((txo: any) => utxos.push(txo)) } catch (_) {} - }); + }) // Sign and add input BCH (non-token) UTXOs const bchBalances = balances.filter( (i: any) => i.result.nonSlpUtxos.length > 0 - ); + ) bchBalances.map((i: any) => i.result.nonSlpUtxos.forEach( (j: any) => (j.wif = sendConfig.fundingWif[i.address]) ) - ); + ) bchBalances.forEach((a: any) => a.result.nonSlpUtxos.forEach((txo: any) => utxos.push(txo)) - ); + ) utxos.forEach((txo: any) => { if (Array.isArray(sendConfig.fundingAddress)) { sendConfig.fundingAddress.forEach((address: string, index: number) => { if (txo.cashAddress === addy.toCashAddress(address)) - txo.wif = sendConfig.fundingWif[index]; - }); + txo.wif = sendConfig.fundingWif[index] + }) } - }); + }) - let amount: any = sendConfig.amount; + let amount: any = sendConfig.amount if (!Array.isArray(amount)) { - amount = new BigNumber(amount).times(10 ** tokenDecimals); // Don't forget to account for token precision + amount = new BigNumber(amount).times(10 ** tokenDecimals) // Don't forget to account for token precision } else { amount.forEach((amt: number, index: number) => { - amount[index] = new BigNumber(amt).times(10 ** tokenDecimals); // Don't forget to account for token precision - }); + amount[index] = new BigNumber(amt).times(10 ** tokenDecimals) // Don't forget to account for token precision + }) } return await bitboxNetwork.simpleTokenSend( tokenId, @@ -237,59 +237,59 @@ class TokenType1 { utxos, sendConfig.tokenReceiverAddress, bchChangeReceiverAddress - ); + ) } async burn(burnConfig: IBurnConfig) { // validate address formats - this.validateAddressFormat(burnConfig); + this.validateAddressFormat(burnConfig) // determine mainnet/testnet - const network: string = this.returnNetwork(burnConfig.fundingAddress); + const network: string = this.returnNetwork(burnConfig.fundingAddress) // network appropriate BITBOX instance - const BITBOX: any = this.returnBITBOXInstance(network); + const BITBOX: any = this.returnBITBOXInstance(network) // slpjs BITBOX Network instance - const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX); + const bitboxNetwork = new slpjs.BitboxNetwork(BITBOX) const bchChangeReceiverAddress: string = addy.toSLPAddress( burnConfig.bchChangeReceiverAddress - ); + ) const tokenInfo = await bitboxNetwork.getTokenInformation( burnConfig.tokenId - ); - const tokenDecimals = tokenInfo.decimals; + ) + const tokenDecimals = tokenInfo.decimals const balances = await bitboxNetwork.getAllSlpBalancesAndUtxos( burnConfig.fundingAddress - ); - const amount = new BigNumber(burnConfig.amount).times(10 ** tokenDecimals); - let inputUtxos = balances.slpTokenUtxos[burnConfig.tokenId]; + ) + const amount = new BigNumber(burnConfig.amount).times(10 ** tokenDecimals) + let inputUtxos = balances.slpTokenUtxos[burnConfig.tokenId] - inputUtxos = inputUtxos.concat(balances.nonSlpUtxos); + inputUtxos = inputUtxos.concat(balances.nonSlpUtxos) - inputUtxos.forEach((txo: any) => (txo.wif = burnConfig.fundingWif)); + inputUtxos.forEach((txo: any) => (txo.wif = burnConfig.fundingWif)) const burnTxid = await bitboxNetwork.simpleTokenBurn( burnConfig.tokenId, amount, inputUtxos, bchChangeReceiverAddress - ); - return burnTxid; + ) + return burnTxid } returnNetwork(address: string): string { - return addy.detectAddressNetwork(address); + return addy.detectAddressNetwork(address) } returnBITBOXInstance(network: string): any { - let tmpBITBOX: any; + let tmpBITBOX: any - let restURL: string; - if (network === "mainnet") restURL = "https://rest.bitcoin.com/v2/"; - else restURL = "https://trest.bitcoin.com/v2/"; + let restURL: string + if (network === "mainnet") restURL = "https://rest.bitcoin.com/v2/" + else restURL = "https://trest.bitcoin.com/v2/" - return new BITBOX({ restURL: restURL }); + return new BITBOX({ restURL: restURL }) } validateAddressFormat(config: any): string | void { @@ -300,17 +300,16 @@ class TokenType1 { // single fundingAddress if (config.fundingAddress && !Array.isArray(config.fundingAddress)) { - if (!addy.isSLPAddress(config.fundingAddress)) { - throw Error("Token Receiver Address must be simpleledger format"); - } + if (!addy.isSLPAddress(config.fundingAddress)) + throw Error("Token Receiver Address must be simpleledger format") } // bulk fundingAddress if (config.fundingAddress && Array.isArray(config.fundingAddress)) { config.fundingAddress.forEach((address: string) => { if (!addy.isSLPAddress(address)) - throw Error("Funding Address must be simpleledger format"); - }); + throw Error("Funding Address must be simpleledger format") + }) } // validate tokenReceiverAddress format @@ -319,9 +318,8 @@ class TokenType1 { config.tokenReceiverAddress && !Array.isArray(config.tokenReceiverAddress) ) { - if (!addy.isSLPAddress(config.tokenReceiverAddress)) { - throw Error("Token Receiver Address must be simpleledger format"); - } + if (!addy.isSLPAddress(config.tokenReceiverAddress)) + throw Error("Token Receiver Address must be simpleledger format") } // bulk tokenReceiverAddress @@ -331,8 +329,8 @@ class TokenType1 { ) { config.tokenReceiverAddress.forEach((address: string) => { if (!addy.isSLPAddress(address)) - throw Error("Token Receiver Address must be simpleledger format"); - }); + throw Error("Token Receiver Address must be simpleledger format") + }) } // validate bchChangeReceiverAddress format @@ -340,15 +338,15 @@ class TokenType1 { config.bchChangeReceiverAddress && !addy.isCashAddress(config.bchChangeReceiverAddress) ) - throw Error("BCH Change Receiver Address must be cash address format"); + throw Error("BCH Change Receiver Address must be cash address format") // validate batonReceiverAddress format if ( config.batonReceiverAddress && !addy.isSLPAddress(config.batonReceiverAddress) ) - throw Error("Baton Receiver Address must be simpleledger format"); + throw Error("Baton Receiver Address must be simpleledger format") } } -export default TokenType1; +export default TokenType1 From cc37ab3de26f05f3e1c9140983493c68ffc96fc5 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 6 Feb 2020 08:42:23 -0800 Subject: [PATCH 4/7] fix(token send): Now works with an array of addresses --- src/TokenType1.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/TokenType1.ts b/src/TokenType1.ts index 5c5fd00..6bc210d 100644 --- a/src/TokenType1.ts +++ b/src/TokenType1.ts @@ -1,3 +1,8 @@ +/* + This library is concerned with the Token Type 1 defined in this specification: + https://github.com/simpleledger/slp-specifications/blob/master/slp-token-type-1.md +*/ + // require deps // imports import { BITBOX } from "bitbox-sdk" From fe5f368929ccdb1de4c3d157874227ac4f33d9ee Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Tue, 18 Feb 2020 08:35:27 -0800 Subject: [PATCH 5/7] Fixing broken unit and integration tests --- test/Utils.js | 120 +++++++++++++++--------------------- test/fixtures/mock-utils.js | 108 +++++++++++--------------------- 2 files changed, 86 insertions(+), 142 deletions(-) diff --git a/test/Utils.js b/test/Utils.js index 5cb9d32..7934753 100644 --- a/test/Utils.js +++ b/test/Utils.js @@ -53,31 +53,25 @@ describe("#Utils", () => { } const list = await SLP.Utils.list() - //console.log(`list: ${JSON.stringify(list, null, 2)}`) + // console.log(`list: ${JSON.stringify(list, null, 2)}`) assert2.isArray(list) - assert2.hasAllKeys(list[0], [ - "blockCreated", - "blockLastActiveMint", - "blockLastActiveSend", - "circulatingSupply", - "containsBaton", - "decimals", - "documentHash", - "documentUri", - "id", - "initialTokenQty", - "mintingBatonStatus", - "name", - "symbol", - "timestamp", - "timestampUnix", - "totalBurned", - "totalMinted", - "txnsSinceGenesis", - "validAddresses", - "versionType" - ]) + + assert2.property(list[0], "decimals") + assert2.property(list[0], "timestamp") + assert2.property(list[0], "versionType") + assert2.property(list[0], "documentUri") + assert2.property(list[0], "symbol") + assert2.property(list[0], "name") + assert2.property(list[0], "containsBaton") + assert2.property(list[0], "id") + assert2.property(list[0], "documentHash") + assert2.property(list[0], "initialTokenQty") + assert2.property(list[0], "blockCreated") + assert2.property(list[0], "totalMinted") + assert2.property(list[0], "totalBurned") + assert2.property(list[0], "circulatingSupply") + assert2.property(list[0], "timestampUnix") }) it(`should list single SLP token by id: 4276533bb702e7f8c9afd8aa61ebf016e95011dc3d54e55faa847ac1dd461e84`, async () => { @@ -92,34 +86,28 @@ describe("#Utils", () => { "4276533bb702e7f8c9afd8aa61ebf016e95011dc3d54e55faa847ac1dd461e84" const list = await SLP.Utils.list(tokenId) - //console.log(`list: ${JSON.stringify(list, null, 2)}`) + // console.log(`list: ${JSON.stringify(list, null, 2)}`) + + assert2.property(list, "decimals") + assert2.property(list, "timestamp") + assert2.property(list, "versionType") + assert2.property(list, "documentUri") + assert2.property(list, "symbol") + assert2.property(list, "name") + assert2.property(list, "containsBaton") + assert2.property(list, "id") + assert2.property(list, "documentHash") + assert2.property(list, "initialTokenQty") + assert2.property(list, "blockCreated") + assert2.property(list, "totalMinted") + assert2.property(list, "totalBurned") + assert2.property(list, "circulatingSupply") + assert2.property(list, "timestampUnix") - assert2.hasAllKeys(list, [ - "blockCreated", - "blockLastActiveMint", - "blockLastActiveSend", - "circulatingSupply", - "containsBaton", - "decimals", - "documentHash", - "documentUri", - "id", - "initialTokenQty", - "mintingBatonStatus", - "name", - "symbol", - "timestamp", - "timestampUnix", - "totalBurned", - "totalMinted", - "txnsSinceGenesis", - "validAddresses", - "versionType" - ]) assert.equal(list.id, tokenId) }) - it(`should list multople SLP tokens by array of ids`, async () => { + it(`should list multiple SLP tokens by array of ids`, async () => { // Mock the call to rest.bitcoin.com if (process.env.TEST === "unit") { nock(SERVER) @@ -135,28 +123,22 @@ describe("#Utils", () => { const list = await SLP.Utils.list(tokenIds) // console.log(`list: ${JSON.stringify(list, null, 2)}`) - assert2.hasAllKeys(list[0], [ - "blockCreated", - "blockLastActiveMint", - "blockLastActiveSend", - "circulatingSupply", - "containsBaton", - "decimals", - "documentHash", - "documentUri", - "id", - "initialTokenQty", - "mintingBatonStatus", - "name", - "symbol", - "timestamp", - "timestampUnix", - "totalBurned", - "totalMinted", - "txnsSinceGenesis", - "validAddresses", - "versionType" - ]) + assert2.property(list[0], "decimals") + assert2.property(list[0], "timestamp") + assert2.property(list[0], "versionType") + assert2.property(list[0], "documentUri") + assert2.property(list[0], "symbol") + assert2.property(list[0], "name") + assert2.property(list[0], "containsBaton") + assert2.property(list[0], "id") + assert2.property(list[0], "documentHash") + assert2.property(list[0], "initialTokenQty") + assert2.property(list[0], "blockCreated") + assert2.property(list[0], "totalMinted") + assert2.property(list[0], "totalBurned") + assert2.property(list[0], "circulatingSupply") + assert2.property(list[0], "timestampUnix") + assert.equal(list[0].id, tokenIds[0]) }) }) diff --git a/test/fixtures/mock-utils.js b/test/fixtures/mock-utils.js index 2da42d9..879d803 100644 --- a/test/fixtures/mock-utils.js +++ b/test/fixtures/mock-utils.js @@ -5,54 +5,43 @@ const mockList = [ { decimals: 0, - timestamp: "2019-04-29 08:59", - timestampUnix: 1539218362, + timestamp: "2019-02-02 00:09:12", versionType: 1, documentUri: "", - symbol: "WMW", - name: "WheresMyWallet", - containsBaton: false, - id: "8fc284dcbc922f7bb7e2a443dc3af792f52923bba403fcf67ca028c88e89da0e", + symbol: "LVL032", + name: "Lode Runner Level 32 Resume", + containsBaton: true, + id: "3641fc50120b604e4020ab8930f10f687b886db4280fb94a35f25ef4b891bb49", documentHash: null, - initialTokenQty: 1000, - blockCreated: 580336, - blockLastActiveSend: 580336, - blockLastActiveMint: null, - txnsSinceGenesis: 1, - validAddresses: 1, - totalMinted: 1000, - totalBurned: 0, - circulatingSupply: 1000, - mintingBatonStatus: "NEVER_CREATED" + initialTokenQty: 0, + blockCreated: 574388, + totalMinted: null, + totalBurned: null, + circulatingSupply: null, + timestampUnix: 1549066152 }, { - decimals: 0, - timestamp: "2019-04-29 08:59", - timestampUnix: 1539218362, + decimals: 8, + timestamp: "2019-02-01 23:32:48", versionType: 1, - documentUri: "", - symbol: "WMW", - name: "Where'sMyWallet", + documentUri: "SloppyChikun.cash", + symbol: "CHIKUN", + name: "Sloppy Chikun", containsBaton: false, - id: "471d1f33e8a69cf59ce174ce43174feeecdf1f475ccc4cc3705600a5d6d2cd06", + id: "3cc09f707c6ca0c9dcb6b3df6e5df6d6d1e49864fa0948d5f744648f1f2ee865", documentHash: null, - initialTokenQty: 1000, - blockCreated: 580336, - blockLastActiveSend: 580351, - blockLastActiveMint: null, - txnsSinceGenesis: 2, - validAddresses: 2, - totalMinted: 1000, - totalBurned: 0, - circulatingSupply: 1000, - mintingBatonStatus: "NEVER_CREATED" + initialTokenQty: 84000000, + blockCreated: 574387, + totalMinted: null, + totalBurned: null, + circulatingSupply: null, + timestampUnix: 1549063968 } ] const mockToken = { decimals: 0, - timestamp: "2018-08-25 01:54", - timestampUnix: 1539218362, + timestamp: "2018-07-06 01:54:35", versionType: 1, documentUri: "", symbol: "USDT", @@ -62,21 +51,16 @@ const mockToken = { documentHash: null, initialTokenQty: 10000000000000000, blockCreated: 544903, - blockLastActiveSend: 544905, - blockLastActiveMint: null, - txnsSinceGenesis: 3, - validAddresses: 0, - totalMinted: 10000000000000000, - totalBurned: 10000000000000000, - circulatingSupply: 0, - mintingBatonStatus: "NEVER_CREATED" + totalMinted: null, + totalBurned: null, + circulatingSupply: null, + timestampUnix: 1530842075 } const mockTokens = [ { decimals: 0, - timestamp: "2018-08-25 01:54", - timestampUnix: 1539218362, + timestamp: "2018-07-06 01:54:35", versionType: 1, documentUri: "", symbol: "USDT", @@ -86,36 +70,14 @@ const mockTokens = [ documentHash: null, initialTokenQty: 10000000000000000, blockCreated: 544903, - blockLastActiveSend: 544905, - blockLastActiveMint: null, - txnsSinceGenesis: 3, - validAddresses: 0, - totalMinted: 10000000000000000, - totalBurned: 10000000000000000, - circulatingSupply: 0, - mintingBatonStatus: "NEVER_CREATED" + totalMinted: null, + totalBurned: null, + circulatingSupply: null, + timestampUnix: 1530842075 }, { - decimals: 0, - timestamp: "2019-04-29 08:59", - timestampUnix: 1539218362, - versionType: 1, - documentUri: "", - symbol: "WMW", - name: "Where'sMyWallet", - containsBaton: false, - id: "471d1f33e8a69cf59ce174ce43174feeecdf1f475ccc4cc3705600a5d6d2cd06", - documentHash: null, - initialTokenQty: 1000, - blockCreated: 580336, - blockLastActiveSend: 580351, - blockLastActiveMint: null, - txnsSinceGenesis: 2, - validAddresses: 2, - totalMinted: 1000, - totalBurned: 0, - circulatingSupply: 1000, - mintingBatonStatus: "NEVER_CREATED" + id: "b3f4f132dc3b9c8c96316346993a8d54d729715147b7b11aa6c8cd909e955313", + valid: false } ] From d0fe9d3e3d671db4083da63b0e0f2a15873d8da3 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 2 Mar 2020 11:41:22 -0800 Subject: [PATCH 6/7] fixing e2e token test --- test/e2e/util/e2e-util.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/e2e/util/e2e-util.js b/test/e2e/util/e2e-util.js index c646fb9..f81e764 100644 --- a/test/e2e/util/e2e-util.js +++ b/test/e2e/util/e2e-util.js @@ -14,7 +14,7 @@ const SLPSDK = require("../../../lib/SLP") const slpsdk = new SLPSDK() const TEST_TOKEN_ID = - "f3fcb5eb95bb02e0532952ac4f209c55c8022ae24979a1c4098dd171a2a28b78" + "f16b1a32f0e7fc7f2c55e787e6b16461af1350c6b5070875606e30ba11f123a1" // Open a wallet and return an object with its address, BCH balance, and SLP // token balance. @@ -22,11 +22,11 @@ async function openWallet(filename) { try { walletInfo = require(filename) - //const walletBalance = await getBalance(walletInfo) + // const walletBalance = await getBalance(walletInfo) // const walletBalance = await slpsdk.Utils.balancesForAddress( // walletInfo.slpAddress // ) - // // console.log(`walletBalance: ${JSON.stringify(walletBalance, null, 2)}`) + // console.log(`walletBalance: ${JSON.stringify(walletBalance, null, 2)}`) // walletInfo.tokenBalance = walletBalance return walletInfo From dad8e3139d2b4a691ded13ee611f84ad879bbe24 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Mon, 2 Mar 2020 14:34:45 -0800 Subject: [PATCH 7/7] Updating lock file --- yarn.lock | 75 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/yarn.lock b/yarn.lock index def4cf1..f4a9e3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -333,6 +333,18 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/socket.io-client@^1.4.32": + version "1.4.32" + resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14" + integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg== + +"@types/socket.io@^2.1.2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/socket.io/-/socket.io-2.1.4.tgz#674e7bc193c5ccdadd4433f79f3660d31759e9ac" + integrity sha512-cI98INy7tYnweTsUlp8ocveVdAxENUThO0JsLSCs51cjOP2yV5Mqo5QszMDPckyRRA+PO6+wBgKvGvHUCc23TQ== + dependencies: + "@types/node" "*" + "@types/wif@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/wif/-/wif-2.0.1.tgz#bcab48b201403cb759cd7659aff4610cfd4888f4" @@ -981,10 +993,10 @@ bc-bip68@^1.0.5: resolved "https://registry.yarnpkg.com/bc-bip68/-/bc-bip68-1.0.5.tgz#4d3774067d8c9e922e225f5f2c4178ee9ae8dc94" integrity sha512-GzaMlN7pNthrY5BhReVhnfr4Ixx+GUSfyNRHYh0QiMUF0d0+0YaD8MpEdv6AjFBksg/zlqL1fVCBBm6PpTt2Rg== -bchaddrjs-slp@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/bchaddrjs-slp/-/bchaddrjs-slp-0.2.7.tgz#df90e5ccfa54646cacd9020f714cb49b69a8102e" - integrity sha512-wqd4RFMGWzT3ukNbIzLR3pG6EMpcbCUcqXHa0UsegNKkKXZUFXg3dIfa01MRFr4R9D4jnJgDCgY0pa4B4ih4vQ== +bchaddrjs-slp@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/bchaddrjs-slp/-/bchaddrjs-slp-0.2.8.tgz#ddad236daa0f5a10480f57d7ad082b54576ef153" + integrity sha512-Is4NQG0xhrmW8ml40n8IjQzYlg1gMqst2RkF20SWjuhiSA8VDx1F53krthFqZFp5hpB+Ig/NPx6NX4VEH9W32Q== dependencies: bs58check "^2.1.2" cashaddrjs-slp "^0.2.12" @@ -996,7 +1008,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bech32@^1.1.2, bech32@^1.1.3: +bech32@=1.1.3, bech32@^1.1.2, bech32@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.3.tgz#bd47a8986bbb3eec34a56a097a84b8d3e9a2dfcd" integrity sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg== @@ -1177,17 +1189,31 @@ bitcoinjs-message@^2.0.0: secp256k1 "^3.0.1" varuint-bitcoin "^1.0.1" -bitcore-lib-cash@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/bitcore-lib-cash/-/bitcore-lib-cash-0.19.0.tgz#357ebc25ae618d3b48be2821e17c74151d539f7b" - integrity sha512-JBD30YS5M2OSUPbXggM257FjWXb5A1pHFn88lZQsqOokgddmdwp45K4APVEsj2iaKLR7uLOnGppSbAWj5Hihwg== +bitcore-lib-cash@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bitcore-lib-cash/-/bitcore-lib-cash-9.0.0.tgz#bfb96462ef1307504c11e0fbb0eac3890ff93fb3" + integrity sha512-u53DJLnjUm/M7NehrzJZAOoLP7mne9Jd1KUFt4xSkQ9vA/NpXgpj5/j7LeR0VzYENNzPkD/fBfXTN+1gbgsRjw== dependencies: + bitcore-lib "^9.0.0" bn.js "=4.11.8" - bs58 "=4.0.1" + bs58 "^4.0.1" buffer-compare "=1.1.1" elliptic "=6.4.0" inherits "=2.0.1" - lodash "=4.17.11" + lodash "=4.17.15" + +bitcore-lib@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-9.0.0.tgz#bc3d5e9f4d635fdf94bffe4d217aa51c7b299d43" + integrity sha512-WXg8MXv57xg/WB7WZ/6wj4W1VbRVL83d5taWOKLbxXc6VspwSss6w5DyDJ5YDe1fDyWADjz4fsSU4nCj6jWTgA== + dependencies: + bech32 "=1.1.3" + bn.js "=4.11.8" + bs58 "^4.0.1" + buffer-compare "=1.1.1" + elliptic "=6.4.0" + inherits "=2.0.1" + lodash "=4.17.15" blob@0.0.5: version "0.0.5" @@ -1275,7 +1301,7 @@ browserify-aes@^1.0.1, browserify-aes@^1.0.6: inherits "^2.0.1" safe-buffer "^5.0.1" -bs58@=4.0.1, bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= @@ -5023,12 +5049,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@=4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: +lodash@=4.17.15, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -7526,16 +7547,22 @@ slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -slpjs@0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/slpjs/-/slpjs-0.22.0.tgz#4d9a5e19c8f1f5c1a26cd39ed9dbdca1339bc1b1" - integrity sha512-BAE2fZu5l3tRqlb8dVZHHB22tBXtRz5G8JU0z1F0sCZ9rcXRM0fP9kGsmSZPZRraACBbXOxmyZ4blYh0kKQG4w== +slpjs@^0.23.0: + version "0.23.3" + resolved "https://registry.yarnpkg.com/slpjs/-/slpjs-0.23.3.tgz#af0c3fdb6685c16b7220625932ac3402f534af74" + integrity sha512-2cmU6IsshvNFj0n0tg0aO/1rKxQMYvUhJ75U6kUqfzF03FjMxGUaZAqszKQZQ/0utw/fLQEatNriXI5iePLNdQ== dependencies: + "@types/bigi" "^1.4.2" + "@types/bip39" "^2.4.2" "@types/lodash" "^4.14.120" + "@types/randombytes" "^2.0.0" + "@types/socket.io" "^2.1.2" + "@types/socket.io-client" "^1.4.32" + "@types/wif" "^2.0.1" axios "^0.18.1" - bchaddrjs-slp "0.2.7" + bchaddrjs-slp "0.2.8" bignumber.js "^8.1.1" - bitcore-lib-cash "^0.19.0" + bitcore-lib-cash "^9.0.0" lodash "^4.17.14" smart-buffer@4.0.2: