wormhole/near/test/deposit.ts

135 lines
4.0 KiB
TypeScript

const sha256 = require("js-sha256");
const fs = require("fs").promises;
const assert = require("assert").strict;
const fetch = require("node-fetch");
const elliptic = require("elliptic");
const web3Utils = require("web3-utils");
const BN = require("bn.js");
import { formatUnits, parseUnits } from "@ethersproject/units";
import { zeroPad } from "@ethersproject/bytes";
import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport";
const { parseSeedPhrase, generateSeedPhrase } = require("near-seed-phrase");
import {
CHAIN_ID_NEAR,
CHAIN_ID_ETH,
hexToUint8Array,
} from "@certusone/wormhole-sdk/lib/cjs/utils";
export const WORMHOLE_RPC_HOSTS = [
"https://wormhole-v2-mainnet-api.certus.one",
"https://wormhole.inotel.ro",
"https://wormhole-v2-mainnet-api.mcf.rocks",
"https://wormhole-v2-mainnet-api.chainlayer.network",
"https://wormhole-v2-mainnet-api.staking.fund",
"https://wormhole-v2-mainnet.01node.com",
];
// It is SUPER SUPER important to use the near-api-js that comes from inside wormhole-sdk or all heck breaks lose
import {
connect as nearConnect,
keyStores as nearKeyStores,
utils as nearUtils,
Account as nearAccount,
providers as nearProviders,
} from "@certusone/wormhole-sdk/node_modules/near-api-js";
import {
CONTRACTS,
attestNearFromNear,
attestTokenFromNear,
createWrappedOnNear,
getForeignAssetNear,
getIsTransferCompletedNear,
getIsWrappedAssetNear,
getOriginalAssetNear,
getSignedVAAWithRetry,
redeemOnNear,
transferFromEth,
transferNearFromNear,
transferTokenFromNear,
getEmitterAddressEth,
parseSequenceFromLogEth,
} from "@certusone/wormhole-sdk";
const sdk = require("@certusone/wormhole-sdk");
const { ethers } = require("ethers");
async function transferTest() {
let provider = new ethers.providers.JsonRpcProvider(
"https://rpc.ankr.com/eth"
);
let signer = new ethers.Wallet(process.env.ETH_PK, provider);
let bridge = sdk.Bridge__factory.connect(
"0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
signer
);
let nearNodeUrl = "https://rpc.mainnet.near.org";
let portalAccount = "contract.portalbridge.near";
let networkId = "mainnet";
// There are many kinds of keystores... in this case, I am using a InMemory one
let userKeys = parseSeedPhrase(process.env.NEAR_KEYS);
let userKey = nearUtils.KeyPair.fromString(userKeys["secretKey"]);
let keyStore = new nearKeyStores.InMemoryKeyStore();
keyStore.setKey(networkId, process.env.NEAR_ACCOUNT as string, userKey);
// connect to near...
let near = await nearConnect({
headers: {},
keyStore,
networkId: networkId as string,
nodeUrl: nearNodeUrl as string,
});
console.log(process.env.NEAR_ACCOUNT as string);
// rpc handle
const userAccount = new nearAccount(
near.connection,
process.env.NEAR_ACCOUNT as string
);
// So, near can have account names up to 64 bytes but wormhole can only have 32...
// as a result, we have to hash our account names to sha256's.. What we are doing
// here is doing a RPC call (does not require any interaction with the wallet and is free)
// that both tells us our account hash AND if we are already registered...
let account_hash = await userAccount.viewFunction(
portalAccount,
"hash_account",
{
account: userAccount.accountId,
}
);
console.log(account_hash);
let myAddress = account_hash[1];
if (!account_hash[0]) {
console.log("Registering the receiving account");
let myAddress2 = nearProviders.getTransactionLastResult(
await userAccount.functionCall({
contractId: portalAccount,
methodName: "register_account",
args: { account: process.env.NEAR_ACCOUNT as string },
gas: new BN("100000000000000"),
attachedDeposit: new BN("2000000000000000000000"), // 0.002 NEAR
})
);
console.log("account hash returned: " + myAddress2);
} else {
console.log("account already registered");
}
// like this
await redeemOnNear(userAccount, token_bridge, hexToUint8Array(trans));
}
transferTest();