PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/test/integration
Просмотр файла: wallets.ts
//
// Tests for Wallets
//
// Copyright 2014, BitGo, Inc. All Rights Reserved.
//
/* eslint-disable @typescript-eslint/no-empty-function */
import { strict as assert } from 'assert';
import 'should';
const Q = require('q');
const TestBitGo = require('../lib/test_bitgo');
import * as utxolib from '@bitgo/utxo-lib';
import { getAddressP2PKH, getNetwork } from '../../src/bitcoin';
import { common } from '@bitgo/sdk-core';
import * as nock from 'nock';
const TEST_WALLET_LABEL = 'wallet management test';
describe('Wallets', function () {
let bitgo;
let wallets;
let testWallet; // Test will create this wallet
const keychains: any[] = []; // Test will create these keychains
before(function (done) {
nock.restore();
bitgo = new TestBitGo();
bitgo.initializeTestVars();
wallets = bitgo.wallets();
bitgo.authenticateTestUser(bitgo.testUserOTP(), function (err, response) {
if (err) {
throw err;
}
done();
});
});
describe('List', function () {
it('arguments', function () {
assert.throws(function () {
wallets.list({}, 'invalid');
});
assert.throws(function () {
wallets.list('invalid');
});
});
it('all', function (done) {
wallets.list({}, function (err, result) {
assert.equal(err, null);
result.should.have.property('wallets');
result.should.have.property('start');
result.should.have.property('limit');
result.should.have.property('total');
result.start.should.equal(0);
result.limit.should.not.equal(0);
result.total.should.not.equal(0);
result.wallets.length.should.not.equal(0);
done();
});
});
it('prevId', function () {
return wallets
.list({})
.then(function (result) {
result.should.have.property('wallets');
result.should.have.property('start');
result.should.have.property('limit');
result.should.have.property('total');
result.should.have.property('nextBatchPrevId');
return wallets.list({ prevId: result.nextBatchPrevId });
})
.then(function (result) {
result.should.have.property('wallets');
result.should.not.have.property('start'); // if you passed in the prevId start will be undefined
result.should.have.property('limit');
result.should.have.property('total');
});
});
it('limit', function (done) {
wallets.list({ limit: 2 }, function (err, result) {
assert.equal(err, null);
result.should.have.property('wallets');
result.should.have.property('start');
result.should.have.property('limit');
result.should.have.property('total');
result.start.should.equal(0);
result.limit.should.equal(2);
result.total.should.not.equal(0);
result.wallets.length.should.equal(2);
done();
});
});
it('skip', function (done) {
wallets.list({ limit: 1, skip: 2 }, function (err, result) {
assert.equal(err, null);
result.should.have.property('wallets');
result.should.have.property('start');
result.should.have.property('limit');
result.should.have.property('total');
result.start.should.equal(2);
result.limit.should.equal(1);
result.total.should.not.equal(0);
result.wallets.length.should.equal(1);
done();
});
});
it('limit and skip', function (done) {
wallets.list({ limit: 1, skip: 5 }, function (err, result) {
assert.equal(err, null);
result.should.have.property('wallets');
result.should.have.property('start');
result.should.have.property('limit');
result.should.have.property('total');
result.start.should.equal(5);
result.limit.should.equal(1);
result.total.should.not.equal(0);
result.wallets.length.should.equal(1);
done();
});
});
});
describe('Add', function () {
before(function () {
keychains.push(bitgo.keychains().create());
keychains.push(bitgo.keychains().create());
});
it('arguments', function () {
assert.throws(function () {
wallets.add();
});
assert.throws(function () {
wallets.add('invalid');
});
assert.throws(function () {
wallets.add({}, 0);
});
});
it('wallet', function (done) {
const options = {
xpub: keychains[0].xpub,
encryptedXprv: keychains[0].xprv,
};
bitgo.keychains().add(options, function (err, keychain) {
assert.equal(err, null);
assert.equal(keychain.xpub, keychains[0].xpub);
assert.equal(keychain.encryptedXprv, keychains[0].xprv);
const options = {
xpub: keychains[1].xpub,
};
bitgo.keychains().add(options, function (err, keychain) {
assert.equal(err, null);
assert.equal(keychain.xpub, keychains[1].xpub);
bitgo.keychains().createBitGo({}, function (err, keychain) {
assert(keychain.xpub);
keychains.push(keychain);
const options = {
label: 'my wallet',
m: 2,
n: 3,
keychains: keychains.map(function (k) {
return { xpub: k.xpub };
}),
};
wallets.add(options, function (err, wallet) {
assert.equal(err, null);
testWallet = wallet;
assert.equal(wallet.balance(), 0);
assert.equal(wallet.label(), 'my wallet');
assert.equal(wallet.confirmedBalance(), 0);
assert.equal(wallet.keychains.length, 3);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[0].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[1].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[2].xpub }), true);
assert.equal(wallet.keychains[0].xpub, keychains[0].xpub);
assert.equal(wallet.keychains[1].xpub, keychains[1].xpub);
done();
});
});
});
});
});
});
describe('Create wallet with createWalletWithKeychains', function () {
it('arguments', function () {
const backupXpub = 1234567890;
assert.throws(function () {
wallets.createWalletWithKeychains({ passphrase: TestBitGo.TEST_WALLET1_PASSCODE, backupXpub: backupXpub });
});
assert.throws(function () {
wallets.createWalletWithKeychains({
passphrase: TestBitGo.TEST_WALLET1_PASSCODE,
label: TEST_WALLET_LABEL,
backupXpub: backupXpub,
});
});
assert.throws(function () {
wallets.createWalletWithKeychains({
passphrase: TestBitGo.TEST_WALLET1_PASSCODE,
label: TEST_WALLET_LABEL,
backupXpub: 123,
});
});
assert.throws(function () {
wallets.createWalletWithKeychains({ label: TEST_WALLET_LABEL, backupXpub: backupXpub });
});
assert.throws(function () {
wallets.createWalletWithKeychains('invalid');
});
assert.throws(function () {
wallets.createWalletWithKeychains();
});
});
it('default create', function (done) {
const options = {
passphrase: TestBitGo.TEST_WALLET1_PASSCODE,
label: TEST_WALLET_LABEL,
};
bitgo.wallets().createWalletWithKeychains(options, function (err, result) {
assert.equal(err, null);
assert.notEqual(result, null);
result.should.have.property('wallet');
const wallet = result.wallet;
assert.equal(wallet.balance(), 0);
assert.equal(wallet.spendableBalance(), 0);
assert.equal(wallet.label(), TEST_WALLET_LABEL);
assert.equal(wallet.confirmedBalance(), 0);
assert.equal(wallet.keychains.length, 3);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[0].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[1].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[2].xpub }), true);
assert.equal(wallet.keychains[0].xpub, result.userKeychain.xpub);
assert.equal(wallet.keychains[1].xpub, result.backupKeychain.xpub);
result.userKeychain.should.have.property('encryptedXprv');
result.backupKeychain.should.not.have.property('encryptedXprv');
result.backupKeychain.should.have.property('xprv');
result.warning.should.containEql('backup the backup keychain -- it is not stored anywhere else');
wallet.delete({}, function () {});
done();
});
});
it('create with cold backup xpub', function (done) {
// Simulate a cold backup key
const coldBackupKey = bitgo.keychains().create();
const options = {
passphrase: TestBitGo.TEST_WALLET1_PASSCODE,
label: TEST_WALLET_LABEL,
backupXpub: coldBackupKey.xpub,
};
bitgo.wallets().createWalletWithKeychains(options, function (err, result) {
assert.equal(err, null);
assert.notEqual(result, null);
result.should.have.property('wallet');
const wallet = result.wallet;
assert.equal(wallet.balance(), 0);
assert.equal(wallet.label(), TEST_WALLET_LABEL);
assert.equal(wallet.confirmedBalance(), 0);
assert.equal(wallet.keychains.length, 3);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[0].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[1].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[2].xpub }), true);
assert.equal(wallet.keychains[0].xpub, result.userKeychain.xpub);
assert.equal(wallet.keychains[1].xpub, result.backupKeychain.xpub);
assert.equal(result.backupKeychain.xpub, coldBackupKey.xpub);
result.userKeychain.should.have.property('encryptedXprv');
result.backupKeychain.should.have.property('xpub');
result.backupKeychain.should.not.have.property('xprv');
result.backupKeychain.should.not.have.property('encryptedXprv');
wallet.delete({}, function () {});
done();
});
});
it('create with backup xpub provider (KRS wallet)', function (done) {
const options = {
passphrase: TestBitGo.TEST_WALLET1_PASSCODE,
label: TEST_WALLET_LABEL,
backupXpubProvider: 'keyvault-io',
};
bitgo.wallets().createWalletWithKeychains(options, function (err, result) {
assert.equal(err, null);
assert.notEqual(result, null);
result.should.have.property('wallet');
const wallet = result.wallet;
assert.equal(wallet.balance(), 0);
assert.equal(wallet.spendableBalance(), 0);
assert.equal(wallet.label(), TEST_WALLET_LABEL);
assert.equal(wallet.confirmedBalance(), 0);
assert.equal(wallet.keychains.length, 3);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[0].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[1].xpub }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[2].xpub }), true);
assert.equal(wallet.keychains[0].xpub, result.userKeychain.xpub);
assert.equal(wallet.keychains[1].xpub, result.backupKeychain.xpub);
result.userKeychain.should.have.property('encryptedXprv');
result.backupKeychain.should.not.have.property('encryptedXprv');
result.should.not.have.property('warning');
result.wallet.canSendInstant().should.eql(true);
wallet.delete({}, function () {});
done();
});
});
});
describe('Get', function () {
it('arguments', function () {
assert.throws(function () {
wallets.get();
});
assert.throws(function () {
wallets.get('invalid');
});
assert.throws(function () {
wallets.get({}, function () {});
});
});
it('non existent wallet', function (done) {
const newKey = wallets.createKey();
const options = {
id: newKey.address.toString(),
};
wallets.get(options, function (err, wallet) {
assert(!wallet);
done();
});
});
it('get', function (done) {
const options = {
id: testWallet.id(),
};
wallets.get(options, function (err, wallet) {
assert.equal(err, null);
assert.equal(wallet.id(), options.id);
assert.equal(wallet.balance(), 0);
assert.equal(wallet.label(), 'my wallet');
assert.equal(wallet.confirmedBalance(), 0);
assert.equal(wallet.unconfirmedReceives(), 0);
assert.equal(wallet.unconfirmedSends(), 0);
assert.equal(wallet.approvalsRequired(), 1);
assert.equal(wallet.keychains.length, 3);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[0] }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[1] }), true);
assert.equal(bitgo.keychains().isValid({ key: wallet.keychains[2] }), true);
done();
});
});
});
describe('Setup forward wallet', function () {
let key;
let sourceAddress;
before(() => {
key = utxolib.ECPair.makeRandom({ network: getNetwork(common.Environments[bitgo.getEnv()].network) });
sourceAddress = getAddressP2PKH(key);
});
it('arguments', function () {
assert.throws(function () {
wallets.createForwardWallet('invalid');
});
assert.throws(function () {
wallets.createForwardWallet();
});
assert.throws(function () {
wallets.createForwardWallet({ privKey: key.toWIF(), sourceAddress: null, destinationWallet: testWallet });
});
assert.throws(function () {
wallets.createForwardWallet({
privKey: 'asdasdsa',
sourceAddress: sourceAddress,
destinationWallet: testWallet,
});
});
assert.throws(function () {
wallets.createForwardWallet({ privKey: key.toWIF(), sourceAddress: sourceAddress, destinationWallet: null });
});
assert.throws(function () {
wallets.createForwardWallet({
privKey: key.toWIF(),
sourceAddress: TestBitGo.TEST_WALLET3_ADDRESS,
destinationWallet: null,
});
});
});
it('default', function () {
return wallets
.createForwardWallet({
privKey: key.toWIF(),
sourceAddress: sourceAddress,
destinationWallet: testWallet,
label: 'forward ' + sourceAddress,
})
.then(function (result) {
result.id.should.eql(sourceAddress);
result.isActive.should.eql(true);
result.type.should.eql('forward');
result.label.should.eql('forward ' + sourceAddress);
result.private.destinationAddress.should.startWith('2');
});
});
it('send coins to forward wallet', function () {
return bitgo
.unlock({ otp: '0000000' })
.then(function () {
return wallets.get({ id: TestBitGo.TEST_WALLET3_ADDRESS });
})
.then(function (test3wallet) {
return test3wallet.sendCoins({
address: sourceAddress,
amount: 0.0005 * 1e8,
walletPassphrase: TestBitGo.TEST_WALLET3_PASSCODE,
fee: 0.0001 * 1e8,
});
})
.then(function (result) {
result.should.have.property('tx');
result.should.have.property('hash');
result.should.have.property('fee');
return Q.delay(3500).then(function () {
return testWallet.get();
});
})
.then(function (wallet) {
assert.equal(wallet.id(), testWallet.id());
assert.equal(wallet.balance(), 0.0004 * 1e8); // fee of 0.0001
assert.equal(wallet.label(), 'my wallet');
});
});
});
describe('Delete', function () {
it('arguments', function (done) {
assert.throws(function () {
testWallet.delete({}, 'invalid');
});
done();
});
it('delete', function (done) {
testWallet.delete({}, function (err, status) {
assert.equal(err, null);
done();
});
});
});
});
Выполнить команду
Для локальной разработки. Не используйте в интернете!