PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-mantra/test/unit
Просмотр файла: mantra.ts
import { BitGoAPI } from '@bitgo/sdk-api';
import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test';
import BigNumber from 'bignumber.js';
import sinon from 'sinon';
import { Mantra, Tmantra } from '../../src';
import utils from '../../src/lib/utils';
import { TEST_SEND_MANY_TX, TEST_SEND_TX, TEST_TX_WITH_MEMO, address } from '../resources/mantra';
import should = require('should');
describe('Mantra', function () {
let bitgo: TestBitGoAPI;
let basecoin;
before(function () {
bitgo = TestBitGo.decorate(BitGoAPI, { env: 'mock' });
bitgo.safeRegister('mantra', Mantra.createInstance);
bitgo.safeRegister('tmantra', Tmantra.createInstance);
bitgo.initializeTestVars();
basecoin = bitgo.coin('tmantra');
});
it('should return the right info', function () {
const mantra = bitgo.coin('mantra');
const tmantra = bitgo.coin('tmantra');
mantra.getChain().should.equal('mantra');
mantra.getFamily().should.equal('mantra');
mantra.getFullName().should.equal('Mantra');
mantra.getBaseFactor().should.equal(1e6);
tmantra.getChain().should.equal('tmantra');
tmantra.getFamily().should.equal('mantra');
tmantra.getFullName().should.equal('Testnet Mantra');
tmantra.getBaseFactor().should.equal(1e6);
});
describe('Address Validation', () => {
it('should get address details without memoId', function () {
const addressDetails = basecoin.getAddressDetails(address.noMemoIdAddress);
addressDetails.address.should.equal(address.noMemoIdAddress);
should.not.exist(addressDetails.memoId);
});
it('should get address details with memoId', function () {
const addressDetails = basecoin.getAddressDetails(address.validMemoIdAddress);
addressDetails.address.should.equal(address.validMemoIdAddress.split('?')[0]);
addressDetails.memoId.should.equal('2');
const addressDetails2 = basecoin.getAddressDetails(address.validMemoIdAddress2);
addressDetails2.address.should.equal(address.validMemoIdAddress2.split('?')[0]);
addressDetails2.memoId.should.equal('xyz123');
});
it('should throw on invalid memo id address', () => {
(() => {
basecoin.getAddressDetails(address.invalidMemoIdAddress);
}).should.throw();
(() => {
basecoin.getAddressDetails(address.invalidMemoIdAddress2);
}).should.throw();
});
it('should throw on multiple memo id address', () => {
(() => {
basecoin.getAddressDetails(address.multipleMemoIdAddress);
}).should.throw();
});
it('should validate wallet receive address', async function () {
const receiveAddress = {
address: 'mantra178596utuac8l9tkj25afvwz8l7d7684kkswjlj?memoId=7',
coinSpecific: {
rootAddress: 'mantra178596utuac8l9tkj25afvwz8l7d7684kkswjlj',
memoID: '7',
},
};
const isValid = await basecoin.isWalletAddress(receiveAddress);
isValid.should.equal(true);
});
it('should validate account addresses correctly', () => {
should.equal(utils.isValidAddress(address.address1), true);
should.equal(utils.isValidAddress(address.address2), true);
should.equal(utils.isValidAddress(address.address3), false);
should.equal(utils.isValidAddress(address.address4), false);
should.equal(utils.isValidAddress('dfjk35y'), false);
should.equal(utils.isValidAddress(undefined as unknown as string), false);
should.equal(utils.isValidAddress(''), false);
should.equal(utils.isValidAddress(address.validMemoIdAddress), true);
should.equal(utils.isValidAddress(address.validMemoIdAddress2), true);
should.equal(utils.isValidAddress(address.multipleMemoIdAddress), false);
});
it('should validate validator addresses correctly', () => {
should.equal(utils.isValidValidatorAddress(address.validatorAddress1), true);
should.equal(utils.isValidValidatorAddress(address.validatorAddress2), true);
should.equal(utils.isValidValidatorAddress(address.validatorAddress3), false);
should.equal(utils.isValidValidatorAddress(address.validatorAddress4), false);
should.equal(utils.isValidValidatorAddress('dfjk35y'), false);
should.equal(utils.isValidValidatorAddress(undefined as unknown as string), false);
should.equal(utils.isValidValidatorAddress(''), false);
});
});
describe('Verify transaction: ', () => {
it('should succeed to verify transaction', async function () {
const txPrebuild = {
txHex: TEST_SEND_TX.signedTxBase64,
txInfo: {},
};
const txParams = {
recipients: [
{
address: TEST_SEND_TX.recipient,
amount: TEST_SEND_TX.sendAmount,
},
],
};
const verification = {};
const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
isTransactionVerified.should.equal(true);
});
it('should succeed to verify sendMany transaction', async function () {
const txPrebuild = {
txHex: TEST_SEND_MANY_TX.signedTxBase64,
txInfo: {},
};
const txParams = {
recipients: [
{
address: 'mantra18favpsj0s8hfy2j00e89pqmpp9ndfl03a6a7vj',
amount: '10000',
},
{
address: 'mantra1m493txuc2jh0zz842wjsamht6hsy7t506t40rq',
amount: '10000',
},
],
};
const verification = {};
const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
isTransactionVerified.should.equal(true);
});
it('should fail to verify transaction with invalid param', async function () {
const txPrebuild = {};
const txParams = { recipients: undefined };
await basecoin
.verifyTransaction({
txParams,
txPrebuild,
})
.should.rejectedWith('missing required tx prebuild property txHex');
});
});
describe('Explain Transaction: ', () => {
it('should explain a transfer transaction', async function () {
const explainedTransaction = await basecoin.explainTransaction({
txHex: TEST_SEND_TX.signedTxBase64,
});
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: TEST_SEND_TX.hash,
outputs: [
{
address: TEST_SEND_TX.recipient,
amount: TEST_SEND_TX.sendAmount,
},
],
outputAmount: TEST_SEND_TX.sendAmount,
changeOutputs: [],
changeAmount: '0',
fee: { fee: TEST_SEND_TX.gasBudget.amount[0].amount },
type: 0,
});
});
it('should explain sendMany transfer transaction', async function () {
const explainedTransaction = await basecoin.explainTransaction({
txHex: TEST_SEND_MANY_TX.signedTxBase64,
});
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: TEST_SEND_MANY_TX.hash,
outputs: [
{
address: 'mantra18favpsj0s8hfy2j00e89pqmpp9ndfl03a6a7vj',
amount: '10000',
},
{
address: 'mantra1m493txuc2jh0zz842wjsamht6hsy7t506t40rq',
amount: '10000',
},
],
outputAmount: '20000',
changeOutputs: [],
changeAmount: '0',
fee: { fee: TEST_SEND_MANY_TX.gasBudget.amount[0].amount },
type: 0,
});
});
it('should explain a transfer transaction with memo', async function () {
const explainedTransaction = await basecoin.explainTransaction({
txHex: TEST_TX_WITH_MEMO.signedTxBase64,
});
explainedTransaction.should.deepEqual({
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
id: TEST_TX_WITH_MEMO.hash,
outputs: [
{
address: TEST_TX_WITH_MEMO.to,
amount: TEST_TX_WITH_MEMO.sendAmount,
memo: TEST_TX_WITH_MEMO.memo,
},
],
outputAmount: TEST_TX_WITH_MEMO.sendAmount,
changeOutputs: [],
changeAmount: '0',
fee: { fee: TEST_TX_WITH_MEMO.gasBudget.amount[0].amount },
type: 0,
});
});
it('should fail to explain transaction with missing params', async function () {
try {
await basecoin.explainTransaction({});
} catch (error) {
should.equal(error.message, 'missing required txHex parameter');
}
});
it('should fail to explain transaction with invalid params', async function () {
try {
await basecoin.explainTransaction({ txHex: 'randomString' });
} catch (error) {
should.equal(error.message.startsWith('Invalid transaction:'), true);
}
});
});
describe('Parse Transactions: ', () => {
const transferInputsResponse = {
address: TEST_SEND_TX.recipient,
amount: new BigNumber(TEST_SEND_TX.sendAmount).plus(TEST_SEND_TX.gasBudget.amount[0].amount).toFixed(),
};
const transferOutputsResponse = {
address: TEST_SEND_TX.recipient,
amount: TEST_SEND_TX.sendAmount,
};
it('should parse a transfer transaction', async function () {
const parsedTransaction = await basecoin.parseTransaction({ txHex: TEST_SEND_TX.signedTxBase64 });
parsedTransaction.should.deepEqual({
inputs: [transferInputsResponse],
outputs: [transferOutputsResponse],
});
});
it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
const stub = sinon.stub(Mantra.prototype, 'explainTransaction');
stub.resolves(undefined);
await basecoin
.parseTransaction({ txHex: TEST_SEND_TX.signedTxBase64 })
.should.be.rejectedWith('Invalid transaction');
stub.restore();
});
});
});
Выполнить команду
Для локальной разработки. Не используйте в интернете!