From 465916c3f8185300485f2f05314a45748c64077d Mon Sep 17 00:00:00 2001 From: Csongor Kiss Date: Wed, 29 Jun 2022 19:31:22 +0100 Subject: [PATCH] clients/js: Add support for AttestMeta commit-id:67ad91cc --- clients/js/evm.ts | 4 + clients/js/main.ts | 2 +- .../token-bridge-attestation-1.expected | 27 +++++++ .../token-bridge-attestation-1.test | 1 + clients/js/solana.ts | 4 + clients/js/terra.ts | 6 +- clients/js/vaa.ts | 75 +++++++++++++++++++ 7 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 clients/js/parse_tests/token-bridge-attestation-1.expected create mode 100644 clients/js/parse_tests/token-bridge-attestation-1.test diff --git a/clients/js/evm.ts b/clients/js/evm.ts index 70cf439fc..827d06128 100644 --- a/clients/js/evm.ts +++ b/clients/js/evm.ts @@ -247,6 +247,10 @@ export async function execute_evm( console.log("Completing transfer") console.log("Hash: " + (await tb.completeTransfer(vaa, overrides)).hash) break + case "AttestMeta": + console.log("Creating wrapped token") + console.log("Hash: " + (await tb.createWrapped(vaa, overrides)).hash) + break case "TransferWithPayload": console.log("Completing transfer with payload") console.log("Hash: " + (await tb.completeTransferWithPayload(vaa, overrides)).hash) diff --git a/clients/js/main.ts b/clients/js/main.ts index b0c6a0db3..965b2b1f3 100644 --- a/clients/js/main.ts +++ b/clients/js/main.ts @@ -144,7 +144,7 @@ yargs(hideBin(process.argv)) | "Core" | "NFTBridge" | "TokenBridge"; - let payload: Payload = { + let payload: vaa.ContractUpgrade = { module, type: "ContractUpgrade", chain: toChainId(argv["chain"]), diff --git a/clients/js/parse_tests/token-bridge-attestation-1.expected b/clients/js/parse_tests/token-bridge-attestation-1.expected new file mode 100644 index 000000000..f6e208c79 --- /dev/null +++ b/clients/js/parse_tests/token-bridge-attestation-1.expected @@ -0,0 +1,27 @@ +{ + version: 1, + guardianSetIndex: 0, + signatures: [ + { + guardianSetIndex: 0, + signature: '6cd3cdd701bbd878eb403f6505b5b797544eb9c486dadf79f0c445e9b8fa5cd474de1683e3a80f7e22dbfacd53b0ddc7b040ff6f974aafe7a6571c9355b8129b00' + } + ], + timestamp: 0, + nonce: 2095245887, + emitterChain: 1, + emitterAddress: '0x95f83a27e90c622a98c037353f271fd8f5f57b4dc18ebf5ff75a934724bd0491', + sequence: 11833801757748136510n, + consistencyLevel: 32, + payload: { + module: 'TokenBridge', + chain: 0, + type: 'AttestMeta', + tokenAddress: '0x000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + tokenChain: 2, + decimals: 18, + symbol: 'WETH', + name: 'Wrapped ether' + }, + digest: '0x4bb52b9a44ff6062ba5db1c47afc40c186f7485c8972b1c6261eb070ce0b1c6e' +} diff --git a/clients/js/parse_tests/token-bridge-attestation-1.test b/clients/js/parse_tests/token-bridge-attestation-1.test new file mode 100644 index 000000000..36820e40c --- /dev/null +++ b/clients/js/parse_tests/token-bridge-attestation-1.test @@ -0,0 +1 @@ +010000000001006cd3cdd701bbd878eb403f6505b5b797544eb9c486dadf79f0c445e9b8fa5cd474de1683e3a80f7e22dbfacd53b0ddc7b040ff6f974aafe7a6571c9355b8129b00000000007ce2ea3f000195f83a27e90c622a98c037353f271fd8f5f57b4dc18ebf5ff75a934724bd0491a43a1c0020f88a3e2002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200021200000000000000000000000000000000000000000000000000000000574554480000000000000000000000000000000000000057726170706564206574686572 diff --git a/clients/js/solana.ts b/clients/js/solana.ts index e80190dca..90e91fe99 100644 --- a/clients/js/solana.ts +++ b/clients/js/solana.ts @@ -71,6 +71,10 @@ export async function execute_solana( ix = token_bridge.complete_transfer_wrapped_ix(token_bridge_id.toString(), bridge_id.toString(), from.publicKey.toString(), vaa) } break + case "AttestMeta": + console.log("Creating wrapped token") + ix = token_bridge.create_wrapped_ix(token_bridge_id.toString(), bridge_id.toString(), from.publicKey.toString(), vaa) + break case "TransferWithPayload": throw Error("Can't complete payload 3 transfer from CLI") default: diff --git a/clients/js/terra.ts b/clients/js/terra.ts index 30b650ec4..71d0410ad 100644 --- a/clients/js/terra.ts +++ b/clients/js/terra.ts @@ -93,9 +93,11 @@ export async function execute_terra( case "Transfer": console.log("Completing transfer"); break; - case "TransferWithPayload": - console.log("Completing transfer"); + case "AttestMeta": + console.log("Creating wrapped token"); break; + case "TransferWithPayload": + throw Error("Can't complete payload 3 transfer from CLI") default: impossible(payload) break diff --git a/clients/js/vaa.ts b/clients/js/vaa.ts index 3b5ca39b9..7fd57984e 100644 --- a/clients/js/vaa.ts +++ b/clients/js/vaa.ts @@ -62,8 +62,14 @@ export type Payload = | PortalRegisterChain<"NFTBridge"> | TokenBridgeTransfer | TokenBridgeTransferWithPayload + | TokenBridgeAttestMeta // TODO: add other types of payloads +export type ContractUpgrade = + CoreContractUpgrade + | PortalContractUpgrade<"TokenBridge"> + | PortalContractUpgrade<"NFTBridge"> + export function parse(buffer: Buffer): VAA { const vaa = parseEnvelope(buffer) const parser = guardianSetUpgradeParser @@ -74,6 +80,7 @@ export function parse(buffer: Buffer): VAA { .or(portalRegisterChainParser("NFTBridge")) .or(tokenBridgeTransferParser()) .or(tokenBridgeTransferWithPayloadParser()) + .or(tokenBridgeAttestMetaParser()) const payload = parser.parse(vaa.payload) var myVAA = { ...vaa, payload } @@ -200,6 +207,9 @@ function vaaBody(vaa: VAA) { case "TransferWithPayload": payload_str = serialiseTokenBridgeTransferWithPayload(payload) break + case "AttestMeta": + payload_str = serialiseTokenBridgeAttestMeta(payload) + break default: impossible(payload) break @@ -440,6 +450,7 @@ function serialisePortalRegisterChain { + return new P(new Parser() + .endianess("big") + .string("module", { + length: (_) => 0, + formatter: (_) => "TokenBridge" + }) + .string("chain", { + length: (_) => 0, + formatter: (_) => 0 + }) + .uint8("type", { + assert: 2, + formatter: (_action) => "AttestMeta" + }) + .array("tokenAddress", { + type: "uint8", + lengthInBytes: 32, + formatter: (arr) => "0x" + Buffer.from(arr).toString("hex") + }) + .uint16("tokenChain") + .uint8("decimals") + .array("symbol", { + type: "uint8", + lengthInBytes: 32, + formatter: (arr: Uint8Array) => Buffer.from(arr).toString("utf8", arr.findIndex((val) => val != 0)) + }) + .array("name", { + type: "uint8", + lengthInBytes: 32, + formatter: (arr: Uint8Array) => Buffer.from(arr).toString("utf8", arr.findIndex((val) => val != 0)) + }) + .string("end", { + greedy: true, + assert: str => str === "" + }) + ) +} + +function serialiseTokenBridgeAttestMeta(payload: TokenBridgeAttestMeta): string { + const body = [ + encode("uint8", 2), + encode("bytes32", hex(payload.tokenAddress)), + encode("uint16", payload.tokenChain), + encode("uint8", payload.decimals), + encode("bytes32", encodeString(payload.symbol)), + encode("bytes32", encodeString(payload.name)), + ] + return body.join("") +} + +// payload 3 export interface TokenBridgeTransferWithPayload { module: "TokenBridge" type: "TransferWithPayload"