Skip to content

Commit e51b1cd

Browse files
authored
Merge pull request #5872 from BitGo/COIN-3609
fix(sdk-coin-stx): handling noneCV for sip10
2 parents 6b97016 + f0cbac5 commit e51b1cd

File tree

5 files changed

+48
-7
lines changed

5 files changed

+48
-7
lines changed

modules/sdk-coin-stx/src/stx.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
VerifyTransactionOptions,
1212
} from '@bitgo/sdk-core';
1313
import { BaseCoin as StaticsBaseCoin, CoinFamily, coins } from '@bitgo/statics';
14-
import { cvToString, cvToValue } from '@stacks/transactions';
14+
import { ClarityType, cvToString, cvToValue } from '@stacks/transactions';
1515

1616
import { ExplainTransactionOptions, StxSignTransactionOptions, StxTransactionExplanation } from './types';
1717
import { StxLib } from '.';
@@ -214,7 +214,10 @@ export class Stx extends BaseCoin {
214214
amount: outputAmount,
215215
tokenName: findTokenNameByContract(txJson.payload.contractAddress, txJson.payload.contractName),
216216
};
217-
if (txJson.payload.functionArgs.length === 4) {
217+
if (
218+
txJson.payload.functionArgs.length === 4 &&
219+
txJson.payload.functionArgs[3].type === ClarityType.OptionalSome
220+
) {
218221
memo = Buffer.from(txJson.payload.functionArgs[3].value.buffer).toString();
219222
transactionRecipient['memo'] = memo;
220223
}

modules/sdk-coin-stx/test/fixtures.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ export const txForExplainFungibleTokenTransfer =
3838
export const txForExplainFungibleTokenTransferWithMemoId10 =
3939
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b400000003020130831ab5d8fc925e088931b2eb86efcd054612293aa8a0156dfa50f44b54b6776683d2463783a10ee358d565ac74e4004c9cd0a96674cb5726ac1fc848e6f00c0201a76e30fa14ca3528ebb3a3aa92cc2e202592747c2b7028d4a3791663c3361f6d2d6fd44617a0775f58076ad119f923b27d1ca3ef63273910e7a8f91d59b5ee0900038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000040100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece0a02000000023130';
4040
export const txForExplainFungibleTokenTransferWithoutMemo =
41-
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b4000000030200125aadf265dc67bae4e08cffd42795a05745d9ad345ab582a0ad4ceedec79e1c26111d6a5058bb9aac355a007bad9b81c2f90026864fa1f2dbe13a29fbcea60f02013d603fedc49e7040607c6e091e81557a31b1832eef3ca7a6ab10105e95e226fd5fe2c7c97b7ca0dabc17af6ca0dcb7133dac7d24951b4b410ff9092f566a5ca000038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000030100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece';
41+
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b4000000030200d12a80f67cdac72ad116075e86846986a015a60bf541855ea17ddc79620b679b0d75e523cbc7638969addeb047e73ed11b398a894b2fd4459623afb2fc10461b02007e01f28f9ac5b9bc32f3de826f69aabcc6b357faa50d98087ff12714eb3d351e515482aff784b54ab572ce6f86c1f40c71b21fd197e846fb388718f55f17d4d300038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000040100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece09';
4242
export const txForExplainFungibleTokenTransferWithMemoZero =
4343
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b4000000030200ce306873b8a41b66676f0dcf8cc933eedc15b52fb24e41495d43edecfa2e9e3e291a898724a997c223178910405939ffcd57264bdc0d08de6bfc402385a57edc02010e0fd2bae5af96bbbb49de41bf965cd47e2f9d93018189cc7e5642536c309a527c701d0e5f5ae44cd30c411323b09112f6f23f372a0c5d1d7713922c2a275a7500038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000040100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece0a020000000130';
44-
44+
export const hexWithoutMemoTransferId = '463377e1bff7fb4124108d160a4e42fe0ed57e69842b1c02fa6181ba345c49c6';
4545
export const fungibleTokenTransferTx = {
4646
id: '2bf5277ac7cd57741163d85b78905c97e55f05887369e3908450e4050aa4cf01',
4747
fee: '180',

modules/sdk-coin-stx/test/unit/resources.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,6 @@ export const FUNGIBLE_TOKEN_TRANSFER_CONSTANTS = {
189189
'80800000000400164247d6f2b425ac5771423ae6c80c754f7172b0000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030200000001010215164247d6f2b425ac5771423ae6c80c754f7172b01a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000030100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece',
190190
SIGNED_MULTI_SIG_TX:
191191
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b4000000030201e4c98d7687eab5f11d03febc96951301eede336088b06c5a676cc6093f70e16b3f3533ccd8e6f92390a17dcc917f4e828657f17605574a5fcbb3da59f25483dc02019095c2f5217e0f168f27b605b47e9eac2da3c5ea309c42a2677addfb67c1fd471ef20187ce6b85b5b541d4b4f00d2f8ea8f7d42be84327968cb9411730b5217a00038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000040100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece0a020000000131',
192+
SIGNED_MULTI_SIG_TX_WITHOUT_MEMO:
193+
'808000000004012fe507c09dbb23c3b7e5d166c81fc4b87692510b000000000000000000000000000000b4000000030200d12a80f67cdac72ad116075e86846986a015a60bf541855ea17ddc79620b679b0d75e523cbc7638969addeb047e73ed11b398a894b2fd4459623afb2fc10461b02007e01f28f9ac5b9bc32f3de826f69aabcc6b357faa50d98087ff12714eb3d351e515482aff784b54ab572ce6f86c1f40c71b21fd197e846fb388718f55f17d4d300038e3c4529395611be9abf6fa3b6987e81d402385e3d605a073f42f407565a4a3d00020302000000010102152fe507c09dbb23c3b7e5d166c81fc4b87692510b1a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e0d747369703664702d746f6b656e010000000000002710021a1500a1c42f0c11bfe3893f479af18904677685be0d747369703664702d746f6b656e087472616e73666572000000040100000000000000000000000000002710051a1500a1c42f0c11bfe3893f479af18904677685be0515ab50cac953ac55edc14e2b236854b1ead863fece09',
192194
};

modules/sdk-coin-stx/test/unit/stx.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ describe('STX:', function () {
193193
explain.contractFunctionArgs[0].value.toString().should.equal(testData.txExplainedContract.functionArgs[0].value);
194194
});
195195

196-
it('should explain a fungible token transfer transaction', async function () {
196+
it('should explain a fungible token transfer transaction with memo', async function () {
197197
const explain = await basecoin.explainTransaction({
198198
txHex: testData.txForExplainFungibleTokenTransfer,
199199
feeInfo: { fee: '' },
@@ -208,6 +208,21 @@ describe('STX:', function () {
208208
explain.outputs[0].tokenName.should.equal(testData.fungibleTokenTransferTx.tokenName);
209209
});
210210

211+
it('should explain a fungible token transfer transaction without memo', async function () {
212+
const explain = await basecoin.explainTransaction({
213+
txHex: testData.txForExplainFungibleTokenTransferWithoutMemo,
214+
feeInfo: { fee: '' },
215+
});
216+
explain.id.should.equal(testData.hexWithoutMemoTransferId);
217+
explain.fee.should.equal(testData.fungibleTokenTransferTx.fee);
218+
assert.deepEqual(explain.memo, undefined, 'memo should be undefined');
219+
explain.outputAmount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
220+
explain.outputs[0].amount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
221+
explain.outputs[0].address.should.equal(cvToString(testData.fungibleTokenTransferTx.functionArgs[1]));
222+
assert.deepEqual(explain.outputs[0].memo, undefined, 'memo should be undefined');
223+
explain.outputs[0].tokenName.should.equal(testData.fungibleTokenTransferTx.tokenName);
224+
});
225+
211226
describe('Keypairs:', () => {
212227
it('should generate a keypair from random seed', function () {
213228
const keyPair = basecoin.generateKeyPair();

modules/sdk-coin-stx/test/unit/transactionBuilder/fungibleTokenTransferBuilder.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { TestBitGo, TestBitGoAPI } from '@bitgo/sdk-test';
22
import { BitGoAPI } from '@bitgo/sdk-api';
33
import { coins } from '@bitgo/statics';
4-
import { bufferCVFromString, someCV, standardPrincipalCV, uintCV } from '@stacks/transactions';
4+
import { bufferCVFromString, noneCV, someCV, standardPrincipalCV, uintCV } from '@stacks/transactions';
55
import should from 'should';
66
import { StacksMainnet, StacksTestnet } from '@stacks/network';
77
import { TransactionType } from '@bitgo/sdk-core';
@@ -115,7 +115,7 @@ describe('Stacks: Fungible Token Transfer Builder', () => {
115115
tx.inputs[0].value.should.equal('10000');
116116
});
117117

118-
it('a multisig fungible token transfer transaction', async () => {
118+
it('a multisig fungible token transfer transaction with memo', async () => {
119119
const builder = initTxBuilder();
120120
builder.functionArgs([
121121
uintCV('10000'),
@@ -132,6 +132,27 @@ describe('Stacks: Fungible Token Transfer Builder', () => {
132132
JSON.stringify(tx.toJson());
133133
should.deepEqual(tx.toBroadcastFormat(), testData.FUNGIBLE_TOKEN_TRANSFER_CONSTANTS.SIGNED_MULTI_SIG_TX);
134134
});
135+
136+
it('a multisig fungible token transfer transaction without memo', async () => {
137+
const builder = initTxBuilder();
138+
builder.functionArgs([
139+
uintCV('10000'),
140+
standardPrincipalCV(testData.FUNGIBLE_TOKEN_TRANSFER_CONSTANTS.SENDER_ADDRESS),
141+
standardPrincipalCV(testData.FUNGIBLE_TOKEN_TRANSFER_CONSTANTS.RECEIVER_ADDRESS),
142+
noneCV(),
143+
]);
144+
145+
builder.sign({ key: testData.prv1 });
146+
builder.sign({ key: testData.prv2 });
147+
builder.fromPubKey([testData.pub1, testData.pub2, testData.pub3]);
148+
builder.numberSignatures(2);
149+
const tx = await builder.build();
150+
JSON.stringify(tx.toJson());
151+
should.deepEqual(
152+
tx.toBroadcastFormat(),
153+
testData.FUNGIBLE_TOKEN_TRANSFER_CONSTANTS.SIGNED_MULTI_SIG_TX_WITHOUT_MEMO
154+
);
155+
});
135156
});
136157

137158
describe('should fail', () => {

0 commit comments

Comments
 (0)