clients/js - initial algorand commit (#1445)

* clients/js - initial algorand commit

* clients/js: fix merge issue
This commit is contained in:
Paul Noel 2022-08-22 14:39:39 +00:00 committed by GitHub
parent cf5c390fc6
commit 639bd3c682
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 152 additions and 21 deletions

124
clients/js/algorand.ts Normal file
View File

@ -0,0 +1,124 @@
import { CONTRACTS } from "@certusone/wormhole-sdk";
import { NETWORKS } from "./networks";
import { impossible, Payload } from "./vaa";
import { Account, Algodv2, mnemonicToSecretKey } from "algosdk";
import {
signSendAndConfirmAlgorand,
_submitVAAAlgorand,
} from "@certusone/wormhole-sdk/lib/cjs/algorand";
export async function execute_algorand(
payload: Payload,
vaa: Uint8Array,
environment: "MAINNET" | "TESTNET" | "DEVNET"
) {
const chainName = "algorand";
let n = NETWORKS[environment][chainName];
if (!n.key) {
throw Error(`No ${environment} key defined for Algorand`);
}
if (!n.rpc) {
throw Error(`No ${environment} rpc defined for Algorand`);
}
let contracts = CONTRACTS[environment][chainName];
console.log("contracts", contracts);
const ALGORAND_HOST = {
algodToken: "",
algodServer: n.rpc,
algodPort: "",
};
if (environment === "DEVNET") {
ALGORAND_HOST.algodToken =
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
ALGORAND_HOST.algodPort = "4001";
}
let target_contract: string;
switch (payload.module) {
case "Core":
target_contract = contracts.core;
switch (payload.type) {
case "GuardianSetUpgrade":
console.log("Submitting new guardian set");
break;
case "ContractUpgrade":
console.log("Upgrading core contract");
break;
default:
impossible(payload);
}
break;
case "NFTBridge":
if (contracts.nft_bridge === undefined) {
// NOTE: this code can safely be removed once the algorand NFT bridge is
// released, but it's fine for it to stay, as the condition will just be
// skipped once 'contracts.nft_bridge' is defined
throw new Error("NFT bridge not supported yet for terra");
}
target_contract = contracts.nft_bridge;
switch (payload.type) {
case "ContractUpgrade":
console.log("Upgrading contract");
break;
case "RegisterChain":
console.log("Registering chain");
break;
case "Transfer":
console.log("Completing transfer");
break;
default:
impossible(payload);
}
break;
case "TokenBridge":
if (contracts.token_bridge === undefined) {
throw new Error("contracts.token_bridge is undefined");
}
target_contract = contracts.token_bridge;
switch (payload.type) {
case "ContractUpgrade":
console.log("Upgrading contract");
break;
case "RegisterChain":
console.log("Registering chain");
break;
case "Transfer":
console.log("Completing transfer");
break;
case "AttestMeta":
console.log("Creating wrapped token");
break;
case "TransferWithPayload":
throw Error("Can't complete payload 3 transfer from CLI");
default:
impossible(payload);
break;
}
break;
default:
target_contract = impossible(payload);
}
const target = BigInt(parseInt(target_contract));
const CORE_ID = BigInt(parseInt(contracts.core));
const algodClient = new Algodv2(
ALGORAND_HOST.algodToken,
ALGORAND_HOST.algodServer,
ALGORAND_HOST.algodPort
);
const algoWallet: Account = mnemonicToSecretKey(n.key);
// Create transaction
const txs = await _submitVAAAlgorand(
algodClient,
target,
CORE_ID,
vaa,
algoWallet.addr
);
// Sign and send transaction
const result = await signSendAndConfirmAlgorand(algodClient, txs, algoWallet);
console.log("Confirmed in round:", result["confirmed-round"]);
}

View File

@ -34,6 +34,7 @@ import {
import { ethers } from "ethers";
import { NETWORKS } from "./networks";
import base58 from "bs58";
import { execute_algorand } from "./algorand";
setDefaultWasm("node");
@ -609,7 +610,11 @@ yargs(hideBin(process.argv))
} else if (chain === "solana" || chain === "pythnet") {
await execute_solana(parsed_vaa, buf, network, chain);
} else if (chain === "algorand") {
throw Error("Algorand is not supported yet");
await execute_algorand(
parsed_vaa.payload,
hexToUint8Array(vaa_hex),
network
);
} else if (chain === "near") {
await execute_near(parsed_vaa.payload, vaa_hex, network);
} else if (chain === "injective") {

View File

@ -47,8 +47,8 @@ const MAINNET = {
key: get_env_var("ETH_KEY"),
},
algorand: {
rpc: undefined,
key: undefined,
rpc: "https://mainnet-api.algonode.cloud",
key: get_env_var("ALGORAND_KEY"),
},
oasis: {
rpc: "https://emerald.oasis.dev/",
@ -174,8 +174,8 @@ const TESTNET = {
key: get_env_var("ETH_KEY_TESTNET"),
},
algorand: {
rpc: undefined,
key: undefined,
rpc: "https://testnet-api.algonode.cloud",
key: get_env_var("ALGORAND_KEY_TESTNET"),
},
fantom: {
rpc: "https://rpc.testnet.fantom.network",
@ -297,8 +297,8 @@ const DEVNET = {
key: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",
},
algorand: {
rpc: undefined,
key: undefined,
rpc: "http://localhost",
key: get_env_var("ALGORAND_KEY_DEVNET"),
},
fantom: {
rpc: undefined,
@ -338,14 +338,6 @@ const DEVNET = {
rpc: undefined,
key: undefined,
},
aptos: {
rpc: undefined,
key: undefined,
},
sui: {
rpc: undefined,
key: undefined,
},
pythnet: {
rpc: undefined,
key: undefined,
@ -354,6 +346,14 @@ const DEVNET = {
rpc: undefined,
key: undefined,
},
aptos: {
rpc: undefined,
key: undefined,
},
sui: {
rpc: undefined,
key: undefined,
},
moonbeam: {
rpc: undefined,
key: "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d",

View File

@ -13,6 +13,7 @@
"@cosmjs/encoding": "^0.26.2",
"@solana/web3.js": "^1.22.0",
"@terra-money/terra.js": "^3.1.3",
"algosdk": "^1.15.0",
"axios": "^0.24.0",
"binary-parser": "^2.0.2",
"bn.js": "^5.2.0",
@ -2201,9 +2202,9 @@
}
},
"node_modules/algosdk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.17.0.tgz",
"integrity": "sha512-WwHbZV03tZ2C/VLOapWOzJImm4lokav9HXnPLqbGrXyb8Gn/Q2AsoKMbOxd6MTzWguhaXU4Yk0VtbFlYhkaeoA==",
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.15.0.tgz",
"integrity": "sha512-541JhpsmtIh9WcEHBrRsIJhmI8IXsMan0VtCHRfZ1GvWS8CjqafqJUXxDa2kgyZx3wdm/pKin5+gt7HcmfOuaQ==",
"dependencies": {
"algo-msgpack-with-bigint": "^2.1.1",
"buffer": "^6.0.2",
@ -12301,9 +12302,9 @@
"integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ=="
},
"algosdk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.17.0.tgz",
"integrity": "sha512-WwHbZV03tZ2C/VLOapWOzJImm4lokav9HXnPLqbGrXyb8Gn/Q2AsoKMbOxd6MTzWguhaXU4Yk0VtbFlYhkaeoA==",
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.15.0.tgz",
"integrity": "sha512-541JhpsmtIh9WcEHBrRsIJhmI8IXsMan0VtCHRfZ1GvWS8CjqafqJUXxDa2kgyZx3wdm/pKin5+gt7HcmfOuaQ==",
"requires": {
"algo-msgpack-with-bigint": "^2.1.1",
"buffer": "^6.0.2",

View File

@ -7,6 +7,7 @@
"@cosmjs/encoding": "^0.26.2",
"@solana/web3.js": "^1.22.0",
"@terra-money/terra.js": "^3.1.3",
"algosdk": "^1.15.0",
"axios": "^0.24.0",
"binary-parser": "^2.0.2",
"bn.js": "^5.2.0",