From edd518538539cb5adcac87126913b61ab3ae1f50 Mon Sep 17 00:00:00 2001 From: Evan Gray Date: Thu, 19 May 2022 21:55:34 -0400 Subject: [PATCH] sdk/js: algorand attest fix --- bridge_ui/package-lock.json | 16 +- bridge_ui/package.json | 2 +- sdk/js/CHANGELOG.md | 6 + sdk/js/package.json | 2 +- sdk/js/src/algorand/Algorand.ts | 252 +++++++----- sdk/js/src/algorand/__tests__/testHelpers.ts | 10 +- sdk/js/src/algorand/__tests__/unit.ts | 12 +- .../src/token_bridge/__tests__/integration.ts | 368 ++---------------- .../token_bridge/getIsTransferCompleted.ts | 8 +- 9 files changed, 222 insertions(+), 454 deletions(-) diff --git a/bridge_ui/package-lock.json b/bridge_ui/package-lock.json index 487c8dd8e..ef9734055 100644 --- a/bridge_ui/package-lock.json +++ b/bridge_ui/package-lock.json @@ -8,7 +8,7 @@ "name": "test_ui", "version": "0.1.0", "dependencies": { - "@certusone/wormhole-sdk": "^0.3.1", + "@certusone/wormhole-sdk": "^0.3.4", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.11.2", "@material-ui/lab": "^4.0.0-alpha.60", @@ -86,7 +86,7 @@ }, "../sdk/js": { "name": "@certusone/wormhole-sdk", - "version": "0.2.6", + "version": "0.3.4", "extraneous": true, "license": "Apache-2.0", "dependencies": { @@ -2131,9 +2131,9 @@ } }, "node_modules/@certusone/wormhole-sdk": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.3.1.tgz", - "integrity": "sha512-uQPuGUrDC72vwtNMxdxd2iSiu3RRx36Pvbpz3NNvaBeLz+d08oOcmJZwEAq05doRrPWB5fIWxZVCdbCF0yGucA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.3.4.tgz", + "integrity": "sha512-zwBpAI2nOh3zZ7lIZeBiR/MnlJR9HNCpW1INfA82gHJy35EabGzjNzaxDAdGXWVuWYjvdodwbiy7czB8m9Zpxw==", "dependencies": { "@improbable-eng/grpc-web": "^0.14.0", "@solana/spl-token": "^0.1.8", @@ -46350,9 +46350,9 @@ } }, "@certusone/wormhole-sdk": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.3.1.tgz", - "integrity": "sha512-uQPuGUrDC72vwtNMxdxd2iSiu3RRx36Pvbpz3NNvaBeLz+d08oOcmJZwEAq05doRrPWB5fIWxZVCdbCF0yGucA==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.3.4.tgz", + "integrity": "sha512-zwBpAI2nOh3zZ7lIZeBiR/MnlJR9HNCpW1INfA82gHJy35EabGzjNzaxDAdGXWVuWYjvdodwbiy7czB8m9Zpxw==", "requires": { "@improbable-eng/grpc-web": "^0.14.0", "@solana/spl-token": "^0.1.8", diff --git a/bridge_ui/package.json b/bridge_ui/package.json index 708a7be38..9af0fbc8e 100644 --- a/bridge_ui/package.json +++ b/bridge_ui/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { - "@certusone/wormhole-sdk": "^0.3.1", + "@certusone/wormhole-sdk": "^0.3.4", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.11.2", "@material-ui/lab": "^4.0.0-alpha.60", diff --git a/sdk/js/CHANGELOG.md b/sdk/js/CHANGELOG.md index b113824c0..8acb3b851 100644 --- a/sdk/js/CHANGELOG.md +++ b/sdk/js/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.3.4 + +### Changed + +Fixed createWrappedAlgorand for Chain IDs > 128 + ## 0.3.3 ### Added diff --git a/sdk/js/package.json b/sdk/js/package.json index 67d8d4544..218386341 100644 --- a/sdk/js/package.json +++ b/sdk/js/package.json @@ -1,6 +1,6 @@ { "name": "@certusone/wormhole-sdk", - "version": "0.3.3", + "version": "0.3.4", "description": "SDK for interacting with Wormhole", "homepage": "https://wormholenetwork.com", "main": "./lib/cjs/index.js", diff --git a/sdk/js/src/algorand/Algorand.ts b/sdk/js/src/algorand/Algorand.ts index 890166e58..6149bed8b 100644 --- a/sdk/js/src/algorand/Algorand.ts +++ b/sdk/js/src/algorand/Algorand.ts @@ -230,50 +230,92 @@ export async function optin( }; } -function extract3(buffer: any, start: number, size: number) { +function extract3(buffer: Uint8Array, start: number, size: number) { return buffer.slice(start, start + size); } /** * Parses the VAA into a Map * @param vaa The VAA to be parsed - * @returns The Map containing the parsed elements of the VAA + * @returns The ParsedVAA containing the parsed elements of the VAA */ -export function _parseVAAAlgorand(vaa: Uint8Array): Map { - let ret = new Map(); +type ParsedVAA = { + version: number; + index: number; + siglen: number; + signatures: Uint8Array; + sigs: Uint8Array[]; + digest: Uint8Array; + timestamp: number; + nonce: number; + chainRaw: string; + chain: number; + emitter: string; + sequence: bigint; + consistency: number; + Meta: + | "Unknown" + | "TokenBridge" + | "TokenBridge RegisterChain" + | "TokenBridge UpgradeContract" + | "CoreGovernance" + | "TokenBridge Attest" + | "TokenBridge Transfer" + | "TokenBridge Transfer With Payload"; + module?: Uint8Array; + action?: number; + targetChain?: number; + EmitterChainID?: number; + targetEmitter?: Uint8Array; + newContract?: Uint8Array; + NewGuardianSetIndex?: number; + Type?: number; + Contract?: string; + FromChain?: number; + Decimals?: number; + Symbol?: Uint8Array; + Name?: Uint8Array; + Amount?: Uint8Array; + ToAddress?: Uint8Array; + ToChain?: number; + Fee?: Uint8Array; + Payload?: Uint8Array; +}; +export function _parseVAAAlgorand(vaa: Uint8Array): ParsedVAA { + let ret = {} as ParsedVAA; let buf = Buffer.from(vaa); - ret.set("version", buf.readIntBE(0, 1)); - ret.set("index", buf.readIntBE(1, 4)); - ret.set("siglen", buf.readIntBE(5, 1)); - const siglen = ret.get("siglen"); + ret.version = buf.readIntBE(0, 1); + ret.index = buf.readIntBE(1, 4); + ret.siglen = buf.readIntBE(5, 1); + const siglen = ret.siglen; if (siglen) { - ret.set("signatures", extract3(vaa, 6, siglen * 66)); + ret.signatures = extract3(vaa, 6, siglen * 66); } - const sigs = []; + const sigs: Uint8Array[] = []; for (let i = 0; i < siglen; i++) { const start = 6 + i * 66; const len = 66; const sigBuf = extract3(vaa, start, len); sigs.push(sigBuf); } - ret.set("sigs", sigs); + ret.sigs = sigs; let off = siglen * 66 + 6; - ret.set("digest", vaa.slice(off)); // This is what is actually signed... - ret.set("timestamp", buf.readIntBE(off, 4)); + ret.digest = vaa.slice(off); // This is what is actually signed... + ret.timestamp = buf.readIntBE(off, 4); off += 4; - ret.set("nonce", buf.readIntBE(off, 4)); + ret.nonce = buf.readIntBE(off, 4); off += 4; - ret.set("chainRaw", Buffer.from(extract3(vaa, off, 2)).toString("hex")); - ret.set("chain", buf.readIntBE(off, 2)); + ret.chainRaw = Buffer.from(extract3(vaa, off, 2)).toString("hex"); + ret.chain = buf.readIntBE(off, 2); off += 2; - ret.set("emitter", Buffer.from(extract3(vaa, off, 32)).toString("hex")); + ret.emitter = Buffer.from(extract3(vaa, off, 32)).toString("hex"); off += 32; - ret.set("sequence", buf.readBigUInt64BE(off)); + ret.sequence = buf.readBigUInt64BE(off); off += 8; - ret.set("consistency", buf.readIntBE(off, 1)); + ret.consistency = buf.readIntBE(off, 1); off += 1; - ret.set("Meta", "Unknown"); + ret.Meta = "Unknown"; if ( !Buffer.compare( @@ -284,24 +326,24 @@ export function _parseVAAAlgorand(vaa: Uint8Array): Map { ) ) ) { - ret.set("Meta", "TokenBridge"); - ret.set("module", extract3(vaa, off, 32)); + ret.Meta = "TokenBridge"; + ret.module = extract3(vaa, off, 32); off += 32; - ret.set("action", buf.readIntBE(off, 1)); + ret.action = buf.readIntBE(off, 1); off += 1; - if (ret.get("action") === 1) { - ret.set("Meta", "TokenBridge RegisterChain"); - ret.set("targetChain", buf.readIntBE(off, 2)); + if (ret.action === 1) { + ret.Meta = "TokenBridge RegisterChain"; + ret.targetChain = buf.readIntBE(off, 2); off += 2; - ret.set("EmitterChainID", buf.readIntBE(off, 2)); + ret.EmitterChainID = buf.readIntBE(off, 2); off += 2; - ret.set("targetEmitter", extract3(vaa, off, 32)); + ret.targetEmitter = extract3(vaa, off, 32); off += 32; - } else if (ret.get("action") === 2) { - ret.set("Meta", "TokenBridge UpgradeContract"); - ret.set("targetChain", buf.readIntBE(off, 2)); + } else if (ret.action === 2) { + ret.Meta = "TokenBridge UpgradeContract"; + ret.targetChain = buf.readIntBE(off, 2); off += 2; - ret.set("newContract", extract3(vaa, off, 32)); + ret.newContract = extract3(vaa, off, 32); off += 32; } } else if ( @@ -313,71 +355,71 @@ export function _parseVAAAlgorand(vaa: Uint8Array): Map { ) ) ) { - ret.set("Meta", "CoreGovernance"); - ret.set("module", extract3(vaa, off, 32)); + ret.Meta = "CoreGovernance"; + ret.module = extract3(vaa, off, 32); off += 32; - ret.set("action", buf.readIntBE(off, 1)); + ret.action = buf.readIntBE(off, 1); off += 1; - ret.set("targetChain", buf.readIntBE(off, 2)); + ret.targetChain = buf.readIntBE(off, 2); off += 2; - ret.set("NewGuardianSetIndex", buf.readIntBE(off, 4)); + ret.NewGuardianSetIndex = buf.readIntBE(off, 4); } - // ret.set("len", vaa.slice(off).length) - // ret.set("act", buf.readIntBE(off, 1)) + // ret.len=vaa.slice(off).length) + // ret.act=buf.readIntBE(off, 1)) if (vaa.slice(off).length === 100 && buf.readIntBE(off, 1) === 2) { - ret.set("Meta", "TokenBridge Attest"); - ret.set("Type", buf.readIntBE(off, 1)); + ret.Meta = "TokenBridge Attest"; + ret.Type = buf.readIntBE(off, 1); off += 1; - ret.set("Contract", uint8ArrayToHex(extract3(vaa, off, 32))); + ret.Contract = uint8ArrayToHex(extract3(vaa, off, 32)); off += 32; - ret.set("FromChain", buf.readIntBE(off, 2)); + ret.FromChain = buf.readIntBE(off, 2); off += 2; - ret.set("Decimals", buf.readIntBE(off, 1)); + ret.Decimals = buf.readIntBE(off, 1); off += 1; - ret.set("Symbol", extract3(vaa, off, 32)); + ret.Symbol = extract3(vaa, off, 32); off += 32; - ret.set("Name", extract3(vaa, off, 32)); + ret.Name = extract3(vaa, off, 32); } if (vaa.slice(off).length === 133 && buf.readIntBE(off, 1) === 1) { - ret.set("Meta", "TokenBridge Transfer"); - ret.set("Type", buf.readIntBE(off, 1)); + ret.Meta = "TokenBridge Transfer"; + ret.Type = buf.readIntBE(off, 1); off += 1; - ret.set("Amount", extract3(vaa, off, 32)); + ret.Amount = extract3(vaa, off, 32); off += 32; - ret.set("Contract", uint8ArrayToHex(extract3(vaa, off, 32))); + ret.Contract = uint8ArrayToHex(extract3(vaa, off, 32)); off += 32; - ret.set("FromChain", buf.readIntBE(off, 2)); + ret.FromChain = buf.readIntBE(off, 2); off += 2; - ret.set("ToAddress", extract3(vaa, off, 32)); + ret.ToAddress = extract3(vaa, off, 32); off += 32; - ret.set("ToChain", buf.readIntBE(off, 2)); + ret.ToChain = buf.readIntBE(off, 2); off += 2; - ret.set("Fee", extract3(vaa, off, 32)); + ret.Fee = extract3(vaa, off, 32); } if (off >= buf.length) { return ret; } if (buf.readIntBE(off, 1) === 3) { - ret.set("Meta", "TokenBridge Transfer With Payload"); - ret.set("Type", buf.readIntBE(off, 1)); + ret.Meta = "TokenBridge Transfer With Payload"; + ret.Type = buf.readIntBE(off, 1); off += 1; - ret.set("Amount", extract3(vaa, off, 32)); + ret.Amount = extract3(vaa, off, 32); off += 32; - ret.set("Contract", uint8ArrayToHex(extract3(vaa, off, 32))); + ret.Contract = uint8ArrayToHex(extract3(vaa, off, 32)); off += 32; - ret.set("FromChain", buf.readIntBE(off, 2)); + ret.FromChain = buf.readIntBE(off, 2); off += 2; - ret.set("ToAddress", extract3(vaa, off, 32)); + ret.ToAddress = extract3(vaa, off, 32); off += 32; - ret.set("ToChain", buf.readIntBE(off, 2)); + ret.ToChain = buf.readIntBE(off, 2); off += 2; - ret.set("Fee", extract3(vaa, off, 32)); + ret.Fee = extract3(vaa, off, 32); off += 32; - ret.set("Payload", vaa.slice(off)); + ret.Payload = vaa.slice(off); } return ret; @@ -460,13 +502,13 @@ export async function assetOptinCheck( } class SubmitVAAState { - vaaMap: Map; + vaaMap: ParsedVAA; accounts: string[]; txs: TransactionSignerPair[]; guardianAddr: string; constructor( - vaaMap: Map, + vaaMap: ParsedVAA, accounts: string[], txs: TransactionSignerPair[], guardianAddr: string @@ -495,11 +537,11 @@ export async function submitVAAHeader( appid: bigint ): Promise { // A lot of our logic here depends on parseVAA and knowing what the payload is.. - const parsedVAA: Map = _parseVAAAlgorand(vaa); - const seq: bigint = parsedVAA.get("sequence") / BigInt(MAX_BITS); - const chainRaw: string = parsedVAA.get("chainRaw"); // TODO: this needs to be a hex string - const em: string = parsedVAA.get("emitter"); // TODO: this needs to be a hex string - const index: number = parsedVAA.get("index"); + const parsedVAA = _parseVAAAlgorand(vaa); + const seq: bigint = parsedVAA.sequence / BigInt(MAX_BITS); + const chainRaw: string = parsedVAA.chainRaw; // TODO: this needs to be a hex string + const em: string = parsedVAA.emitter; // TODO: this needs to be a hex string + const index: number = parsedVAA.index; let txs: TransactionSignerPair[] = []; // "seqAddr" @@ -540,16 +582,16 @@ export async function submitVAAHeader( // limitations with lsigs AND reduces the cost of the entire operation on a conjested network by reducing the // bytes passed into the transaction // This is a 2 pass digest - const digest = keccak256(keccak256(parsedVAA.get("digest"))).slice(2); + const digest = keccak256(keccak256(parsedVAA.digest)).slice(2); // How many signatures can we process in a single txn... we can do 9! // There are likely upwards of 19 signatures. So, we ned to split things up - const numSigs: number = parsedVAA.get("siglen"); + const numSigs: number = parsedVAA.siglen; let numTxns: number = Math.floor(numSigs / MAX_SIGS_PER_TXN) + 1; const SIG_LEN: number = 66; const BSIZE: number = SIG_LEN * MAX_SIGS_PER_TXN; - const signatures: Uint8Array = parsedVAA.get("signatures"); + const signatures: Uint8Array = parsedVAA.signatures; const verifySigArg: Uint8Array = textToUint8Array("verifySigs"); const lsa = new LogicSigAccount(ALGO_VERIFY); for (let nt = 0; nt < numTxns; nt++) { @@ -638,17 +680,18 @@ export async function _submitVAAAlgorand( // If this happens to be setting up a new guardian set, we probably need it as well... if ( - parsedVAA.get("Meta") === "CoreGovernance" && - parsedVAA.get("action") === 2 + parsedVAA.Meta === "CoreGovernance" && + parsedVAA.action === 2 && + parsedVAA.NewGuardianSetIndex !== undefined ) { - const ngsi = parsedVAA.get("NewGuardianSetIndex"); + const ngsi = parsedVAA.NewGuardianSetIndex; const guardianPgmName = textToHexString("guardian"); // "newGuardianAddr" const { addr: newGuardianAddr, txs: newGuardianOptInTxs } = await optin( client, senderAddr, bridgeId, - ngsi, + BigInt(ngsi), guardianPgmName ); accts.push(newGuardianAddr); @@ -657,26 +700,27 @@ export async function _submitVAAAlgorand( // When we attest for a new token, we need some place to store the info... later we will need to // mirror the other way as well - const meta = parsedVAA.get("Meta"); + const meta = parsedVAA.Meta; let chainAddr: string = ""; if ( - meta === "TokenBridge Attest" || - meta === "TokenBridge Transfer" || - meta === "TokenBridge Transfer With Payload" + (meta === "TokenBridge Attest" || + meta === "TokenBridge Transfer" || + meta === "TokenBridge Transfer With Payload") && + parsedVAA.Contract !== undefined ) { - if (parsedVAA.get("FromChain") !== CHAIN_ID_ALGORAND) { + if (parsedVAA.FromChain !== CHAIN_ID_ALGORAND && parsedVAA.FromChain) { // "TokenBridge chainAddr" const result = await optin( client, senderAddr, tokenBridgeId, - parsedVAA.get("FromChain"), - parsedVAA.get("Contract") + BigInt(parsedVAA.FromChain), + parsedVAA.Contract ); chainAddr = result.addr; txs.unshift(...result.txs); } else { - const assetId = hexToNativeAssetBigIntAlgorand(parsedVAA.get("Contract")); + const assetId = hexToNativeAssetBigIntAlgorand(parsedVAA.Contract); // "TokenBridge native chainAddr" const result = await optin( client, @@ -798,12 +842,13 @@ export async function _submitVAAAlgorand( } if ( - meta === "TokenBridge Transfer" || - meta === "TokenBridge Transfer With Payload" + (meta === "TokenBridge Transfer" || + meta === "TokenBridge Transfer With Payload") && + parsedVAA.Contract !== undefined ) { let foreignAssets: number[] = []; let a: number = 0; - if (parsedVAA.get("FromChain") !== CHAIN_ID_ALGORAND) { + if (parsedVAA.FromChain !== CHAIN_ID_ALGORAND) { let asset = await decodeLocalState(client, tokenBridgeId, chainAddr); if (asset.length > 8) { @@ -811,19 +856,23 @@ export async function _submitVAAAlgorand( a = safeBigIntToNumber(tmp.readBigUInt64BE(0)); } } else { - a = parseInt(parsedVAA.get("Contract"), 16); + a = parseInt(parsedVAA.Contract, 16); } // The receiver needs to be optin in to receive the coins... Yeah, the relayer pays for this let aid = 0; - let addr; + let addr = ""; - if ((parsedVAA.get("ToChain") === 8) && (parsedVAA.get("Type") === 3)) { - aid = Number(hexToNativeAssetBigIntAlgorand(parsedVAA.get("ToAddress"))); - addr = getApplicationAddress(aid); - } else { - addr = encodeAddress(hexToUint8Array(parsedVAA.get("ToAddress"))); + if (parsedVAA.ToAddress !== undefined) { + if (parsedVAA.ToChain === 8 && parsedVAA.Type === 3) { + aid = Number( + hexToNativeAssetBigIntAlgorand(uint8ArrayToHex(parsedVAA.ToAddress)) + ); + addr = getApplicationAddress(aid); + } else { + addr = encodeAddress(parsedVAA.ToAddress); + } } if (a !== 0) { @@ -863,10 +912,8 @@ export async function _submitVAAAlgorand( // We need to cover the inner transactions if ( - Buffer.compare( - parsedVAA.get("Fee"), - Buffer.from(ZERO_PAD_BYTES, "hex") - ) === 0 + parsedVAA.Fee !== undefined && + Buffer.compare(parsedVAA.Fee, Buffer.from(ZERO_PAD_BYTES, "hex")) === 0 ) txs[txs.length - 1].tx.fee = txs[txs.length - 1].tx.fee * 2; else txs[txs.length - 1].tx.fee = txs[txs.length - 1].tx.fee * 3; @@ -875,10 +922,13 @@ export async function _submitVAAAlgorand( txs[txs.length - 1].tx.appForeignApps = [aid]; let m = abi.ABIMethod.fromSignature("portal_transfer(byte[])byte[]"); - + txs.push({ tx: makeApplicationCallTxnFromObject({ - appArgs: [m.getSelector(), (m.args[0].type as abi.ABIType).encode(vaa)], + appArgs: [ + m.getSelector(), + (m.args[0].type as abi.ABIType).encode(vaa), + ], appIndex: aid, foreignAssets: foreignAssets, from: senderAddr, diff --git a/sdk/js/src/algorand/__tests__/testHelpers.ts b/sdk/js/src/algorand/__tests__/testHelpers.ts index 015be047c..f533069de 100644 --- a/sdk/js/src/algorand/__tests__/testHelpers.ts +++ b/sdk/js/src/algorand/__tests__/testHelpers.ts @@ -10,6 +10,7 @@ import algosdk, { waitForConfirmation, } from "algosdk"; import { getForeignAssetAlgorand } from "../../token_bridge"; +import { ChainId } from "../../utils"; import { TransactionSignerPair, _parseVAAAlgorand } from "../Algorand"; const ci = !!process.env.CI; @@ -327,12 +328,15 @@ export async function getForeignAssetFromVaaAlgorand( tokenBridgeId: bigint, vaa: Uint8Array ): Promise { - const parsedVAA: Map = _parseVAAAlgorand(vaa); + const parsedVAA = _parseVAAAlgorand(vaa); + if (parsedVAA.Contract === undefined) { + throw "parsedVAA.Contract is undefined"; + } return await getForeignAssetAlgorand( client, tokenBridgeId, - parsedVAA.get("FromChain"), - parsedVAA.get("Contract") + parsedVAA.FromChain as ChainId, + parsedVAA.Contract ); } diff --git a/sdk/js/src/algorand/__tests__/unit.ts b/sdk/js/src/algorand/__tests__/unit.ts index 910c7bed7..b9804289d 100644 --- a/sdk/js/src/algorand/__tests__/unit.ts +++ b/sdk/js/src/algorand/__tests__/unit.ts @@ -96,7 +96,7 @@ describe("Unit Tests", () => { "01000000000100878efed6e1e829ef2d2b38b3e4442af7d52b15152d9a137104af59dc50bd6fa90111c3cfb37f49daf7ae5da1f7a70666ef59ed43b1802b9a86d8d916593a8bcd00620a4ecb000000010001f346195ac02f37d60d4db8ffa6ef74cb1be3550047543a4a9ee9acf4d78697b0000000000000d629205032574800020200050096503257480002011dc9fc22544655b453008cc68559639a8f74d584d94f84ac945b36c957afd9db73dc009953c83c944690037ea477df627657f45c14f16ad3a61089c5a3f9f4f201000000000630a010fffffff8000000000623c88e000000009fbfbc1f000000009b155c1f00000000000127a100000000755eafbc000000009b155c1f000000000000c350010000000000620a4ecb503257480002010264e3935b6fb12d2c5d92d75adb8175ca5b454c7d7ec279b0d27647ee0fd33f08f781a893bc9340140c5f89c8a96f438bcfae4d1474cc0f688e3a52892c73180100000000054a37b0fffffff8000000000541380d00000000a138fc3f00000000b6dfdb3f000000000000fd5600000000769a3b9c00000000b6dfdb3f000000000000c350010000000000620a4ecb50325748000201e0b43fa07b9318a2de306080fc8946494ae30c6af9b12b4dc99f1847718e6341afcc9a5bb5eefd55e12b6f0b4c8e6bccf72b785134ee232a5d175afd082e8832010000000001011868fffffffb00000000010233e2000000005821445f000000003414d83d00000000000054850000000070b122fc000000003414d83d000000000000848d000000000000620a4ecb50325748000201101be52cc7068adf747f67759e86b478c6e90f81b05a8121d080cfa0a5a9a0736de025a4cf28124f8ea6cb8085f860096dbc36d9c40002e221fc449337e065b2010000000137791750fffffff8000000013567604800000001450fc47f000000003e9efade00000000001cc89e0000000076204e7c000000003e9efade000000000026e8f0010000000000620a4ecb50325748000201a4b430a1ce2c68685e0c0e54a60340854fe15ce154e2f0b39927968e447cf93b1fc18861232290221461220bd4e2acd1dcdfbc89c84092c93c18bdc7756c1588010000000005f67d40fffffff80000000005f67804000000018773c2df00000001874d089f0000000000007513000000007547c2fc00000001874d089f0000000000007530010000000000620a4ecb"; // convert string to Uint8Array const hexPppVAA: Uint8Array = hexToUint8Array(pppVAA); - const parsedPppVAA: Map = _parseVAAAlgorand(hexPppVAA); + const parsedPppVAA = _parseVAAAlgorand(hexPppVAA); console.log("parsed VAA:", parsedPppVAA); // @@ -104,35 +104,35 @@ describe("Unit Tests", () => { const gUpgradeVAA: string = "010000000113006a0fd5b12c71afea701d8cf2bf13aed7511b6f1e239b26a28e2635fe5a68af1902f1eec1e085c754cbebdfb5262f78287e7d110d25cd4ad6504bc36e776d5f4d0001500b3dec9b3c712ea9cf40070ef8616f73966f26845894d796ef2a94a42396121192ceb8cca26c575f648d1b384e9d21689751c73295c424a93a4ac2094c57e70102752dce8a19611490b84e80606a40286cb45bbaea2a8f818a8c9c46e763528de971d45d7aabfafda92e494e120f9d478b7eeecb9c654509f0351f22645f90c83100034966869ea35c27670a4993fba23d8c3e7dc7868c956ec4f78069145e1598c5e96b29894ef82b8a7000bf7e17c6a2c125aaca5fae9c1af30e617d0a3b25e562c20004c51abb12086b1dba7cf129e463fcf4bd0d42720abfd0ac93da2bbc5335496f5a18cb952ad9688c0c91ac083e22df5a4cb55470d6bf107ef1d741698b2a6093c20105e97e64fb124345a9feb9a715b701cfbb3a828d0917f255a94e45a11bcc5ed200049a062a686f202a6e1d8cd3424c5d47d0b2cf302094eef25421ca403a68099c010677a8989bc4eefe4ca35d0944077da1a8b751cc27ac1d8075187438d38c3c7dda28fab818efdc8b9514c3b753d23f2ef58af1dcff743d22cebe4baa3fdd2ace8401072bb8f606278bd301d5c43172626d66bd475f74f5d1966f364b6e2a66e587c94c7f5ddd2710bff83337c88920b9207e1ccbb34aeaf20707bf5ede700bc2a245470008e798887c16ead032eac3a9002a306dfd3650432be1ee2023c673aaec1cde884642cb728ca67e27d10df4fb8bad8e0d1590894e2e4f2e69930c380d7476c0fcc400098bee13bd73fe668d66caea447de67a243f45832b4144070716def14f45b3c39733caa04f0f2feeab698de2b938539c6236239f9753b433a8989e33205a20ce9e010aad6dbe3e46e9bc7b49d6a9cd5efd87c4ec4f478847b197695d553b12c0354999282413948e6515039f19ed5298724ddea9a013a14de68246cc0dbf0412b7b5cd010b2f48337c8a4b09e20bede3fca7c05adfe3c9051eb24651e759daa4a20c701f8363ed7a206faf61880e50c0b2c6167b844cb4ee995750255335cc10a05bf9c75f010c5dbcca21cd3bc92b7d24c25de3ee49eadcc314df34cc2a577a3a9960c13f6317291598fd6b73aebbb24af51d916870757fd8193d8d7b2799e8cdeb0fe3d47433000de95a94e0a4b72c471c92b699fa70b25f70db10e7bac3910eaea5a2b60b7ba13a5b0328ab4d3256452b426a761a2aa919d2695f852d4a6134c733530fce9ab84e000e780ebd790827b19ec30beb6a079d530ace0a98b11378ed9b86af99d7ca1f4b0b2c789574fe59b66648196350b1165916e4067185d6ec3b0a7c715a1efe5c5265000f87d2137693af524bf9aebc735e386bf2a8f3ed383ebeb6ffe0c17652ee59d88b19ad688b0270451269217efb5a0f23047627a8ee21862a77a5bf9ca55c53cde50010eaa77d3646bd79b549ce6919266fd7a9e0f64a2faaa5d61965c1f57bbd41ea4264b1fdf4abcb4e396feccdaf4193b8691119f8b2807a020a8badfb64546ddf94011135252460395af21ada39a775a3c48feb1c2462dfea215f96b974e6c27ac1233e517201697e519ca58a79d27227ef37c1a35997f377825ab6452a2f399287b6c2011229ebc2abc2be958ca1bb0551a1ae4cd9420c17289f9885ece52309f0766034000615684bf8d3ce0d217e8060a60e1940bca6f726dc1564c1467d719a6dcf58e60062319c37000000020001000000000000000000000000000000000000000000000000000000000000000400000000000000022000000000000000000000000000000000000000000000000000000000436f7265020000000000021352a26ce40f8caa8d36155d37ef0d5d783fc614d2389a74e8ffa224aead0778c786163a7a2150768cb4459ea6482d4ae574305b239b4f2264239e7599072491bd66f63356090c11aae8114f5372abf12b51280ea1fd2b0a1c76ae29a7d54dda68860a2bfffa9aa60cff05e20e2ccaa784ee89a0a16c2057cbe42d59f8fcd86a1c5c4ba351bd251a5c5b05df6a4b07ff9d5ce1a6ed58b6e9e7d6974d1babec087ec8306b84235d7b0478c61783c50f990bfc44cfc0c8c1035110a13fe788259a4148f871b52babcb1b58a2508a20a7198e131503ce26bbe119aa8c62b28390820f04dda22afe03be1c3bb10f4ba6cf94a01fd6e97387c34a1f36de0f8341e9d409e06ec45b255a41fc2792209cb998a8287204d40996df9e54ba663b12dd23fbf4fbac618be140727986b3bbd079040e577ac50486d0f6930e160a5c75fd1203c63580d2f00309a9a85effaf02564fc183c0183a963869795913d3b6dbf3b24a1c7654672c69a23c351c0cc52d7673c52de99785741344662f5b2308a0"; const hexGUVAA: Uint8Array = hexToUint8Array(gUpgradeVAA); - const parsedGUVAA: Map = _parseVAAAlgorand(hexGUVAA); + const parsedGUVAA = _parseVAAAlgorand(hexGUVAA); console.log("Parsed Guardian Upgrade VAA:", parsedGUVAA); // // registerChain VAA: const regChainVAA: string = "01000000021300d655215e841c8402dd5a5a59cde64d1cdcf4d630794a950572154c419445bd6b0b55a2867128dbdb07a8af7023586c07ee4c2343b436fd4a7bae4c00175eee89010139205169195a576f34f840f5efec49a0c8cfcb15889b8fa7612260444bef8bdc0fd274edfc7c6a3ae9d3f0f560fe39dee3cb2cef578c4acde75d4524c9569c52010204242bf606b8ebd8bba252e9e37e0f3352c044367f8f58c681164cbd024563e604f7836a59e04713c3c351540eb84514bee8983aac088b565bdeb1588facbf240103f334f37f6054f6b35e10531377f9b60dd0ed8153333fd1ac1577ca7f9f849c092c78f980d474947227fc543ea4b8e0a0156dce70024ae123852b6569a972bc3f0004190eaa4d1d635d74563163061a7febab0f560ea5ef772e9b499abbcc8198641e152b9872e395667c3469457ea7b13474597f571a8dd43198ebf924c4d81f6860000590106ff897e2808d3e6591a2939f597855cb8b9edf9b6cf01c571d06d1015bcd43dcc26384167c09ba110a414fc0a37137bcbf8378b7da55e58c86eec2425e9e0106c6658a3ecb9355b4e4699316918903f2b51ea36c5e9eec7d2243c930b16885056e4c9b60bef18c8f311abfac9b4993ca5a5a5563ef70d8ed4643e8a0294a7cee010726d4b97eb4280a87028fb4246ac91e2278045ce9727ac960b45aa0f2f125efe72f8ecc3d5378cb5974575d1ee292595bbcac71237fe25d194bf28ee64a6ed6d30108dc8377d7ae5f922a004f85124f63afc4559a8b29446612e09bb4e22d3e8e1603286d2264aee4745803da7010505c243523593045d0b814cbfbb7a703d92c2aaf000927757c0421497409138a184ba6405fcf669abee706f2d6dce525460f9926f1e0234d420062e95d69e72253898ec7a9bd54a31b09a67a5e6a3080da419102229e010af7b9de76c6be33ac09227a8067b4e82fcae95f1919f4ed8f902b1a735cc3ebc27e217e96c76662b9d5cd614f0cf78b283e5088ecfb939c7556601bcfecf6a6c3000b1574118db342f783559846872ec5f99347b959ab39c934ab40f4285320243de351e2cf6edf7596249cb4a33a2132200f48ee351a9c4d3ab2cedc052994d8702b010cf6944222b35d390b71a6eb09bc96ccac5cef9e7dcae7604e8db11cb050c59f3514acfb6ec06fce2814c8d7509cd24d4225c2cb0666ea879ddabc86e8946d84d6010d5cccc13fa483890fb5ac0d2929d105d7f8c7aa0f9d8c4ef2e7fed502ae02505f1553d7be46ea8c86aa1ecd6106d48cf3b0e38465dc47af137f72d302c71fb623000e44bf3f46476f30e240468592f23877774b775e16d1182e5df6aea08301f716283b8517673e2a295170dc3810b50831d29617c440aff68702e0d94a95d22dee3a010f95b05c152c60079b1b056638ab61a26452b04d44dacd0bba36d7c65a462b27720f97bb310303e320ef75ab043dd80a2fb1e4869f16689665bf076dcf754be84501105c6a4901e6ead756e6a796d6209cf830fe90acf186aa792297f75b751d13accf4004351ec3d6e49ea795be260112be51cf050a49b4213fb4467ba6e5bd8e4ce10011ab3b325b996897ab7fa7231c5eb8f04533fc1acec6429ad2cbd66a1c8e5b916f1775371411be693eb1fef8a89ec60086ca600a7fff8ffe3fc328aba62e84caaa0012f672dda335d096b2a873ce05c9b6b0759282475900678efc7b3b36a5d3fa3cab7fd4165345f61753376f039aa9207ab263786831d82206bf00f7bbb78b7c3fe80162319c3a0000000400010000000000000000000000000000000000000000000000000000000000000004000000000000000420000000000000000000000000000000000000000000546f6b656e42726964676501000000020000000000000000000000003ee18b2214aff97000d974cf647e7c347e8fa585"; const hexRCVAA: Uint8Array = hexToUint8Array(regChainVAA); - const parsedRCVAA: Map = _parseVAAAlgorand(hexRCVAA); + const parsedRCVAA = _parseVAAAlgorand(hexRCVAA); console.log("Parsed Register Chain VAA:", parsedRCVAA); // // createWrappedOnAlgorand VAA: const createWrapVAA: string = "010000000213001169470caf4d5f7a27049c1852e6429c0fa7db56584e1514b8cc3d7242b7710f5d15600562f068cd5bb0d515bd038929b62f14396730d06e99c6a7e14025a62900015157522a094c006c8ceb4b2a8b6e5bfaa613663f34d9ce534d4e4b5f581c720b21eb96062324eac0e9b28cf526698cc70b013436f6341312bc3dc2cd2c5e3b6f0102f1c5fcf6b6df200dbaedb7a923b244fd4563ce727b17d39f27c7fd3b9fb5c76e27f827779e47c98c0fb82bb59c40009d94afc68cec2066e6765292d5274399e20003bd48cbcf25a2ae733077f719f48812dcb5db45551308f98281839f9d1b5ebb2728ad199925b5451a2ac90caaf19eb9f8dbf83880cddd4380ccbd7556f3776beb010460d01f541b5c8664e8163db5ff67e553115a5adbe977e896e00bfe558f15e75771eb6e334827f42738120ff474597770b1dd843ae7bae96e2ebc2b2f111ff3850005577275e235cdc0e95e08b3efa44fd8085551b6f7b59aa0f7f091bf7002bcb9480d6be6196bac66f270a1018a5388b8174548a425c624bb65f06b0a0b2f41ba5c01064e9637c161de6e8588fe50022f4da14726733be790b84cce174a80e5142e17a6266381aa2b84fa3df7608430a5ba27aa188b2d389cbd0c73a4b64593d37bccc50007b70a66f4663afae8759c3639d8213e5094db416404b8058b32d10b42521b458b13d19e7ae8f5a4b9be2c47215d12037c74d5501bc5e1b1c5fa62957f8717e9d00108136ef73c58764c22391a8410e9811dd8a978f52b73c2564938357aab095e476761118053a09e0cad08735629360528ef4362823e1956833bcd8eda5482a03df801097ccf894c000cbc28587ab52627a7b8d05c2dc5434cda6f5cd55ae58e979cfb6e01303ad8ac1697dec213a5fbfeec6e77d483d09ee747a9de32618ea9dfc9a5f7010a1cc64605a4de382441c60a889d5a74f77b3328d9d8cd9e5b02ec69597f87cb60085f1cc6e4ffdb48f125c375c00d7e7d93804e9ea6b589f5a9e92bed9dfdca14000b9330b10a041438d52ccfe3b64bf4fd3a5ea5686b755f356d26d954e86b4384a1523b6e469fc61880324a0774650a5eb6502d677c11457a37674cca0cda76f688000cf1c276efcf8662bd0d59d1ca33ebe08121c76e31b0d74620bce9102ae02a078b4a52f8d626a71c4e5ce43b6524424594d8d0c70eb7cc01cc7ea734e48e85797d010d5a2617b7894ac14e15df109101e2779f6dc6027820613e2f4501a26ca850684a05785d7e02372a8184821cfc23d22ddec4631f2574d1338cafb963a58e1503dc010e674380d092aa52e8f6e237cba930551d9d7493427f9958e59d32eb796ab76a2140ca698e78a7198399935a5a73d5c8e363087f3f8f49722b237e455a15554af3000fcb79ea3c70a75238f841f7c539bfb3ab8c00b539ed9f72b92b26b0edcaf6211a298812b07e52fb9a3a4d1c52aec35453a9c65e48be569b4e6533a22c7d679060011004d7b9d453ddb5834bfb60564d673a1ed2b51aad9db321d72ab3e1089df778467bab44624e4aa2916585cfad0f42ba03b146a57cc40f61a2ea4862a700b7945c0011257311c376bab7646f83a81b85cc3e18545e5a980eef0d8e6a217861bdb34b18342148527c9018811a46a8e2eb38cb8ab25c66dd4d4a817cc031ff163d4f32eb0112d071f99d8b4cf54b034b2276ab76fd324965f9b9a35efc56109b99e637948c024c97988497b61d169eee4f27b649d6dbdc770452be51bc01315ce3f831c9ff000162319c3c000000080001ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5000000000000000820020000000000000000000000004523c3f29447d1f32aea95bebd00383c4640f1b40001085553444300000000000000000000000000000000000000000000000000000000436972636c65436f696e00000000000000000000000000000000000000000000"; const hexCWVAA: Uint8Array = hexToUint8Array(createWrapVAA); - const parsedCWVAA: Map = _parseVAAAlgorand(hexCWVAA); + const parsedCWVAA = _parseVAAAlgorand(hexCWVAA); console.log("Parsed Create Wrapped VAA:", parsedCWVAA); // // redeemOnAlgorand VAA: const redeemVAA: string = "01000000011300d3f66cd953524cd3dd33396bdd24a6e5deb3df3c0404be778b4b939579212e1c66f479a85a3a00c812c775e58ca34878931d955d1939877e2a5e3c4419cd11960101c47a513100d6540304c245f310b6832eaf2477afce3bf2909ea5447732e6bcb651746141998c1de50306ee94eb65b711888c65a43a42528cee0be005151716360002c124c4012062c9b1cbf5f31ca551f50c553f7a97bbd0b1a50fe9e5d5589a7f101ca550bda30503b1b3bb4c092ef9a605ddfc0be08c3634c4b292399a54d63e4200032263333ae6daa49f05ec9deca9122755c9206bd72dfdac3d9c8dcdfb2db284b0265c77f9ee1b1c00e4f298869b1c492bff805045c0d0eef8fc3c0fdfbb82f01b0104a40415447bfadfffaf7d9bca8492dfc7c94dcc15e7ae3cc4f20cb34531ed17977e7711284010d71c868b69a87547b6faa09685aff8048cfc6fffc839d0be0b6a0105dfc1b0de5216abb57b524ce51f336060c3d1625ed28b55c5cd5cf1632c38f9c062f168f3d0f0838daf9c13a4ef48a8c159207045c3cb8e43d4a76baf591223c2000686180a55def6a45e8ea71595df89a69583c671a83e9e89bc5b73c55ed88c49fc5e32c47b8abdf1552bfc311d2dac988811f40c74eef3eb9437cf35b52d30239a0007b082d16d31d8e06d8ad494834b18d3b3d316a399b4d36bfb426e5b60ff81fd2e632da3466d2fa68fc0ec7bb0964cf969cd125966873ce52a1e846d4d8f0495440108487ff6b4956cea68fc8aa225ce47f93a15477f66db4362d0602d62a5b790428578253062d34b8c61665a6637572b095da9037025f426274f3ef40e7ecc493b5b0009b39dbed5560d5de7075fb43496e52b061313c6eb591ece2cde513de818881c30672e4fc180f6e3fbabf6a94813adb0d66a99b38ee27dfc71ad3fc4058c3c976e000a0bfd12ece2d2c845dc13293380784695e98e8ae598c3053426baaf65c9c962960271c8a69e52458f385be5617dde1b571d341a82112fe9aef1468140faebca00000bc0a81d0a8e9278011a0a4e0257401f35bcec9d98222ae2e9f44a39b6899d54551482f68c89040b60315a806c1f7cf18cb65bed3e18c8cf1059999e5107e720f2000c1939897f4dc63ec9ef38844ceb665caabab1f758a8543feff43b4bdd151dc6a56b93ff56d25fc4c0fe0c78d01df793fb4e3bdc2dea55f18694a40bc43dadc654010d1f41f8d5067eccdbf047180de85521ed3bbffd91ec2f157833e9514444d39e8c65c9f9897dcefc5e44469b080021e1715d85688369d24ae89b4858eaf2c89faf000e3310037efb7a37917725a6575f471427686d56e641bd4aa21394f8202f3f52db2f45fcb718ab4550a468bceed0c13ee8040c0da173caf87a7a5c1908f7270811000f6673460a92bce84565571f2b398f1692eb393adbf47b70bc60ca7755208aaf771010726fd66f2953a33fb472dbdcd91fb78b2993b279050d2d15b3b37c347c6e01108421b71f1568cf2f12d25bfbf2755561772c661a6f2cdeae02bbe8204fa8a53632536c4e580af27551a3304f2c87bff489b516e1d9570c1e203c8e0eea8c86520011186b2e2f0a42f554c604679085aeb7226ec2a9807d867ce51f40af5d58ce6a433981cd00f843b5223ebd764026c8a729c32ae92013dd27a8bed271d85a09733600127765a06677c2a9b060e15b361917eeefda093f3951fef93cb9787b05230dad9207635fee6f987a50202cbe3613da1f1e9c51ef09b885004d763da72403a231bd0062319c3e000000010001ec7372995d5cc8732397fb0ad35c0121e0eaa90d26f828a534cab54391b3a4f5000000000000000120010000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000004523c3f29447d1f32aea95bebd00383c4640f1b40001e6b2b620e5c346848e30a40310ef30a359b466148ab5c04f96e024e40de143ac00080000000000000000000000000000000000000000000000000000000000000000"; const hexRedVAA: Uint8Array = hexToUint8Array(redeemVAA); - const parsedRedVAA: Map = _parseVAAAlgorand(hexRedVAA); + const parsedRedVAA = _parseVAAAlgorand(hexRedVAA); console.log("Parsed Redeem VAA:", parsedRedVAA); // // transferFromAlgorand VAA: const transferVAA: string = "01000000011300aec87f926f0d7bbe5c37dd580f5e94e7aa9ee8837741ce9a2964efae9f977dac79492e7ed5f84d489aa6d1f3d752c9febaf846589927d1dbe8cd69e7d01e9d44010156195e8b1383bf1d76e5c715f27caa7a6d29cf2aaf10c67eae3ecb855be013f500981e56c346c2122ff2a0a274745093adc6e263ca8b220649fdaedd041be47a0102aeb73afa6c75122d52666da208b1b29221ff5f894da8fd11f9d8ab9c9fee9f6e238231f4a48200637d29fe70b327f7b6cc536d326635d944e80aca84aaf2908000035612a27bb95f0e280502ea7d4631afd2b24d41428f22f58bcd5ba9477be4de8536ab20b4bad90f3f95f3303a1c116ca78c4cce9478c2769aaad74c04b53f17f40104b1fc79501049806997bc793694601566f5d56c3abf5ea3126b0c1c24a97e9e8e592ed505de471ad372f679beee35a5e467144627d72343834c5f96b1afa1b9b400050af609532bb0ea524a35a76c4a46dea2d6a31c545bbba705d99b42259acb77d90f19e2866d7dc12468691988291c154e900fc90d7b6f666ff9f63a66d163331100063bec6164adc6529b2f5d02c9a0da90d3656d4d9bb7a6f9b31f2c00e914d2001f3724cab7fb6a914ee2de2ef622c129e0ccf7a9d9784b6a70deff5cdb0c6bc8a50107179150acf55b02e0a12e484c8f274e411d82333428dfe06440ec7cf51373fc6f2fc5241225c06c8c3ad662ca236e07ce06fc4988c1e2620dcd07e977d3c872480008e476380cdcc35d61881e372f1b6643a8aaa577fdbfc253626997e38773185bf50ae33a4c6127b77369670718fa473a52d6b593e3cb3af479c451bdfeefcf2bd30009674551361eaaff891d590ca699d5b03504d866fe91a8118bb1681e0759edbfca1f2b358398d4d46e6916d9378bcab01e7ff21fd770e63222b2ef6a98c262d83e010a8ad0bc1d8eb89b4a8d7b119d62d737202895e3d80a0ca7367a21bd6587cc6aba0cdb19c089b03d622a1ad6a939ee285f78c3f52e87a81fa51d0fea7238280aba010b13857b3845216d66fe84985bd8d5a16b2440ea0a3e5afc43c19c802fe7c360dd5534c1df47e8ba0c5b4166e13becf5454ac3567fdbdcadcaf625d46ae7a188d7010c70e3859ea2d4c05769bfb72649f0266eef24e310558a7136d931161cafea91674cc3ded48c6715f3326e365ad862444cb867688b834ac12bf0b651d81764951e010dd03c3f06009a37a2c716259c1e86793a5bd9b9bab9cc3d2cc2983a766e87aeb275a9a9a047d81b57bb2b9b747138c391b77768a639b284e662ae5c15504d48a1000e9ccfade4aea4f1d5e1e053a32d1a93c39e855044a09cfd41f974f61986e42ab21d103c1c2c82a1cff1d2f0f79ad64ad8c214f88c1a84518bc6ad3656f827c6f0010f09ed95a03909d4a40041676a7f460c35ea7b9464a855a3aa1df9e2b4841e5ec42b08ca2c1f9997274b9f07120180e8d5b8eeceada584c79cbfc39d983b6dfaba00101c48e160de738770847abef02cdd0a3594dbc80de68403004f987e7676f954df2aa24e5280f5ecf5a61f865af1185220a805a64211b732e3672071801f75a86901117004184bcfa26f19efed445980f65e2450101bf20bb70d36c66e244bc10c1ff33aee94550a5af547e346ffd913335b33b374776b81d408b54dad046a18afcc9f0112420f47b6b5bd0c4b5c5e5c8db36e490c8d250e1e2087a7b43b63fac0f7f6bc6f28593877c492e27c560e39afcd8aa99847feb0193759be61fae2e8130a8993150062319c42002f37460008a8f52a34e2b19ac916d3cc27d3b07bfbfb03f31e0075a2a85ffe99be89d3887c00000000000000032001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000006150008f888ac4b7756ad193876ff85decf58eaa82f5094d528d7cd9b3119737b1e8d2700080000000000000000000000000000000000000000000000000000000000000000"; const hexTxVAA: Uint8Array = hexToUint8Array(transferVAA); - const parsedTxVAA: Map = _parseVAAAlgorand(hexTxVAA); + const parsedTxVAA = _parseVAAAlgorand(hexTxVAA); console.log("Parsed Transfer VAA:", parsedTxVAA); // } catch (e) { diff --git a/sdk/js/src/token_bridge/__tests__/integration.ts b/sdk/js/src/token_bridge/__tests__/integration.ts index 0922dce96..c96237812 100644 --- a/sdk/js/src/token_bridge/__tests__/integration.ts +++ b/sdk/js/src/token_bridge/__tests__/integration.ts @@ -1,5 +1,3 @@ -import base32 from 'hi-base32'; - import { formatUnits, parseUnits } from "@ethersproject/units"; import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport"; import { describe, expect, jest, test } from "@jest/globals"; @@ -29,7 +27,7 @@ import algosdk, { waitForConfirmation, } from "algosdk"; import axios from "axios"; -import { BigNumber, utils, ethers } from "ethers"; +import { BigNumber, ethers, utils } from "ethers"; import { approveEth, attestFromAlgorand, @@ -731,17 +729,12 @@ describe("Integration Tests", () => { initialBalOnEth, 18 ); - console.log( - "Balance on Eth before transfer = ", - parseInt(initialBalOnEthStr) - ); // Get initial balance of ERC20 on Terra const originAssetHex = tryNativeToHexString(ERC20, CHAIN_ID_ETH); if (!originAssetHex) { throw new Error("originAssetHex is null"); } - console.log("ERC20 originAssetHex: ", originAssetHex); const foreignAsset = await getForeignAssetTerra( TERRA_TOKEN_BRIDGE_ADDRESS, lcd, @@ -751,7 +744,6 @@ describe("Integration Tests", () => { if (!foreignAsset) { throw new Error("foreignAsset is null"); } - console.log("ERC20 foreignAssetHex: ", foreignAsset); const tokenDefinition: any = await lcd.wasm.contractQuery( foreignAsset, { @@ -770,11 +762,7 @@ describe("Integration Tests", () => { cw20BalOnTerra.balance, tokenDefinition.decimals ); - let initialCW20BalOnTerra: number = parseInt(balAmount); - console.log( - "CW20 balance on Terra before transfer = ", - initialCW20BalOnTerra - ); + // let initialCW20BalOnTerra: number = parseInt(balAmount); // approve the bridge to spend tokens await approveEth( @@ -864,10 +852,6 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); let finalBalOnEthStr = ethers.utils.formatUnits(finalBalOnEth, 18); - console.log( - "Balance on Eth after transfer = ", - parseInt(finalBalOnEthStr) - ); expect( parseInt(initialBalOnEthStr) - parseInt(finalBalOnEthStr) ).toEqual(1); @@ -882,11 +866,7 @@ describe("Integration Tests", () => { cw20BalOnTerra.balance, tokenDefinition.decimals ); - let finalCW20BalOnTerra: number = parseInt(balAmount); - console.log( - "CW20 balance on Terra after transfer = ", - finalCW20BalOnTerra - ); + // let finalCW20BalOnTerra: number = parseInt(balAmount); provider.destroy(); done(); } catch (e) { @@ -1229,9 +1209,6 @@ describe("Integration Tests", () => { signedVaa ); } catch (e) { - console.log( - "createWrappedOnEth() failed. Trying updateWrappedOnEth()..." - ); success = false; } if (!success) { @@ -1264,11 +1241,9 @@ describe("Integration Tests", () => { // Get initial balance of luna on Terra const initialTerraBalance: number = await queryBalanceOnTerra(Asset); - console.log("Initial Terra balance of", Asset, initialTerraBalance); // Get initial balance of uusd on Terra - const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); - console.log("Initial Terra balance of", FeeAsset, initialFeeBalance); + // const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); // Get initial balance of wrapped luna on Eth const ETH_TEST_WALLET_PUBLIC_KEY = @@ -1300,10 +1275,6 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); const initialLunaBalOnEthInt = parseInt(initialLunaBalOnEth._hex); - console.log( - "Luna balance on Eth before transfer = ", - initialLunaBalOnEthInt - ); // Start transfer from Terra to Ethereum const hexStr = tryNativeToHexString( @@ -1345,7 +1316,6 @@ describe("Integration Tests", () => { fee: feeEstimate, }); const result = await lcd.tx.broadcast(executeTx); - console.log("Transfer gas used: ", result.gas_used); const info = await waitForTerraExecution(result.txhash); if (!info) { throw new Error("info not found"); @@ -1380,20 +1350,14 @@ describe("Integration Tests", () => { // Test finished. Check wallet balances // Get final balance of uluna on Terra const finalTerraBalance = await queryBalanceOnTerra(Asset); - console.log("Final Terra balance of", Asset, finalTerraBalance); // Get final balance of uusd on Terra - const finalFeeBalance: number = await queryBalanceOnTerra(FeeAsset); - console.log("Final Terra balance of", FeeAsset, finalFeeBalance); + // const finalFeeBalance: number = await queryBalanceOnTerra(FeeAsset); expect(initialTerraBalance - 1e6 === finalTerraBalance).toBe(true); const lunaBalOnEthAfter = await token.balanceOf( ETH_TEST_WALLET_PUBLIC_KEY ); const lunaBalOnEthAfterInt = parseInt(lunaBalOnEthAfter._hex); - console.log( - "Luna balance on Eth after transfer = ", - lunaBalOnEthAfterInt - ); expect(initialLunaBalOnEthInt + 1e6 === lunaBalOnEthAfterInt).toBe( true ); @@ -1418,7 +1382,6 @@ describe("Integration Tests", () => { }); const Asset: string = "uluna"; const initialTerraBalance: number = await queryBalanceOnTerra(Asset); - console.log("Terra balance before transfer = ", initialTerraBalance); const ETH_TEST_WALLET_PUBLIC_KEY = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"; const provider = new ethers.providers.WebSocketProvider( @@ -1446,10 +1409,6 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); const initialLunaBalOnEthInt = parseInt(initialLunaBalOnEth._hex); - console.log( - "Luna balance on Eth before transfer = ", - initialLunaBalOnEthInt - ); const Amount: string = "1000000"; // approve the bridge to spend tokens @@ -1470,7 +1429,6 @@ describe("Integration Tests", () => { CHAIN_ID_TERRA, tryNativeToUint8Array(wallet.key.accAddress, CHAIN_ID_TERRA) ); - console.log("Transfer gas used: ", receipt.gasUsed); // get the sequence from the logs (needed to fetch the vaa) const sequence = parseSequenceFromLogEth( @@ -1530,21 +1488,15 @@ describe("Integration Tests", () => { // Check wallet balances after const finalTerraBalance = await queryBalanceOnTerra(Asset); - console.log("Terra balance after transfer = ", finalTerraBalance); expect(initialTerraBalance + 1e6 === finalTerraBalance).toBe(true); const finalLunaBalOnEth = await token.balanceOf( ETH_TEST_WALLET_PUBLIC_KEY ); const finalLunaBalOnEthInt = parseInt(finalLunaBalOnEth._hex); - console.log( - "Luna balance on Eth after transfer = ", - finalLunaBalOnEthInt - ); expect(initialLunaBalOnEthInt - 1e6 === finalLunaBalOnEthInt).toBe( true ); - const uusdBal = await queryBalanceOnTerra("uusd"); - console.log("uusdBal = ", uusdBal); + // const uusdBal = await queryBalanceOnTerra("uusd"); } catch (e) { console.error("Transfer back failure: ", e); done("Transfer back Failure"); @@ -1635,9 +1587,6 @@ describe("Integration Tests", () => { signedVaa ); } catch (e) { - console.log( - "createWrappedOnEth() failed. Trying updateWrappedOnEth()..." - ); success = false; } if (!success) { @@ -1651,12 +1600,10 @@ describe("Integration Tests", () => { // Attestation is complete // Get initial balance of uusd on Terra - const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); - console.log("Initial Terra balance of", FeeAsset, initialFeeBalance); + // const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); // Get wallet on eth const originAssetHex = tryNativeToHexString(CW20, CHAIN_ID_TERRA); - console.log("CW20 originAssetHex: ", originAssetHex); if (!originAssetHex) { throw new Error("originAssetHex is null"); } @@ -1679,10 +1626,6 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); let initialCW20BalOnEthInt = parseInt(initialCW20BalOnEth._hex); - console.log( - "CW20 balance on Eth before transfer = ", - initialCW20BalOnEthInt - ); // Get initial balance of CW20 on Terra const tokenDefinition: any = await lcd.wasm.contractQuery(CW20, { @@ -1698,10 +1641,6 @@ describe("Integration Tests", () => { tokenDefinition.decimals ); let initialCW20BalOnTerra: number = parseInt(amount); - console.log( - "CW20 balance on Terra before transfer = ", - initialCW20BalOnTerra - ); const hexStr = tryNativeToHexString( ETH_TEST_WALLET_PUBLIC_KEY, CHAIN_ID_ETH @@ -1768,17 +1707,12 @@ describe("Integration Tests", () => { signedVaa ) ).toBe(true); - console.log("Finished transferring CW20 token to Ethereum"); // Check the wallet balances let finalCW20BalOnEth = await token.balanceOf( ETH_TEST_WALLET_PUBLIC_KEY ); let finalCW20BalOnEthInt = parseInt(finalCW20BalOnEth._hex); - console.log( - "CW20 balance on Eth after transfer = ", - finalCW20BalOnEthInt - ); expect(initialCW20BalOnEthInt + 1e6 === finalCW20BalOnEthInt).toBe( true ); @@ -1792,25 +1726,13 @@ describe("Integration Tests", () => { tokenDefinition.decimals ); let finalCW20BalOnTerra: number = parseInt(amount); - console.log( - "CW20 balance on Terra after transfer = ", - finalCW20BalOnTerra - ); expect(initialCW20BalOnTerra - finalCW20BalOnTerra === 1).toBe(true); // Done checking wallet balances // Start the reverse transfer from Ethereum back to Terra // Get initial wallet balances initialCW20BalOnTerra = finalCW20BalOnTerra; - console.log( - "CW20 balance on Terra before transfer = ", - initialCW20BalOnTerra - ); initialCW20BalOnEthInt = finalCW20BalOnEthInt; - console.log( - "CW20 balance on Eth before transfer = ", - initialCW20BalOnEthInt - ); // approve the bridge to spend tokens await approveEth( @@ -1829,7 +1751,6 @@ describe("Integration Tests", () => { CHAIN_ID_TERRA, tryNativeToUint8Array(wallet.key.accAddress, CHAIN_ID_TERRA) ); - console.log("Transfer gas used: ", receipt.gasUsed); // get the sequence from the logs (needed to fetch the vaa) sequence = parseSequenceFromLogEth(receipt, ETH_CORE_BRIDGE_ADDRESS); @@ -1887,10 +1808,6 @@ describe("Integration Tests", () => { // Check wallet balances after transfer back finalCW20BalOnEth = await token.balanceOf(ETH_TEST_WALLET_PUBLIC_KEY); finalCW20BalOnEthInt = parseInt(finalCW20BalOnEth._hex); - console.log( - "CW20 balance on Eth after transfer = ", - finalCW20BalOnEthInt - ); expect(initialCW20BalOnEthInt - 1e6 === finalCW20BalOnEthInt).toBe( true ); @@ -1904,10 +1821,6 @@ describe("Integration Tests", () => { tokenDefinition.decimals ); finalCW20BalOnTerra = parseInt(amount); - console.log( - "CW20 balance on Terra after transfer = ", - finalCW20BalOnTerra - ); expect(finalCW20BalOnTerra - initialCW20BalOnTerra === 1).toBe(true); // Done checking wallet balances } catch (e) { @@ -1923,21 +1836,16 @@ describe("Integration Tests", () => { test("Algorand transfer native ALGO to Eth and back again", (done) => { (async () => { try { - console.log("Starting attestation..."); const client: algosdk.Algodv2 = getAlgoClient(); const tempAccts: Account[] = await getTempAccounts(); const numAccts: number = tempAccts.length; expect(numAccts).toBeGreaterThan(0); const wallet: Account = tempAccts[0]; - let accountInfo = await client.accountInformation(wallet.addr).do(); - console.log("Account balance: %d microAlgos", accountInfo.amount); - + // let accountInfo = await client.accountInformation(wallet.addr).do(); // Asset Index of native ALGO is 0 const AlgoIndex = BigInt(0); - console.log("Testing attestFromAlgorand..."); - const b = await getBalances(client, wallet.addr); - console.log("balances", b); + // const b = await getBalances(client, wallet.addr); const txs = await attestFromAlgorand( client, TOKEN_BRIDGE_ID, @@ -1946,15 +1854,11 @@ describe("Integration Tests", () => { AlgoIndex ); - const result = await signSendAndConfirmAlgorand(client, txs, wallet); - console.log("txid of attest", txs[txs.length - 1].tx.txID(), Buffer.from(base32.decode.asBytes(txs[txs.length - 1].tx.txID())).toString("hex")); - const sn = parseSequenceFromLogAlgorand(result); // Now, try to send a NOP - console.log("Start of NOP..."); const suggParams: algosdk.SuggestedParams = await client .getTransactionParams() .do(); @@ -1968,12 +1872,9 @@ describe("Integration Tests", () => { const resp = await client .sendRawTransaction(nopTxn.signTxn(wallet.sk)) .do(); - console.log("resp", resp); - const response = await waitForConfirmation(client, resp.txId, 1); - console.log("End of NOP"); + await waitForConfirmation(client, resp.txId, 1); // End of NOP - console.log("Getting emitter address..."); const emitterAddr = getEmitterAddressAlgorand(TOKEN_BRIDGE_ID); const { vaaBytes } = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, @@ -1983,7 +1884,6 @@ describe("Integration Tests", () => { { transport: NodeHttpTransport() } ); const pvaa = _parseVAAAlgorand(vaaBytes); - console.log("VAA for createWrappedOnEth:", pvaa); const provider = new ethers.providers.WebSocketProvider( ETH_NODE_URL ) as any; @@ -1996,13 +1896,9 @@ describe("Integration Tests", () => { vaaBytes ); } catch (e) { - console.log( - "createWrappedOnEth() failed. Trying updateWrappedOnEth()..." - ); success = false; } if (!success) { - console.log("using updateWrappedOnEth..."); try { const cr = await updateWrappedOnEth( ETH_TOKEN_BRIDGE_ADDRESS, @@ -2014,20 +1910,12 @@ describe("Integration Tests", () => { console.error("failed to updateWrappedOnEth", e); } } - console.log("Attestation is complete..."); - console.log("Starting transfer to Eth..."); // Check wallet const a = parseInt(AlgoIndex.toString()); const originAssetHex = ( "0000000000000000000000000000000000000000000000000000000000000000" + a.toString(16) ).slice(-64); - console.log( - "calling getForeignAssetEth", - ETH_TOKEN_BRIDGE_ADDRESS, - CHAIN_ID_ALGORAND, - originAssetHex - ); const foreignAsset = await getForeignAssetEth( ETH_TOKEN_BRIDGE_ADDRESS, provider, @@ -2037,7 +1925,6 @@ describe("Integration Tests", () => { if (!foreignAsset) { throw new Error("foreignAsset is null"); } - console.log("foreignAsset", foreignAsset); let token = TokenImplementation__factory.connect( foreignAsset, signer @@ -2050,21 +1937,18 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); const initialBalOnEthInt = parseInt(initialBalOnEth._hex); - console.log("Balance on Eth before transfer = ", initialBalOnEthInt); // Get initial balance on Algorand let algoWalletBals: Map = await getBalances( client, wallet.addr ); - console.log("algoWalletBals:", algoWalletBals); const startingAlgoBal = algoWalletBals.get( safeBigIntToNumber(AlgoIndex) ); if (!startingAlgoBal) { throw new Error("startingAlgoBal is undefined"); } - console.log("startingAlgoBal", startingAlgoBal); // Start transfer from Algorand to Ethereum const hexStr = nativeToHexString( @@ -2074,10 +1958,8 @@ describe("Integration Tests", () => { if (!hexStr) { throw new Error("Failed to convert to hexStr"); } - console.log("hexStr", hexStr); const AmountToTransfer: number = 12300; const Fee: number = 0; - console.log("Calling transferFromAlgorand..."); const transferTxs = await transferFromAlgorand( client, TOKEN_BRIDGE_ID, @@ -2095,7 +1977,6 @@ describe("Integration Tests", () => { wallet ); const txSid = parseSequenceFromLogAlgorand(transferResult); - console.log("Getting signed VAA..."); const signedVaa = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ALGORAND, @@ -2103,16 +1984,12 @@ describe("Integration Tests", () => { txSid, { transport: NodeHttpTransport() } ); - console.log("About to redeemOnEth..."); - console.log("vaa", uint8ArrayToHex(signedVaa.vaaBytes)); const pv = _parseVAAAlgorand(signedVaa.vaaBytes); - console.log(pv); const roe = await redeemOnEth( ETH_TOKEN_BRIDGE_ADDRESS, signer, signedVaa.vaaBytes ); - console.log("Check if transfer is complete..."); expect( await getIsTransferCompletedEth( ETH_TOKEN_BRIDGE_ADDRESS, @@ -2125,51 +2002,30 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); const balOnEthAfterInt = parseInt(balOnEthAfter._hex); - console.log("Balance on Eth after transfer = ", balOnEthAfterInt); expect(balOnEthAfterInt - initialBalOnEthInt).toEqual( AmountToTransfer ); // Get final balance on Algorand algoWalletBals = await getBalances(client, wallet.addr); - console.log("algoWalletBals after:", algoWalletBals); const finalAlgoBal = algoWalletBals.get( safeBigIntToNumber(AlgoIndex) ); if (!finalAlgoBal) { throw new Error("finalAlgoBal is undefined"); } - console.log( - "startingAlgoBal", - startingAlgoBal, - "finalAlgoBal", - finalAlgoBal, - "AmountToTransfer", - AmountToTransfer - ); // expect(startingAlgoBal - finalAlgoBal).toBe(AmountToTransfer); // Attempt to transfer from Eth back to Algorand const Amount: string = "100"; // approve the bridge to spend tokens - console.log("About to approveEth..."); await approveEth( ETH_TOKEN_BRIDGE_ADDRESS, foreignAsset, signer, Amount ); - console.log( - "About to transferFromEth...", - ETH_TOKEN_BRIDGE_ADDRESS, - signer, - foreignAsset, - Amount, - CHAIN_ID_ALGORAND, - wallet.addr, - decodeAddress(wallet.addr) - ); const receipt = await transferFromEth( ETH_TOKEN_BRIDGE_ADDRESS, signer, @@ -2178,9 +2034,7 @@ describe("Integration Tests", () => { CHAIN_ID_ALGORAND, decodeAddress(wallet.addr).publicKey ); - console.log("receipt", receipt); // get the sequence from the logs (needed to fetch the vaa) - console.log("About to parseSeq..."); const sequence = parseSequenceFromLogEth( receipt, ETH_CORE_BRIDGE_ADDRESS @@ -2188,7 +2042,6 @@ describe("Integration Tests", () => { const emitterAddress = getEmitterAddressEth(ETH_TOKEN_BRIDGE_ADDRESS); // poll until the guardian(s) witness and sign the vaa - console.log("About to getSignedVAA..."); const { vaaBytes: signedVAA } = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ETH, @@ -2199,8 +2052,6 @@ describe("Integration Tests", () => { } ); algoWalletBals = await getBalances(client, wallet.addr); - console.log("algoWallet2Bals before:", algoWalletBals); - console.log("About to redeemOnAlgorand..."); const redeemTxs = await redeemOnAlgorand( client, TOKEN_BRIDGE_ID, @@ -2209,46 +2060,27 @@ describe("Integration Tests", () => { wallet.addr ); await signSendAndConfirmAlgorand(client, redeemTxs, wallet); - console.log("About to getIsTransferComplete..."); - const completed: boolean = await getIsTransferCompletedAlgorand( + const completed = await getIsTransferCompletedAlgorand( client, TOKEN_BRIDGE_ID, signedVAA ); - console.log("Checking wallets..."); - const newBal = await token.balanceOf(ETH_TEST_WALLET_PUBLIC_KEY); - const newBalInt = parseInt(newBal._hex); - console.log( - "newBalInt", - newBalInt, - "AmountToTransfer", - AmountToTransfer, - "Amount", - Amount - ); + expect(completed).toBe(true); + // const newBal = await token.balanceOf(ETH_TEST_WALLET_PUBLIC_KEY); + // const newBalInt = parseInt(newBal._hex); // expect(newBalInt).toBe(AmountToTransfer - parseInt(Amount)); // Get second final balance on Algorand algoWalletBals = await getBalances(client, wallet.addr); - console.log("algoWalletBals after after:", algoWalletBals); const secondFinalAlgoBal = algoWalletBals.get( safeBigIntToNumber(AlgoIndex) ); if (!secondFinalAlgoBal) { throw new Error("secondFinalAlgoBal is undefined"); } - console.log( - "secondFinalAlgoBal", - secondFinalAlgoBal, - "finalAlgoBal", - finalAlgoBal, - "Amount", - Amount - ); // expect(secondFinalAlgoBal - finalAlgoBal).toBe( // parseInt(Amount) * 100 // ); - console.log("algoWallet2Bals after:", algoWalletBals); provider.destroy(); } catch (e) { console.error("Algorand ALGO transfer error:", e); @@ -2261,20 +2093,15 @@ describe("Integration Tests", () => { test("Algorand create chuckNorium, transfer to Eth and back again", (done) => { (async () => { try { - console.log("Starting attestation..."); const client: algosdk.Algodv2 = getAlgoClient(); const tempAccts: Account[] = await getTempAccounts(); const numAccts: number = tempAccts.length; expect(numAccts).toBeGreaterThan(0); const wallet: Account = tempAccts[0]; - let accountInfo = await client.accountInformation(wallet.addr).do(); - console.log("Account balance: %d microAlgos", accountInfo.amount); + // let accountInfo = await client.accountInformation(wallet.addr).do(); - console.log("Creating fake asset..."); const assetIndex: number = await createAsset(wallet); - console.log("Newly created asset index =", assetIndex); - console.log("Testing attestFromAlgorand..."); const attestTxs = await attestFromAlgorand( client, TOKEN_BRIDGE_ID, @@ -2288,10 +2115,8 @@ describe("Integration Tests", () => { wallet ); const attestSn = parseSequenceFromLogAlgorand(attestResult); - console.log("attestSn", attestSn); // Now, try to send a NOP - console.log("Start of NOP..."); const suggParams: algosdk.SuggestedParams = await client .getTransactionParams() .do(); @@ -2305,12 +2130,9 @@ describe("Integration Tests", () => { const resp = await client .sendRawTransaction(nopTxn.signTxn(wallet.sk)) .do(); - console.log("resp", resp); - const response = await waitForConfirmation(client, resp.txId, 1); - console.log("End of NOP"); + await waitForConfirmation(client, resp.txId, 1); // End of NOP - console.log("Getting emitter address..."); const emitterAddr = getEmitterAddressAlgorand(TOKEN_BRIDGE_ID); const { vaaBytes } = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, @@ -2331,13 +2153,9 @@ describe("Integration Tests", () => { vaaBytes ); } catch (e) { - console.log( - "createWrappedOnEth() failed. Trying updateWrappedOnEth()..." - ); success = false; } if (!success) { - console.log("using updateWrappedOnEth..."); try { const cr = await updateWrappedOnEth( ETH_TOKEN_BRIDGE_ADDRESS, @@ -2351,26 +2169,12 @@ describe("Integration Tests", () => { return; } } - console.log("Attestation is complete..."); - console.log("Starting transfer to Eth..."); // Check wallet const a = parseInt(assetIndex.toString()); const originAssetHex = ( "0000000000000000000000000000000000000000000000000000000000000000" + a.toString(16) ).slice(-64); - console.log( - "assetIndex: ", - assetIndex, - ", originAssetHex:", - originAssetHex - ); - console.log( - "calling getForeignAssetEth", - ETH_TOKEN_BRIDGE_ADDRESS, - CHAIN_ID_ALGORAND, - originAssetHex - ); const foreignAsset = await getForeignAssetEth( ETH_TOKEN_BRIDGE_ADDRESS, provider, @@ -2380,7 +2184,6 @@ describe("Integration Tests", () => { if (!foreignAsset) { throw new Error("foreignAsset is null"); } - console.log("foreignAsset", foreignAsset); let token = TokenImplementation__factory.connect( foreignAsset, signer @@ -2389,23 +2192,20 @@ describe("Integration Tests", () => { // Get initial balance on ethereum const ETH_TEST_WALLET_PUBLIC_KEY = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"; - const initialBalOnEth = await token.balanceOf( - ETH_TEST_WALLET_PUBLIC_KEY - ); - const initialBalOnEthInt = parseInt(initialBalOnEth._hex); - console.log("Balance on Eth before transfer = ", initialBalOnEthInt); + // const initialBalOnEth = await token.balanceOf( + // ETH_TEST_WALLET_PUBLIC_KEY + // ); + // const initialBalOnEthInt = parseInt(initialBalOnEth._hex); // Get initial balance on Algorand let algoWalletBals: Map = await getBalances( client, wallet.addr ); - console.log("algoWalletBals:", algoWalletBals); const startingAlgoBal = algoWalletBals.get(assetIndex); if (!startingAlgoBal) { throw new Error("startingAlgoBal is undefined"); } - console.log("startingAlgoBal", startingAlgoBal); // Start transfer from Algorand to Ethereum const hexStr = nativeToHexString( @@ -2415,10 +2215,8 @@ describe("Integration Tests", () => { if (!hexStr) { throw new Error("Failed to convert to hexStr"); } - console.log("hexStr", hexStr); const AmountToTransfer: number = 12300; const Fee: number = 0; - console.log("Calling transferFromAlgorand..."); const transferTxs = await transferFromAlgorand( client, TOKEN_BRIDGE_ID, @@ -2436,7 +2234,6 @@ describe("Integration Tests", () => { wallet ); const txSid = parseSequenceFromLogAlgorand(transferResult); - console.log("Getting signed VAA..."); const signedVaa = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ALGORAND, @@ -2444,14 +2241,11 @@ describe("Integration Tests", () => { txSid, { transport: NodeHttpTransport() } ); - console.log("About to redeemOnEth..."); - console.log("vaa", uint8ArrayToHex(signedVaa.vaaBytes)); - const roe = await redeemOnEth( + await redeemOnEth( ETH_TOKEN_BRIDGE_ADDRESS, signer, signedVaa.vaaBytes ); - console.log("Check if transfer is complete..."); expect( await getIsTransferCompletedEth( ETH_TOKEN_BRIDGE_ADDRESS, @@ -2464,41 +2258,27 @@ describe("Integration Tests", () => { ETH_TEST_WALLET_PUBLIC_KEY ); const balOnEthAfterInt = parseInt(balOnEthAfter._hex); - console.log("Balance on Eth after transfer = ", balOnEthAfterInt); const FinalAmt: number = AmountToTransfer / 100; expect(balOnEthAfterInt).toEqual(FinalAmt); // Get final balance on Algorand algoWalletBals = await getBalances(client, wallet.addr); - console.log("algoWalletBals after:", algoWalletBals); const finalAlgoBal = algoWalletBals.get(assetIndex); if (!finalAlgoBal) { throw new Error("finalAlgoBal is undefined"); } - console.log("finalAlgoBal", finalAlgoBal); expect(startingAlgoBal - finalAlgoBal).toBe(AmountToTransfer); // Attempt to transfer from Eth back to Algorand const Amount: string = "100"; // approve the bridge to spend tokens - console.log("About to approveEth..."); await approveEth( ETH_TOKEN_BRIDGE_ADDRESS, foreignAsset, signer, Amount ); - console.log( - "About to transferFromEth...", - ETH_TOKEN_BRIDGE_ADDRESS, - signer, - foreignAsset, - Amount, - CHAIN_ID_ALGORAND, - wallet.addr, - decodeAddress(wallet.addr) - ); const receipt = await transferFromEth( ETH_TOKEN_BRIDGE_ADDRESS, signer, @@ -2507,9 +2287,7 @@ describe("Integration Tests", () => { CHAIN_ID_ALGORAND, decodeAddress(wallet.addr).publicKey ); - console.log("receipt", receipt); // get the sequence from the logs (needed to fetch the vaa) - console.log("About to parseSeq..."); const sequence = parseSequenceFromLogEth( receipt, ETH_CORE_BRIDGE_ADDRESS @@ -2517,7 +2295,6 @@ describe("Integration Tests", () => { const emitterAddress = getEmitterAddressEth(ETH_TOKEN_BRIDGE_ADDRESS); // poll until the guardian(s) witness and sign the vaa - console.log("About to getSignedVAA..."); const { vaaBytes: signedVAA } = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ETH, @@ -2527,7 +2304,6 @@ describe("Integration Tests", () => { transport: NodeHttpTransport(), } ); - console.log("About to redeemOnAlgorand..."); const redeemTxs = await redeemOnAlgorand( client, TOKEN_BRIDGE_ID, @@ -2536,26 +2312,22 @@ describe("Integration Tests", () => { wallet.addr ); await signSendAndConfirmAlgorand(client, redeemTxs, wallet); - console.log("About to getIsTransferComplete..."); - const completed: boolean = await getIsTransferCompletedAlgorand( + const completed = await getIsTransferCompletedAlgorand( client, TOKEN_BRIDGE_ID, signedVAA ); - console.log("Checking wallets..."); + expect(completed).toBe(true); const newBal = await token.balanceOf(ETH_TEST_WALLET_PUBLIC_KEY); const newBalInt = parseInt(newBal._hex); - console.log("newBalInt", newBalInt); expect(newBalInt).toBe(FinalAmt - parseInt(Amount)); // Get second final balance on Algorand algoWalletBals = await getBalances(client, wallet.addr); - console.log("algoWalletBals after after:", algoWalletBals); const secondFinalAlgoBal = algoWalletBals.get(assetIndex); if (!secondFinalAlgoBal) { throw new Error("secondFinalAlgoBal is undefined"); } - console.log("secondFinalAlgoBal", secondFinalAlgoBal); expect(secondFinalAlgoBal - finalAlgoBal).toBe( parseInt(Amount) * 100 ); @@ -2571,7 +2343,6 @@ describe("Integration Tests", () => { test("Transfer wrapped Luna from Terra to Algorand and back again", (done) => { (async () => { try { - console.log("Starting attestation..."); const tbAddr: string = getApplicationAddress(TOKEN_BRIDGE_ID); const decTbAddr: Uint8Array = decodeAddress(tbAddr).publicKey; const aa: string = uint8ArrayToHex(decTbAddr); @@ -2638,7 +2409,6 @@ describe("Integration Tests", () => { attestSn, emitterAddress ); - console.log("About to createWrappedOnAlgorand...", attestSignedVaa); const createWrappedTxs = await createWrappedOnAlgorand( client, TOKEN_BRIDGE_ID, @@ -2657,7 +2427,6 @@ describe("Integration Tests", () => { TOKEN_BRIDGE_ID, attestSignedVaa ); - console.log("assetIdCreated", assetIdCreated); if (!assetIdCreated) { throw new Error("Failed to create asset"); } @@ -2665,11 +2434,9 @@ describe("Integration Tests", () => { // Start of transfer from Terra to Algorand // Get initial balance of luna on Terra const initialTerraBalance: number = await queryBalanceOnTerra(Asset); - console.log("Initial Terra balance of", Asset, initialTerraBalance); // Get initial balance of uusd on Terra - const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); - console.log("Initial Terra balance of", FeeAsset, initialFeeBalance); + // const initialFeeBalance: number = await queryBalanceOnTerra(FeeAsset); // Get initial balance of wrapped luna on Algorand const originAssetHex = nativeToHexString(Asset, CHAIN_ID_TERRA); @@ -2679,19 +2446,16 @@ describe("Integration Tests", () => { // TODO: Get wallet balance on Algorand // Get Balances - console.log("aa", tbAddr, decTbAddr, aa); const tbBals: Map = await getBalances( client, algoWallet.addr // "TPFKQBOR7RJ475XW6XMOZMSMBCZH6WNGFQNT7CM7NL2UMBCMBIU5PVBGPM" ); - console.log("bals:", tbBals, assetIdCreated); let assetIdCreatedBegBal: number = 0; const tempBal = tbBals.get(safeBigIntToNumber(assetIdCreated)); if (tempBal) { assetIdCreatedBegBal = tempBal; } - console.log("assetIdCreatedBegBal", assetIdCreatedBegBal); // Start transfer from Terra to Algorand const txMsgs = await transferFromTerra( @@ -2710,7 +2474,6 @@ describe("Integration Tests", () => { fee: feeEstimate, }); const txResult = await lcd.tx.broadcast(executeTx); - console.log("Transfer gas used: ", txResult.gas_used); const txInfo = await waitForTerraExecution(txResult.txhash); if (!txInfo) { throw new Error("info not found"); @@ -2748,24 +2511,20 @@ describe("Integration Tests", () => { client, algoWallet.addr ); - console.log("algoWallet bals:", bals); let assetIdCreatedEndBal: number = 0; const tmpBal = bals.get(safeBigIntToNumber(assetIdCreated)); if (tmpBal) { assetIdCreatedEndBal = tmpBal; } - console.log("assetIdCreatedEndBal", assetIdCreatedEndBal); expect(assetIdCreatedEndBal - assetIdCreatedBegBal).toBe( parseInt(Amount) ); // Get final balance of uluna on Terra const finalTerraBalance = await queryBalanceOnTerra(Asset); - console.log("Final Terra balance of", Asset, finalTerraBalance); // Get final balance of uusd on Terra - const finalFeeBalance: number = await queryBalanceOnTerra(FeeAsset); - console.log("Final Terra balance of", FeeAsset, finalFeeBalance); + // const finalFeeBalance: number = await queryBalanceOnTerra(FeeAsset); expect(initialTerraBalance - 1e6 === finalTerraBalance).toBe(true); // Start of transfer back to Terra @@ -2780,7 +2539,6 @@ describe("Integration Tests", () => { throw new Error("Failed to convert to hexStr"); } const Fee: number = 0; - console.log("Calling transferFromAlgorand..."); const transferTxs = await transferFromAlgorand( client, TOKEN_BRIDGE_ID, @@ -2798,7 +2556,6 @@ describe("Integration Tests", () => { algoWallet ); const txSid = parseSequenceFromLogAlgorand(transferResult); - console.log("Getting signed VAA..."); const signedVaa = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ALGORAND, @@ -2806,8 +2563,6 @@ describe("Integration Tests", () => { txSid, { transport: NodeHttpTransport() } ); - console.log("vaa", uint8ArrayToHex(signedVaa.vaaBytes)); - console.log("About to redeemOnTerra..."); const redeemMsg = await redeemOnTerra( TERRA_TOKEN_BRIDGE_ADDRESS, @@ -2846,13 +2601,7 @@ describe("Integration Tests", () => { ).toBe(true); // Check wallet balances after - console.log("Checking wallet balances after transfer..."); const finalLunaOnTerraBalance = await queryBalanceOnTerra(Asset); - console.log( - "Terra balance after transfer = ", - finalLunaOnTerraBalance, - finalTerraBalance - ); expect(finalLunaOnTerraBalance - finalTerraBalance).toBe( TransferBackAmount ); @@ -2860,21 +2609,14 @@ describe("Integration Tests", () => { client, algoWallet.addr ); - console.log("algoWallet bals:", retBals); let assetIdCreatedFinBal: number = 0; const tBal = retBals.get(safeBigIntToNumber(assetIdCreated)); if (tBal) { assetIdCreatedFinBal = tBal; } - console.log( - "assetIdCreatedFinBal", - assetIdCreatedFinBal, - assetIdCreatedEndBal - ); expect(assetIdCreatedEndBal - assetIdCreatedFinBal).toBe( TransferBackAmount ); - console.log("TESTING getOriginalAssetAlgorand...."); const info: WormholeWrappedInfo = await getOriginalAssetAlgorand( client, TOKEN_BRIDGE_ID, @@ -2892,7 +2634,6 @@ describe("Integration Tests", () => { test("Testing relay type redeem", (done) => { (async () => { try { - console.log("Starting new test of transferring ETH to algorand."); const client: algosdk.Algodv2 = getAlgoClient(); const tempAccts: Account[] = await getTempAccounts(); const numAccts: number = tempAccts.length; @@ -2911,34 +2652,23 @@ describe("Integration Tests", () => { BigInt(0) ); expect(relayerWalletBalance).toBeGreaterThan(0); - console.log("algoWallet", algoWallet.addr, algoWalletBalance); - console.log( - "relayerWallet", - relayerWallet.addr, - relayerWalletBalance - ); // ETH setup to transfer LUNA to Algorand // create a signer for Eth const provider = new ethers.providers.WebSocketProvider(ETH_NODE_URL); - console.log("here"); const signer = new ethers.Wallet(ETH_PRIVATE_KEY, provider); - console.log("here"); // attest the test token const receipt = await attestFromEth( ETH_TOKEN_BRIDGE_ADDRESS, signer, TEST_ERC20 ); - console.log("here"); // get the sequence from the logs (needed to fetch the vaa) const sequence = parseSequenceFromLogEth( receipt, ETH_CORE_BRIDGE_ADDRESS ); - console.log("here"); const emitterAddress = getEmitterAddressEth(ETH_TOKEN_BRIDGE_ADDRESS); - console.log("here"); // poll until the guardian(s) witness and sign the vaa const { vaaBytes: signedVAA } = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, @@ -2949,7 +2679,6 @@ describe("Integration Tests", () => { transport: NodeHttpTransport(), } ); - console.log("About to createWrappedOnAlgorand..."); const createWrappedTxs = await createWrappedOnAlgorand( client, TOKEN_BRIDGE_ID, @@ -2971,15 +2700,6 @@ describe("Integration Tests", () => { if (!assetIdCreated) { throw new Error("Failed to create asset"); } - console.log("assetIdCreated", assetIdCreated); - console.log( - "algoWallet balance:", - await getBalance(client, algoWallet.addr, assetIdCreated) - ); - console.log( - "relayerWallet balance:", - await getBalance(client, relayerWallet.addr, assetIdCreated) - ); // Start of transfer from ETH to Algorand // approve the bridge to spend tokens @@ -3019,7 +2739,6 @@ describe("Integration Tests", () => { } ); - console.log("about to redeemOnAlgorand..."); // Redeem half the amount on Algorand const firstHalfRedeemTxs = await redeemOnAlgorand( client, @@ -3065,7 +2784,6 @@ describe("Integration Tests", () => { } ); - console.log("about to redeemOnAlgorand second half..."); // Redeem second half the amount on Algorand const redeemTxs = await redeemOnAlgorand( client, @@ -3082,7 +2800,6 @@ describe("Integration Tests", () => { secondHalfVaa ) ).toBe(true); - console.log("Destroying the provider..."); provider.destroy(); } catch (e) { console.error("new test error:", e); @@ -3096,7 +2813,6 @@ describe("Integration Tests", () => { test("testing algorand payload3", (done) => { (async () => { try { - console.log("Starting new test of transferring ETH to algorand."); const tbAddr: string = getApplicationAddress(TOKEN_BRIDGE_ID); const decTbAddr: Uint8Array = decodeAddress(tbAddr).publicKey; const aa: string = uint8ArrayToHex(decTbAddr); @@ -3109,8 +2825,9 @@ describe("Integration Tests", () => { const Fee: number = 0; var testapp: number = 8; - var dest = utils.hexZeroPad(BigNumber.from(testapp).toHexString(), 32).substring(2); - console.log("Dest address: ", dest); + var dest = utils + .hexZeroPad(BigNumber.from(testapp).toHexString(), 32) + .substring(2); const transferTxs = await transferFromAlgorand( client, @@ -3131,7 +2848,6 @@ describe("Integration Tests", () => { algoWallet ); const txSid = parseSequenceFromLogAlgorand(transferResult); - console.log("Getting signed VAA..."); const signedVaa = await getSignedVAAWithRetry( WORMHOLE_RPC_HOSTS, CHAIN_ID_ALGORAND, @@ -3139,8 +2855,6 @@ describe("Integration Tests", () => { txSid, { transport: NodeHttpTransport() } ); - console.log("payload3 vaa", uint8ArrayToHex(signedVaa.vaaBytes)); - console.log("About to send back into algorand..."); const txns = await redeemOnAlgorand( client, @@ -3149,19 +2863,14 @@ describe("Integration Tests", () => { signedVaa.vaaBytes, algoWallet.addr ); - console.log("signSendAndConfirm..."); - - const wbefore = await getBalance(client, getApplicationAddress(testapp), BigInt(0)); - console.log( - "test app wallet before:", - wbefore + + const wbefore = await getBalance( + client, + getApplicationAddress(testapp), + BigInt(0) ); - await signSendAndConfirmAlgorand( - client, - txns, - algoWallet - ); + await signSendAndConfirmAlgorand(client, txns, algoWallet); expect( await getIsTransferCompletedAlgorand( client, @@ -3169,14 +2878,13 @@ describe("Integration Tests", () => { signedVaa.vaaBytes ) ).toBe(true); - const wafter = await getBalance(client, getApplicationAddress(testapp), BigInt(0)); - console.log( - "test app wallet after:", - wafter + const wafter = await getBalance( + client, + getApplicationAddress(testapp), + BigInt(0) ); expect(BigInt(wafter - wbefore) === BigInt(100)); - console.log("payload3 sent..."); } catch (e) { console.error("new test error:", e); done("new test error"); diff --git a/sdk/js/src/token_bridge/getIsTransferCompleted.ts b/sdk/js/src/token_bridge/getIsTransferCompleted.ts index bddf90923..fe289af25 100644 --- a/sdk/js/src/token_bridge/getIsTransferCompleted.ts +++ b/sdk/js/src/token_bridge/getIsTransferCompleted.ts @@ -142,10 +142,10 @@ export async function getIsTransferCompletedAlgorand( appId: bigint, signedVAA: Uint8Array ): Promise { - const parsedVAA: Map = _parseVAAAlgorand(signedVAA); - const seq: bigint = parsedVAA.get("sequence"); - const chainRaw: string = parsedVAA.get("chainRaw"); // this needs to be a hex string - const em: string = parsedVAA.get("emitter"); // this needs to be a hex string + const parsedVAA = _parseVAAAlgorand(signedVAA); + const seq: bigint = parsedVAA.sequence; + const chainRaw: string = parsedVAA.chainRaw; // this needs to be a hex string + const em: string = parsedVAA.emitter; // this needs to be a hex string const { doesExist, lsa } = await calcLogicSigAccount( client, appId,