Compare commits

...

4 Commits

Author SHA1 Message Date
Bruce Riley 8ce03171cc Clean up error handling for terra relay 2022-02-02 18:46:33 +00:00
Karl Kempe 3555c22f2b Merge branch 'cross-chain-swap' of github.com:certusone/wormhole-nativeswap-example into terra-support 2022-02-02 16:39:41 +00:00
Karl Kempe 1977bbede0 Modify swap-with-vaa 2022-02-02 16:39:34 +00:00
Kevin Peters 344574ef99 UI - Updated warning message, link rels 2022-01-31 23:41:36 +00:00
4 changed files with 418 additions and 567 deletions

View File

@ -22,7 +22,7 @@ import { makeProvider } from "./src/provider";
require("dotenv").config({ path: ".env" }); require("dotenv").config({ path: ".env" });
// swap related parameters (configurable in UI) // swap related parameters (configurable in UI)
const SWAP_AMOUNT_IN_MATIC = "0.0069"; const SWAP_AMOUNT_IN_MATIC = "0.069";
const SWAP_AMOUNT_IN_ETH = "0.000907"; const SWAP_AMOUNT_IN_ETH = "0.000907";
const SWAP_AMOUNT_IN_AVAX = "0.0075"; const SWAP_AMOUNT_IN_AVAX = "0.0075";
const SWAP_AMOUNT_IN_BNB = "0.0015"; const SWAP_AMOUNT_IN_BNB = "0.0015";
@ -243,12 +243,12 @@ async function swapEverythingExactIn(
// do the dst swap after fetching vaa // do the dst swap after fetching vaa
// connect dst wallet // connect dst wallet
const dstWallet = determineWalletFromToken(tokenOutAddress); //const dstWallet = determineWalletFromToken(tokenOutAddress);
console.info("fetchVaaAndSwap"); //console.info("fetchVaaAndSwap");
//const dstSwapReceipt = await swapper.fetchVaaAndSwap(dstWallet); //const dstSwapReceipt = await swapper.fetchVaaAndSwap(dstWallet);
//console.info(`dst transaction: ${dstSwapReceipt.transactionHash}`); //console.info(`dst transaction: ${dstSwapReceipt.transactionHash}`);
console.warn("jk"); //console.warn("jk");
return; return;
} }
@ -412,8 +412,8 @@ async function main() {
const tokenOut = getTokenInfo(args.out); const tokenOut = getTokenInfo(args.out);
//const tokenOut = UST_TOKEN_INFO; //const tokenOut = UST_TOKEN_INFO;
const recipientAddress = "0x4e2dfAD7D7d0076b5A0A41223E4Bee390C33251C"; //const recipientAddress = "0x4e2dfAD7D7d0076b5A0A41223E4Bee390C33251C";
//const recipientAddress = "terra1vewnsxcy5fqjslyyy409cw8js550esen38n8ey"; const recipientAddress = "terra1vewnsxcy5fqjslyyy409cw8js550esen38n8ey";
if (testExactIn) { if (testExactIn) {
console.info(`testing exact in. native=${isNative}`); console.info(`testing exact in. native=${isNative}`);
@ -427,7 +427,7 @@ async function main() {
determineAmountFromToken(tokenIn.address), determineAmountFromToken(tokenIn.address),
recipientAddress recipientAddress
); );
/*
if (tokenOut.address === UST_TOKEN_INFO.address) { if (tokenOut.address === UST_TOKEN_INFO.address) {
console.warn("not pinging back"); console.warn("not pinging back");
} else { } else {
@ -441,6 +441,7 @@ async function main() {
recipientAddress recipientAddress
); );
} }
*/
} else { } else {
console.info(`testing exact out. native=${isNative}`); console.info(`testing exact out. native=${isNative}`);

View File

@ -576,18 +576,24 @@ export default function Home() {
<Typography variant="subtitle1">{relayerTimeoutString}</Typography> <Typography variant="subtitle1">{relayerTimeoutString}</Typography>
)} )}
<Typography variant="subtitle2" color="error"> <Typography variant="subtitle2" color="error">
WARNING: this is a testnet release only WARNING: this is a testnet release only, prices may not reflect
reality
</Typography> </Typography>
</Paper> </Paper>
<div className={classes.spacer} /> <div className={classes.spacer} />
<Footer /> <Footer />
<Link href="https://goerli-faucet.slock.it/" <Link
target="_blank" style={{ margin: "5px" }}> href="https://goerli-faucet.slock.it/"
target="_blank"
rel="noopener noreferrer"
style={{ margin: "5px" }}
>
Goerli Faucet Goerli Faucet
</Link> </Link>
<Link <Link
href="https://faucet.polygon.technology/" href="https://faucet.polygon.technology/"
target="_blank" target="_blank"
rel="noopener noreferrer"
style={{ margin: "5px" }} style={{ margin: "5px" }}
> >
Mumbai Faucet Mumbai Faucet
@ -595,6 +601,7 @@ export default function Home() {
<Link <Link
href="https://faucet.avax-test.network/" href="https://faucet.avax-test.network/"
target="_blank" target="_blank"
rel="noopener noreferrer"
style={{ margin: "5px" }} style={{ margin: "5px" }}
> >
Fuji Faucet Fuji Faucet
@ -602,6 +609,7 @@ export default function Home() {
<Link <Link
href="https://testnet.binance.org/faucet-smart/" href="https://testnet.binance.org/faucet-smart/"
target="_blank" target="_blank"
rel="noopener noreferrer"
style={{ margin: "5px" }} style={{ margin: "5px" }}
> >
BSC Faucet BSC Faucet
@ -609,6 +617,7 @@ export default function Home() {
<Link <Link
href="https://github.com/certusone/wormhole-nativeswap-example/" href="https://github.com/certusone/wormhole-nativeswap-example/"
target="_blank" target="_blank"
rel="noopener noreferrer"
style={{ margin: "5px" }} style={{ margin: "5px" }}
> >
NativeSwap GitHub NativeSwap GitHub

File diff suppressed because it is too large Load Diff

View File

@ -167,26 +167,6 @@ export async function relayVaaToTerra(
) { ) {
if (!terraContractData) return; if (!terraContractData) return;
// logger.debug(
// "relayVaaToTerra: checking if already redeemed using tokenBridgeAddress [" +
// terraContractData.tokenBridgeAddress +
// "]"
// );
// if (await isRedeemedOnTerra(terraContractData, vaaBytes)) {
// logger.info(
// "relayVaaToTerra: srcChain: " +
// t3Payload.sourceChainId +
// ", targetChain: " +
// t3Payload.targetChainId +
// ", contract: [" +
// t3Payload.contractAddress +
// "]: completed: already redeemed"
// );
// return;
// }
try { try {
logger.debug( logger.debug(
"relayVaaToTerra: creating message using contract address [" + "relayVaaToTerra: creating message using contract address [" +
@ -241,6 +221,34 @@ export async function relayVaaToTerra(
const receipt = await terraContractData.lcdClient.tx.broadcast(tx); const receipt = await terraContractData.lcdClient.tx.broadcast(tx);
if (!receipt.txhash) {
logger.info(
"relayVaaToTerra: srcChain: " +
t3Payload.sourceChainId +
", targetChain: " +
t3Payload.targetChainId +
", contract: [" +
t3Payload.contractAddress +
"]: completed: failed, no txhash: %o",
receipt
);
}
if (receipt.raw_log && receipt.raw_log.search("VaaAlreadyExecuted") >= 0) {
logger.info(
"relayVaaToTerra: srcChain: " +
t3Payload.sourceChainId +
", targetChain: " +
t3Payload.targetChainId +
", contract: [" +
t3Payload.contractAddress +
"]: completed: success: already executed, txhash: " +
receipt.txhash
);
return;
}
logger.info( logger.info(
"relayVaaToTerra: srcChain: " + "relayVaaToTerra: srcChain: " +
t3Payload.sourceChainId + t3Payload.sourceChainId +
@ -248,31 +256,10 @@ export async function relayVaaToTerra(
t3Payload.targetChainId + t3Payload.targetChainId +
", contract: [" + ", contract: [" +
t3Payload.contractAddress + t3Payload.contractAddress +
"]: completed: success: %o", "]: completed: success: txhash: " +
receipt receipt.txhash
); );
// logger.info(
// "relayVaaToTerra: contract: [" +
// t3Payload.contractAddress +
// "]: success, txHash: " +
// receipt.transactionHash
// );
} catch (e: any) { } catch (e: any) {
// if (await isRedeemedOnTerra(terraContractData, vaaBytes)) {
// logger.info(
// "relayVaaToTerra: srcChain: " +
// t3Payload.sourceChainId +
// ", targetChain: " +
// t3Payload.targetChainId +
// ", contract: [" +
// t3Payload.contractAddress +
// "]: completed: relay failed because the vaa has already been redeemed"
// );
// return;
// }
logger.error( logger.error(
"relayVaaToTerra: srcChain: " + "relayVaaToTerra: srcChain: " +
t3Payload.sourceChainId + t3Payload.sourceChainId +
@ -284,74 +271,4 @@ export async function relayVaaToTerra(
e e
); );
} }
// if (await isRedeemedOnTerra(terraContractData, vaaBytes)) {
// logger.info(
// "relayVaaToTerra: srcChain: " +
// t3Payload.sourceChainId +
// ", targetChain: " +
// t3Payload.targetChainId +
// ", contract: [" +
// t3Payload.contractAddress +
// "]: redeem confirmed"
// );
// } else {
// logger.error(
// "relayVaaToTerra: srcChain: " +
// t3Payload.sourceChainId +
// ", targetChain: " +
// t3Payload.targetChainId +
// ", contract: [" +
// t3Payload.contractAddress +
// "]: completed: failed to confirm redeem!"
// );
// }
}
async function isRedeemedOnTerra(
terraContractData: TerraContractData,
vaaBytes: string
): Promise<boolean> {
let msg: Terra.MsgExecuteContract = null;
let sequenceNumber: number = 0;
try {
msg = new Terra.MsgExecuteContract(
terraContractData.wallet.key.accAddress,
terraContractData.tokenBridgeAddress,
{
submit_vaa: {
data: Buffer.from(vaaBytes, "hex").toString("base64"),
},
}
);
sequenceNumber = await terraContractData.wallet.sequence();
} catch (e) {
logger.error(
"isRedeemedOnTerra: failed to create message or look up sequence number, e: %o",
e
);
return false;
}
try {
await terraContractData.lcdClient.tx.estimateFee(
[{ sequenceNumber: sequenceNumber }],
{
msgs: [msg],
}
);
} catch (e) {
if (e.response.data.error.includes("VaaAlreadyExecuted")) {
return true;
}
logger.error(
"isRedeemedOnTerra: failed to check if transfer is already complete, e: %o",
e
);
}
return false;
} }