PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-dot/test/unit/transactionBuilder
Просмотр файла: transferBuilder.ts
import assert from 'assert';
import should from 'should';
import sinon from 'sinon';
import { TransferBuilder } from '../../../src/lib';
import { ProxyType } from '../../../src/lib/iface';
import utils from '../../../src/lib/utils';
import { accounts, rawTx, chainName, txVersion, genesisHash, specVersion, mockTssSignature } from '../../resources';
import { buildTestConfig } from './base';
describe('Dot Transfer Builder', () => {
let builder: TransferBuilder;
const proxySender = accounts.account3;
const sender = accounts.account1;
const receiver = accounts.account2;
// Consolidation/sweep tx's do not deseialize amounts.
const consolidationValue = '0';
beforeEach(() => {
const config = buildTestConfig();
builder = new TransferBuilder(config).material(utils.getMaterial(config));
});
describe('setter validation', () => {
it('should validate real address', () => {
const spy = sinon.spy(builder, 'validateAddress');
assert.throws(
() => builder.owner({ address: 'asd' }),
(e: Error) => e.message === `The address 'asd' is not a well-formed dot address`
);
should.doesNotThrow(() => builder.owner({ address: sender.address }));
sinon.assert.calledTwice(spy);
});
it('should validate to address', () => {
const spy = sinon.spy(builder, 'validateAddress');
assert.throws(
() => builder.to({ address: 'asd' }),
(e: Error) => e.message === `The address 'asd' is not a well-formed dot address`
);
should.doesNotThrow(() => builder.to({ address: sender.address }));
sinon.assert.calledTwice(spy);
});
it('should validate transfer amount', () => {
const spy = sinon.spy(builder, 'validateValue');
assert.throws(
() => builder.amount('-1'),
(e: Error) => e.message === 'Value cannot be less than zero'
);
should.doesNotThrow(() => builder.amount('1000'));
sinon.assert.calledTwice(spy);
});
});
describe('build transfer transaction', () => {
it('should build a transfer transaction', async () => {
builder
.amount('90034235235322')
.to({ address: receiver.address })
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
builder.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '90034235235322');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, '90034235235322');
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, '90034235235322');
});
it('should build a transaction with zero maxDuration (immortal)', async () => {
builder
.amount('90034235235322')
.to({ address: receiver.address })
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 0 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
builder.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '90034235235322');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 0);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, '90034235235322');
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, '90034235235322');
});
it('should build an unsigned transfer transaction', async () => {
builder
.amount('90034235235322')
.to({ address: receiver.address })
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '90034235235322');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
});
it('should build from raw signed tx', async () => {
builder.from(rawTx.transfer.signed);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '90034235235322');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
});
it('should build from raw unsigned tx', async () => {
builder.from(rawTx.transfer.unsigned);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sender({ address: sender.address })
.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '90034235235322');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.eraPeriod, 64);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
});
it('should build from raw signed westend tx', async () => {
builder.from(rawTx.transfer.westendSigned);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.amount, '10000000000');
should.deepEqual(txJson.to, receiver.address);
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.eraPeriod, 64);
});
});
describe('build proxy transfer transaction', () => {
it('should build a proxy transaction', async () => {
builder
.owner({ address: sender.address })
.forceProxyType(ProxyType.ANY)
.to({ address: receiver.address })
.amount('90034235235322')
.sender({ address: proxySender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' })
.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.owner, sender.address);
should.deepEqual(txJson.forceProxyType, ProxyType.ANY);
should.deepEqual(txJson.sender, proxySender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, '90034235235322');
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, '90034235235322');
});
it('should build an unsigned proxy transaction', async () => {
builder
.owner({ address: sender.address })
.forceProxyType(ProxyType.ANY)
.to({ address: receiver.address })
.amount('90034235235322')
.sender({ address: proxySender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.owner, sender.address);
should.deepEqual(txJson.forceProxyType, ProxyType.ANY);
should.deepEqual(txJson.sender, proxySender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
});
it('should build from raw signed tx', async () => {
builder.from(rawTx.proxy.signed);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.owner, sender.address);
should.deepEqual(txJson.forceProxyType, ProxyType.ANY);
should.deepEqual(txJson.sender, proxySender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
});
it('should build from raw unsigned tx', async () => {
builder.from(rawTx.proxy.unsigned);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sender({ address: proxySender.address })
.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.owner, sender.address);
should.deepEqual(txJson.forceProxyType, ProxyType.ANY);
should.deepEqual(txJson.sender, proxySender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.eraPeriod, 64);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
});
});
describe('build sweep transfer transaction', () => {
it('should build a signed sweep transaction', async () => {
builder
.sweep()
.to({ address: receiver.address })
.amount('90034235235322')
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' })
.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, consolidationValue);
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, consolidationValue);
});
it('should build an unsigned sweep transaction', async () => {
builder
.sweep()
.to({ address: receiver.address })
.amount('90034235235322')
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, consolidationValue);
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, consolidationValue);
});
it('should build an unsigned sweep transaction with keepAlive as false', async () => {
builder
.sweep(false)
.to({ address: receiver.address })
.amount('90034235235322')
.sender({ address: sender.address })
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 200 })
.fee({ amount: 0, type: 'tip' });
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, consolidationValue);
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, consolidationValue);
});
it('should build from raw signed sweep transaction', async () => {
builder.from(rawTx.transferAll.signed);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, consolidationValue);
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, consolidationValue);
});
it('should build from an unsigned sweep transaction', async () => {
builder.from(rawTx.transferAll.unsigned);
builder
.validity({ firstValid: 3933, maxDuration: 64 })
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
.sender({ address: sender.address })
.addSignature({ pub: sender.publicKey }, Buffer.from(mockTssSignature, 'hex'));
const tx = await builder.build();
const txJson = tx.toJson();
should.deepEqual(txJson.sender, sender.address);
should.deepEqual(txJson.blockNumber, 3933);
should.deepEqual(txJson.referenceBlock, '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d');
should.deepEqual(txJson.genesisHash, genesisHash);
should.deepEqual(txJson.specVersion, specVersion);
should.deepEqual(txJson.nonce, 200);
should.deepEqual(txJson.tip, 0);
should.deepEqual(txJson.transactionVersion, txVersion);
should.deepEqual(txJson.chainName, chainName);
should.deepEqual(txJson.eraPeriod, 64);
const inputs = tx.inputs[0];
should.deepEqual(inputs.address, sender.address);
should.deepEqual(inputs.value, consolidationValue);
const outputs = tx.outputs[0];
should.deepEqual(outputs.address, receiver.address);
should.deepEqual(outputs.value, consolidationValue);
});
});
});
Выполнить команду
Для локальной разработки. Не используйте в интернете!