"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var wormhole_sdk_1 = require("@certusone/wormhole-sdk"); var wasm_1 = require("@certusone/wormhole-sdk/lib/cjs/solana/wasm"); var address_1 = require("@ethersproject/address"); var units_1 = require("@ethersproject/units"); var ethers_1 = require("ethers"); var fs = require("fs"); var process_1 = require("process"); var SimpleDex__factory_1 = require("../ethers-contracts/abi/factories/SimpleDex__factory"); var consts_1 = require("./consts"); var commonWorkflows_1 = require("@certusone/wormhole-examples/lib/commonWorkflows"); wasm_1.setDefaultWasm("node"); //This script is reliant on core examples, and the wormhole SDK. //It is meant to be run against a fresh devnet / tilt environment. function getPrice(chain) { if (chain === wormhole_sdk_1.CHAIN_ID_ETH) { return 4400; } if (chain === wormhole_sdk_1.CHAIN_ID_BSC) { return 630; } } function main() { return __awaiter(this, void 0, void 0, function () { var _a, ethAddress, wbnbOnEth, bscAddress, wethOnBsc; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, configWormhole()]; case 1: _b.sent(); return [4 /*yield*/, seedPools()]; case 2: _a = _b.sent(), ethAddress = _a.ethAddress, wbnbOnEth = _a.wbnbOnEth, bscAddress = _a.bscAddress, wethOnBsc = _a.wethOnBsc; console.log("Pools seeded"); return [4 /*yield*/, createSwapPoolFile(ethAddress, wbnbOnEth, bscAddress, wethOnBsc)]; case 3: _b.sent(); console.log("Job done"); return [2 /*return*/, Promise.resolve()]; } }); }); } function configWormhole() { return __awaiter(this, void 0, void 0, function () { var basisTransferAmount, WETH; return __generator(this, function (_a) { switch (_a.label) { case 0: basisTransferAmount = "1"; WETH = "0xDDb64fE46a91D46ee29420539FC25FD07c5FEa3E"; console.log("Doing WETH Attest"); return [4 /*yield*/, commonWorkflows_1.fullAttestation(wormhole_sdk_1.CHAIN_ID_ETH, address_1.getAddress(WETH))]; case 1: _a.sent(); console.log("Doing WBNB Attest"); return [4 /*yield*/, commonWorkflows_1.fullAttestation(wormhole_sdk_1.CHAIN_ID_BSC, address_1.getAddress(WETH))]; case 2: _a.sent(); console.log("Bridging over WETH to bsc"); return [4 /*yield*/, commonWorkflows_1.basicTransfer(wormhole_sdk_1.CHAIN_ID_ETH, basisTransferAmount, wormhole_sdk_1.CHAIN_ID_BSC, consts_1.ETH_TEST_WALLET_PUBLIC_KEY, consts_1.ETH_TEST_WALLET_PUBLIC_KEY, true)]; case 3: _a.sent(); console.log("Bridging over WBNB to eth"); return [4 /*yield*/, commonWorkflows_1.basicTransfer(wormhole_sdk_1.CHAIN_ID_BSC, basisTransferAmount, wormhole_sdk_1.CHAIN_ID_ETH, consts_1.ETH_TEST_WALLET_PUBLIC_KEY, consts_1.ETH_TEST_WALLET_PUBLIC_KEY, true)]; case 4: _a.sent(); return [2 /*return*/]; } }); }); } function createSwapPoolFile(ethAddress, wbnbAddress, bscAddress, wethAddress) { return __awaiter(this, void 0, void 0, function () { var literal, content; var _a, _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: literal = (_a = {}, _a[wormhole_sdk_1.CHAIN_ID_ETH] = (_b = {}, _b[wormhole_sdk_1.CHAIN_ID_BSC] = { poolAddress: ethAddress, tokenAddress: wbnbAddress }, _b), _a[wormhole_sdk_1.CHAIN_ID_BSC] = (_c = {}, _c[wormhole_sdk_1.CHAIN_ID_ETH] = { poolAddress: bscAddress, tokenAddress: wethAddress }, _c), _a); content = JSON.stringify(literal); //TODO not this return [4 /*yield*/, fs.writeFileSync("../react/src/swapPools.json", content, { flag: "w+", })]; case 1: //TODO not this _d.sent(); return [2 /*return*/]; } }); }); } //TODO, in a for loop for all the EVM chains var seedPools = function () { return __awaiter(void 0, void 0, void 0, function () { var ethSigner, bscSigner, currentEthPrice, currentSolPrice, ratio, ethBasis, bnbBasis, WETH, wbnbOnEth, wethOnBsc, contractInterface, bytecode, ethfactory, contract, ethAddress, bscfactory, bscContract, bscAddress, ethDex, bscDex, ethInit, bscInit, ethLiq, bscLiq; return __generator(this, function (_a) { switch (_a.label) { case 0: ethSigner = consts_1.getSignerForChain(wormhole_sdk_1.CHAIN_ID_ETH); bscSigner = consts_1.getSignerForChain(wormhole_sdk_1.CHAIN_ID_BSC); currentEthPrice = getPrice(wormhole_sdk_1.CHAIN_ID_ETH); currentSolPrice = getPrice(wormhole_sdk_1.CHAIN_ID_BSC); ratio = currentEthPrice / currentSolPrice; ethBasis = 0.01; bnbBasis = Math.ceil(ethBasis * ratio); WETH = "0xDDb64fE46a91D46ee29420539FC25FD07c5FEa3E"; return [4 /*yield*/, wormhole_sdk_1.getForeignAssetEth(consts_1.getTokenBridgeAddressForChain(wormhole_sdk_1.CHAIN_ID_ETH), ethSigner.provider, wormhole_sdk_1.CHAIN_ID_BSC, wormhole_sdk_1.hexToUint8Array(wormhole_sdk_1.nativeToHexString(WETH, wormhole_sdk_1.CHAIN_ID_BSC)))]; case 1: wbnbOnEth = _a.sent(); console.log("WBNB on ETH address", wbnbOnEth); return [4 /*yield*/, wormhole_sdk_1.getForeignAssetEth(consts_1.getTokenBridgeAddressForChain(wormhole_sdk_1.CHAIN_ID_BSC), bscSigner.provider, wormhole_sdk_1.CHAIN_ID_ETH, wormhole_sdk_1.hexToUint8Array(wormhole_sdk_1.nativeToHexString(WETH, wormhole_sdk_1.CHAIN_ID_ETH)))]; case 2: wethOnBsc = _a.sent(); console.log("WETH on BSC address", wethOnBsc); console.log("about to deploy ETH contract"); contractInterface = SimpleDex__factory_1.SimpleDex__factory.createInterface(); bytecode = SimpleDex__factory_1.SimpleDex__factory.bytecode; ethfactory = new ethers_1.ethers.ContractFactory(contractInterface, bytecode, ethSigner); return [4 /*yield*/, ethfactory.deploy(address_1.getAddress(wbnbOnEth))]; case 3: contract = _a.sent(); return [4 /*yield*/, contract.deployed().then(function (result) { console.log("Successfully deployed contract at " + result.address); return result.address; }, function (error) { console.error(error); process_1.exit(1); })]; case 4: ethAddress = _a.sent(); console.log("about to deploy bsc contract"); bscfactory = new ethers_1.ethers.ContractFactory(contractInterface, bytecode, bscSigner); return [4 /*yield*/, bscfactory.deploy(address_1.getAddress(wethOnBsc))]; case 5: bscContract = _a.sent(); return [4 /*yield*/, bscContract.deployed().then(function (result) { console.log("Successfully deployed contract at " + result.address); return result.address; }, function (error) { console.error(error); process_1.exit(1); })]; case 6: bscAddress = _a.sent(); console.log("Doing WBNB on ETH Approve"); return [4 /*yield*/, wormhole_sdk_1.approveEth(ethAddress, address_1.getAddress(wbnbOnEth), ethSigner, "10000000000000000000000")]; case 7: _a.sent(); console.log("Doing WETH on BSC Approve"); return [4 /*yield*/, wormhole_sdk_1.approveEth(bscAddress, address_1.getAddress(wethOnBsc), bscSigner, "10000000000000000000000")]; case 8: _a.sent(); ethDex = SimpleDex__factory_1.SimpleDex__factory.connect(ethAddress, ethSigner); bscDex = SimpleDex__factory_1.SimpleDex__factory.connect(bscAddress, bscSigner); console.log("Initializing eth pool"); return [4 /*yield*/, ethDex.init(units_1.parseUnits(bnbBasis.toString(), 18), { value: units_1.parseUnits(ethBasis.toString(), 18), gasLimit: 500000, })]; case 9: ethInit = _a.sent(); return [4 /*yield*/, ethInit.wait()]; case 10: _a.sent(); console.log("Initializing bsc pool"); return [4 /*yield*/, bscDex.init(units_1.parseUnits(ethBasis.toString(), 18), { value: units_1.parseUnits(bnbBasis.toString(), 18), gasLimit: 500000, })]; case 11: bscInit = _a.sent(); return [4 /*yield*/, bscInit.wait()]; case 12: _a.sent(); console.log("pools initialized"); return [4 /*yield*/, ethDex.totalLiquidity()]; case 13: ethLiq = _a.sent(); console.log("Eth liquidity", ethLiq); return [4 /*yield*/, bscDex.totalLiquidity()]; case 14: bscLiq = _a.sent(); console.log("bsc liquidity", bscLiq); //Pool should now be seeded with a small amount of ETH and Wormhole-Wrapped SOL. return [2 /*return*/, { ethAddress: ethAddress, wbnbOnEth: wbnbOnEth, bscAddress: bscAddress, wethOnBsc: wethOnBsc }]; } }); }); }; var done = false; main().then(function () { return (done = true); }, function (error) { console.error(error); done = true; }); function wait() { if (!done) { setTimeout(wait, 1000); } else { process_1.exit(0); } } wait();