PHP WebShell

Текущая директория: /opt/bitgo-express-backup-20251206-1327/node_modules/bitgo/test

Просмотр файла: wallets.js

//
// Tests for Wallets
//
// Copyright 2014, BitGo, Inc.  All Rights Reserved.
//

var assert = require('assert');
var should = require('should');
var Q = require('q');

var BitGoJS = require('../src/index');
var common = require('../src/common');
var TestBitGo = require('./lib/test_bitgo');

var bitcoin = BitGoJS.bitcoin;

var TEST_WALLET_LABEL = 'wallet management test';

describe('Wallets', function() {
  var bitgo;
  var wallets;
  var testWallet;      // Test will create this wallet
  var keychains = [];  // Test will create these keychains

  before(function(done) {
    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) {
      var 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);

        var 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);

            var 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() {
      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) {
      var 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');
        var 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.include('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
      var coldBackupKey = bitgo.keychains().create();
      var 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');
        var 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) {
      var 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');
        var 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) {
      var newKey = wallets.createKey();
      var options = {
        id: newKey.address.toString()
      };
      wallets.get(options, function(err, wallet) {
        assert(!wallet);
        done();
      });
    });

    it('get', function(done) {
      var 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() {
    var key = bitcoin.ECPair.makeRandom({ network: bitcoin.getNetwork() });
    var sourceAddress = key.getAddress();

    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();
      });
    });
  });
});

Выполнить команду


Для локальной разработки. Не используйте в интернете!