135 lines
4.0 KiB
TypeScript
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();
|