Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions modules/sdk-coin-ada/src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
NetworkInfo,
StakeCredential,
RewardAddress,
Transaction as CardanoTransaction,
} from '@emurgo/cardano-serialization-lib-nodejs';
import { KeyPair } from './keyPair';
import { bech32 } from 'bech32';
Expand Down Expand Up @@ -150,6 +151,19 @@ export class Utils implements BaseUtils {
isValidTransactionId(txId: string): boolean {
return this.validateBlake2b(txId);
}

/**
* Get the transaction body from a serialized transaction
* @param {string} serializedTx - serialized transaction in hex or base64 format
* @returns {string} transaction body in hex format
*/
getTransactionBody(serializedTx: string): string {
const HEX_REGEX = /^[0-9a-fA-F]+$/;
const bufferRawTransaction = HEX_REGEX.test(serializedTx)
? Buffer.from(serializedTx, 'hex')
: Buffer.from(serializedTx, 'base64');
return Buffer.from(CardanoTransaction.from_bytes(bufferRawTransaction).body().to_bytes()).toString('hex');
}
}

const utils = new Utils();
Expand Down
12 changes: 12 additions & 0 deletions modules/sdk-coin-ada/test/resources/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ export const rawTx = {
'84a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be021a00028cad031a03ba7680a100818258209026aa14ba798e0182a60b3365b563c7ccecc0d05f98e530c84f657ee38adb8e58403881b490ee44f926f7c3016ac3f3622fcf18a11bc55b4cf4659a67c0bf73e1507ef2c8205488a246420106770f4c59e2de990a5df00a9f2c0b6cf87903542700f5f6',
unsignedTx:
'84a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be0200031a03ba7680a10080f5f6',
unsignedTxBody:
'a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be0200031a03ba7680',
unsignedTx2:
'84a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba210101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a00775f1182581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a00c6ffe9021a00028d5d031a2faf08000480a10080f5f6',
signedTx2:
Expand All @@ -132,18 +134,28 @@ export const rawTx = {
},
unsignedStakingActiveTx:
'84a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a001bdb4b021a0002a935031a2faf0800048282008200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb83028200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb581c7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3a10080f5f6',
unsignedStakingActiveTxBody:
'a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a001bdb4b021a0002a935031a2faf0800048282008200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb83028200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb581c7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3',
unsignedStakingActiveTxHash: 'fdcf2d64cbe3e60bc98de5d99d36b1c643dc3fa705ebfbf752bcb47f486d539a',
unsignedStakingDeactiveTx:
'84a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a0058ef4b021a00029e35031a2faf0800048182018200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdba10080f5f6',
unsignedStakingDeactiveTxBody:
'a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a0058ef4b021a00029e35031a2faf0800048182018200581c188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb',
unsignedStakingDeactiveTxHash: 'd113e9d1fbf3ddda4157d74abc753ff232e684f7a5f9de810235596dd7372679',
unsignedStakingWithdrawTx:
'84a600818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a004d52e2021a00029ee5031a2faf0800048005a1581de0188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb1a0012e8c7a10080f5f6',
unsignedStakingWithdrawTxBody:
'a600818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba2101018182583901c7b28bcea90d440b5455a6a02a27ca59b8696f067fc1967f47f933e79558e969caa9e57adcfc40b9907eb794363b590faf42fff48c38eb881a004d52e2021a00029ee5031a2faf0800048005a1581de0188fde65b1f9bd69b0edcc4e5a65fa93a13773090e1e2eef7a25cfdb1a0012e8c7',
unsignedStakingWithdrawTxHash: 'd4aa6878f9b810bd566aba4447eaf079ca86478175ef6d92f8d0e0fa5701d50e',
unsignedNewPledgeTx:
'84a50081825820985b52472d4dbc184a402df5b3cd0b67bb7e9b86ec27c20a0dc917898f64410c0001818258390085e399d9be12e5d7cef3bd44119d55432ae10ba8cfa07cede12370681fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba11b000000023633be28021a0002d509031a01d8063b04828a03581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681582034646b66ff5bac4a40c1b8558ee8a160524151f18f1f4b06450e8414bf562e311a05f5e1001a14904840d81e820f1864581de11fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba181581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681818301191770782172656c61796e6f6465312e6d79616461706f6f6c6e616d65726f636b732e636f6df683028200581c1fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba1581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681a10080f5f6',
unsignedNewPledgeTxBody:
'a50081825820985b52472d4dbc184a402df5b3cd0b67bb7e9b86ec27c20a0dc917898f64410c0001818258390085e399d9be12e5d7cef3bd44119d55432ae10ba8cfa07cede12370681fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba11b000000023633be28021a0002d509031a01d8063b04828a03581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681582034646b66ff5bac4a40c1b8558ee8a160524151f18f1f4b06450e8414bf562e311a05f5e1001a14904840d81e820f1864581de11fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba181581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681818301191770782172656c61796e6f6465312e6d79616461706f6f6c6e616d65726f636b732e636f6df683028200581c1fc30799b291432f1aade73a4e960e2d22511f1a797d7c47a569dba1581c76044d3aa9caafbb213ae45f9a3f5ad3cc6c836f375ebbcfa5c83681',
unsignedNewPledgeTxHash: 'dfa11367be1c45c0a2b98c350f7d6f04af08d123ec4d8ac9030676b75491f210',
unsignedUpdatePledgeTx:
'84a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182583901eb0baa5e570cffbe2934db29df0b6a3d7c0430ee65d4c3a7ab2fefb91bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff0102182a030a04818a03581cf61c42cbf7c8c53af3f520508212ad3e72f674f957fe23ff0acb49735820198890ad6c92e80fbdab554dda02da9fb49d001bbd96181f3e07f7a6ab0d06401a1dcd65001a1443fd00d81e820102581de13a7f09d3df4cf66a7399c2b05bfa234d5a29560c311fc5db4c49071182581c122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277581c3a7f09d3df4cf66a7399c2b05bfa234d5a29560c311fc5db4c4907118584001904d244c0a8000150b80d01200000a3852e8a00003473700384001904d2f650b80d01200000a3852e8a00003473700384001904d244c0a80001f683011904d26d7777772e746573742e7465737482026e7777772e74657374322e74657374827568747470733a2f2f7777772e746573742e746573745820914c57c1f12bbf4a82b12d977d4f274674856a11ed4b9b95bd70f5d41c5064a6a10080f5f6',
unsignedUpdatePledgeTxBody:
'a500818258203b40265111d8bb3c3c608d95b3a0bf83461ace32d79336579a1939b3aad1c0b700018182583901eb0baa5e570cffbe2934db29df0b6a3d7c0430ee65d4c3a7ab2fefb91bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff0102182a030a04818a03581cf61c42cbf7c8c53af3f520508212ad3e72f674f957fe23ff0acb49735820198890ad6c92e80fbdab554dda02da9fb49d001bbd96181f3e07f7a6ab0d06401a1dcd65001a1443fd00d81e820102581de13a7f09d3df4cf66a7399c2b05bfa234d5a29560c311fc5db4c49071182581c122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277581c3a7f09d3df4cf66a7399c2b05bfa234d5a29560c311fc5db4c4907118584001904d244c0a8000150b80d01200000a3852e8a00003473700384001904d2f650b80d01200000a3852e8a00003473700384001904d244c0a80001f683011904d26d7777772e746573742e7465737482026e7777772e74657374322e74657374827568747470733a2f2f7777772e746573742e746573745820914c57c1f12bbf4a82b12d977d4f274674856a11ed4b9b95bd70f5d41c5064a6',
unsignedUpdatePledgeTxHash: 'e3b9a5657bf62609465a930c8359d774c73944973cfc5a104a0f0ed1e1e8db21',
pledgeNodeKeyPubkey: '1b400d60aaf34eaf6dcbab9bba46001a23497886cf11066f7846933d30e5ad3f',
pledgeNodeWitnessSignature:
Expand Down
34 changes: 33 additions & 1 deletion modules/sdk-coin-ada/test/unit/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@ import should from 'should';
import { KeyPair, Utils } from '../../src';
import { AddressFormat, toHex } from '@bitgo/sdk-core';
import { Ed25519Signature } from '@emurgo/cardano-serialization-lib-nodejs';
import { address, blockHash, enterpriseAccounts, privateKeys, publicKeys, signatures, txIds } from '../resources';
import {
address,
blockHash,
enterpriseAccounts,
privateKeys,
publicKeys,
signatures,
txIds,
rawTx,
} from '../resources';

describe('utils', () => {
it('should validate addresses correctly', () => {
Expand Down Expand Up @@ -118,4 +127,27 @@ describe('utils', () => {
should.equal(Utils.default.isValidTransactionId(txIds.hash3 + '00'), false);
should.equal(Utils.default.isValidTransactionId('dalij43ta0ga2dadda02'), false);
});

it('should get transaction body correctly', () => {
const {
unsignedTx,
unsignedTxBody,
unsignedStakingActiveTx,
unsignedStakingActiveTxBody,
unsignedStakingDeactiveTx,
unsignedStakingDeactiveTxBody,
unsignedStakingWithdrawTx,
unsignedStakingWithdrawTxBody,
unsignedUpdatePledgeTx,
unsignedUpdatePledgeTxBody,
unsignedNewPledgeTx,
unsignedNewPledgeTxBody,
} = rawTx;
should.equal(Utils.default.getTransactionBody(unsignedTx), unsignedTxBody);
should.equal(Utils.default.getTransactionBody(unsignedStakingActiveTx), unsignedStakingActiveTxBody);
should.equal(Utils.default.getTransactionBody(unsignedStakingDeactiveTx), unsignedStakingDeactiveTxBody);
should.equal(Utils.default.getTransactionBody(unsignedStakingWithdrawTx), unsignedStakingWithdrawTxBody);
should.equal(Utils.default.getTransactionBody(unsignedUpdatePledgeTx), unsignedUpdatePledgeTxBody);
should.equal(Utils.default.getTransactionBody(unsignedNewPledgeTx), unsignedNewPledgeTxBody);
});
});