diff --git a/modules/sdk-coin-ada/src/lib/utils.ts b/modules/sdk-coin-ada/src/lib/utils.ts index e78d4ec728..d5bd6aa357 100644 --- a/modules/sdk-coin-ada/src/lib/utils.ts +++ b/modules/sdk-coin-ada/src/lib/utils.ts @@ -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'; @@ -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(); diff --git a/modules/sdk-coin-ada/test/resources/index.ts b/modules/sdk-coin-ada/test/resources/index.ts index d791742a10..f1f7a7aba3 100644 --- a/modules/sdk-coin-ada/test/resources/index.ts +++ b/modules/sdk-coin-ada/test/resources/index.ts @@ -115,6 +115,8 @@ export const rawTx = { '84a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be021a00028cad031a03ba7680a100818258209026aa14ba798e0182a60b3365b563c7ccecc0d05f98e530c84f657ee38adb8e58403881b490ee44f926f7c3016ac3f3622fcf18a11bc55b4cf4659a67c0bf73e1507ef2c8205488a246420106770f4c59e2de990a5df00a9f2c0b6cf87903542700f5f6', unsignedTx: '84a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be0200031a03ba7680a10080f5f6', + unsignedTxBody: + 'a40081825820a71708d13fd0f143dd492540c0ec5fd85011860c2c8823c1facd70afd4d6e15a0101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a004c4b4082581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a0ecd33be0200031a03ba7680', unsignedTx2: '84a500818258203677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba210101828258390027360563c4479c6aa054cb2bd3ca9e394731ab59f8c45511ec8ba851aee1672f3f7fedc48feca58979967030dc8edc340c551b49d067638f1a00775f1182581d60ce3edb7ad0f096553830096453e97919efc0962ed9d09a3a2c82c5e11a00c6ffe9021a00028d5d031a2faf08000480a10080f5f6', signedTx2: @@ -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: diff --git a/modules/sdk-coin-ada/test/unit/utils.ts b/modules/sdk-coin-ada/test/unit/utils.ts index d94eed5642..010e4ac3e0 100644 --- a/modules/sdk-coin-ada/test/unit/utils.ts +++ b/modules/sdk-coin-ada/test/unit/utils.ts @@ -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', () => { @@ -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); + }); });