Skip to content

Commit 0970bcf

Browse files
feat(sdk-coin-icp): fix memo id validation
Ticket: WIN-5495
1 parent 2e661d1 commit 0970bcf

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

modules/sdk-coin-icp/src/lib/transactionBuilder.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
import { BaseAddress, BaseKey, BaseTransactionBuilder, BuildTransactionError, SigningError } from '@bitgo/sdk-core';
12
import { BaseCoin as CoinConfig } from '@bitgo/statics';
23
import BigNumber from 'bignumber.js';
3-
import { BaseTransactionBuilder, BuildTransactionError, BaseAddress, SigningError, BaseKey } from '@bitgo/sdk-core';
4-
import { Transaction } from './transaction';
5-
import utils from './utils';
64
import { DEFAULT_MEMO, IcpTransaction, IcpTransactionData, PayloadsData, Signatures } from './iface';
75
import { SignedTransactionBuilder } from './signedTransactionBuilder';
6+
import { Transaction } from './transaction';
7+
import utils from './utils';
88

99
export abstract class TransactionBuilder extends BaseTransactionBuilder {
1010
protected _transaction: Transaction;
@@ -58,7 +58,7 @@ export abstract class TransactionBuilder extends BaseTransactionBuilder {
5858
* @returns {TransactionBuilder} This transaction builder
5959
*/
6060
public memo(memo: number): this {
61-
if (memo < 0) {
61+
if (typeof memo !== 'number' || Number.isNaN(memo) || memo < 0) {
6262
throw new BuildTransactionError(`Invalid memo: ${memo}`);
6363
}
6464
this._memo = memo;

modules/sdk-coin-icp/test/unit/transactionBuilder/transactionBuilder.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import { BaseKey, BuildTransactionError } from '@bitgo/sdk-core';
2+
import assert from 'assert';
13
import should from 'should';
2-
import { getBuilderFactory } from '../getBuilderFactory';
3-
import { BaseKey } from '@bitgo/sdk-core';
4-
import * as testData from '../../resources/icp';
54
import sinon from 'sinon';
65
import { DEFAULT_MEMO, MAX_INGRESS_TTL } from '../../../src/lib/iface';
6+
import * as testData from '../../resources/icp';
7+
import { getBuilderFactory } from '../getBuilderFactory';
78

89
describe('ICP Transaction Builder', async () => {
910
const factory = getBuilderFactory('ticp');
@@ -66,6 +67,17 @@ describe('ICP Transaction Builder', async () => {
6667
await txBuilder.build().should.rejectedWith('sender is required before building');
6768
});
6869

70+
it('should fail to build a txn with incorrect memo', async () => {
71+
const txBuilder = factory.getTransferBuilder();
72+
txBuilder.sender(testData.Accounts.account1.address, testData.Accounts.account1.publicKey);
73+
txBuilder.receiverId(testData.Accounts.account2.address);
74+
txBuilder.amount('10');
75+
const incorrectMemos = ['abcd', undefined];
76+
for (const memo of incorrectMemos) {
77+
assert.throws(() => txBuilder.memo(Number(memo)), BuildTransactionError, `Invalid memo: ${Number(memo)}`);
78+
}
79+
});
80+
6981
it('should fail to build a txn without amount', async () => {
7082
const txBuilder = factory.getTransferBuilder();
7183
txBuilder.sender(testData.Accounts.account1.address, testData.Accounts.account1.publicKey);

0 commit comments

Comments
 (0)