Skip to content

Commit

Permalink
Merge pull request #3938 from osmosis-labs/stage
Browse files Browse the repository at this point in the history
Publish Stage
  • Loading branch information
JoseRFelix authored Nov 12, 2024
2 parents f0f6095 + cfd4d7a commit 341b8c8
Show file tree
Hide file tree
Showing 76 changed files with 2,734 additions and 1,496 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/monitoring-limit-geo-e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:

fe-limit-eu-tests:
timeout-minutes: 12
name: prod-fe-trade-eu-tests
name: prod-fe-limit-eu-tests
needs: fe-trade-eu-tests
runs-on: macos-latest
steps:
Expand Down Expand Up @@ -118,7 +118,7 @@ jobs:
USE_TEST_PROXY: "use"
run: |
cd packages/web
npx playwright test monitoring.market --timeout 180000
npx playwright test monitoring.market --timeout 90000
- name: upload monitoring test results
if: failure()
id: monitoring-test-results
Expand Down Expand Up @@ -155,7 +155,7 @@ jobs:
PRIVATE_KEY: ${{ secrets.TEST_PRIVATE_KEY_3 }}
run: |
cd packages/web
npx playwright test monitoring.market --timeout 180000
npx playwright test monitoring.market --timeout 90000
- name: upload monitoring test results
if: failure()
id: monitoring-test-results
Expand Down
65 changes: 50 additions & 15 deletions packages/bridge/src/axelar/__tests__/axelar-transfer-status.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
import { rest } from "msw";

import { server } from "../../__tests__/msw";
import { BridgeEnvironment, TransferStatusReceiver } from "../../interface";
import {
BridgeEnvironment,
TransferStatusReceiver,
TxSnapshot,
} from "../../interface";
import { TransferStatus } from "../queries";
import { AxelarTransferStatusProvider } from "../transfer-status";

Expand Down Expand Up @@ -35,6 +39,43 @@ describe("AxelarTransferStatusProvider", () => {
receiveNewTxStatus: jest.fn(),
};

const testSnapshot: TxSnapshot = {
direction: "deposit",
createdAtUnix: Date.now(),
type: "bridge-transfer",
provider: "Axelar",
fromAddress: "fromAddress",
toAddress: "toAddress",
osmoBech32Address: "osmoAddress",
fromAsset: {
amount: "100",
denom: "denom",
imageUrl: "imageUrl",
address: "address",
decimals: 6,
},
toAsset: {
amount: "100",
denom: "denom",
imageUrl: "imageUrl",
address: "address",
decimals: 6,
},
status: "pending",
sendTxHash: "testTxHash",
fromChain: {
prettyName: "Chain A",
chainId: 1,
chainType: "evm",
},
toChain: {
prettyName: "Chain B",
chainId: 2,
chainType: "evm",
},
estimatedArrivalUnix: Date.now() + 1000,
};

beforeEach(() => {
provider = new AxelarTransferStatusProvider("mainnet" as BridgeEnvironment);
provider.statusReceiverDelegate = mockReceiver;
Expand All @@ -46,7 +87,7 @@ describe("AxelarTransferStatusProvider", () => {
});

it("should generate correct explorer URL", () => {
const url = provider.makeExplorerUrl("testTxHash");
const url = provider.makeExplorerUrl(testSnapshot);
expect(url).toBe("https://axelarscan.io/transfer/testTxHash");
});

Expand All @@ -62,10 +103,10 @@ describe("AxelarTransferStatusProvider", () => {
)
);

await provider.trackTxStatus("testTxHash");
await provider.trackTxStatus(testSnapshot);

expect(mockReceiver.receiveNewTxStatus).toHaveBeenCalledWith(
"AxelartestTxHash",
"testTxHash",
"success",
undefined
);
Expand Down Expand Up @@ -100,10 +141,10 @@ describe("AxelarTransferStatusProvider", () => {
)
);

await provider.trackTxStatus("testTxHash");
await provider.trackTxStatus(testSnapshot);

expect(mockReceiver.receiveNewTxStatus).toHaveBeenCalledWith(
"AxelartestTxHash",
"testTxHash",
"failed",
"insufficientFee"
);
Expand Down Expand Up @@ -162,10 +203,10 @@ describe("AxelarTransferStatusProvider", () => {
)
);

await provider.trackTxStatus("testTxHash");
await provider.trackTxStatus(testSnapshot);

expect(mockReceiver.receiveNewTxStatus).toHaveBeenCalledWith(
"AxelartestTxHash",
"testTxHash",
"failed",
undefined
);
Expand All @@ -181,14 +222,8 @@ describe("AxelarTransferStatusProvider", () => {
)
);

await provider.trackTxStatus("testTxHash");
await provider.trackTxStatus(testSnapshot);

expect(mockReceiver.receiveNewTxStatus).not.toHaveBeenCalled();
});

it("should generate correct explorer URL with serialized params", () => {
const serializedParams = JSON.stringify({ sendTxHash: "testTxHash" });
const url = provider.makeExplorerUrl(serializedParams);
expect(url).toBe("https://axelarscan.io/transfer/testTxHash");
});
});
32 changes: 14 additions & 18 deletions packages/bridge/src/axelar/transfer-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ import { poll } from "@osmosis-labs/utils";
import type {
BridgeEnvironment,
BridgeTransferStatus,
GetTransferStatusParams,
TransferStatusProvider,
TransferStatusReceiver,
TxSnapshot,
} from "../interface";
import { AxelarBridgeProvider } from ".";
import { getTransferStatus } from "./queries";

/** Tracks (polls Axelar endpoint) and reports status updates on Axelar bridge transfers. */
export class AxelarTransferStatusProvider implements TransferStatusProvider {
readonly keyPrefix = AxelarBridgeProvider.ID;
readonly providerId = AxelarBridgeProvider.ID;
readonly sourceDisplayName = "Axelar Bridge";
public statusReceiverDelegate?: TransferStatusReceiver;

Expand All @@ -31,13 +31,8 @@ export class AxelarTransferStatusProvider implements TransferStatusProvider {
}

/** Request to start polling a new transaction. */
async trackTxStatus(serializedParamsOrHash: string): Promise<void> {
const sendTxHash = serializedParamsOrHash.startsWith("{")
? (JSON.parse(serializedParamsOrHash) as GetTransferStatusParams)
.sendTxHash
: serializedParamsOrHash;

const snapshotKey = `${this.keyPrefix}${serializedParamsOrHash}`;
async trackTxStatus(snapshot: TxSnapshot): Promise<void> {
const { sendTxHash } = snapshot;

await poll({
fn: async () => {
Expand Down Expand Up @@ -101,30 +96,31 @@ export class AxelarTransferStatusProvider implements TransferStatusProvider {
maxAttempts: undefined, // unlimited attempts while tab is open or until success/fail
})
.then((s) => {
if (s) this.receiveConclusiveStatus(snapshotKey, s);
if (s) this.receiveConclusiveStatus(sendTxHash, s);
})
.catch((e) => console.error(`Polling Axelar has failed`, e));
}

receiveConclusiveStatus(
key: string,
sendTxHash: string,
txStatus: BridgeTransferStatus | undefined
): void {
if (txStatus && txStatus.id) {
const { status, reason } = txStatus;
this.statusReceiverDelegate?.receiveNewTxStatus(key, status, reason);
this.statusReceiverDelegate?.receiveNewTxStatus(
sendTxHash,
status,
reason
);
} else {
console.error(
"Axelar transfer finished poll but neither succeeded or failed"
);
}
}

makeExplorerUrl(serializedParamsOrKey: string): string {
const txHash = serializedParamsOrKey.startsWith("{")
? (JSON.parse(serializedParamsOrKey) as GetTransferStatusParams)
.sendTxHash
: serializedParamsOrKey;
return `${this.axelarScanBaseUrl}/transfer/${txHash}`;
makeExplorerUrl(snapshot: TxSnapshot): string {
const { sendTxHash } = snapshot;
return `${this.axelarScanBaseUrl}/transfer/${sendTxHash}`;
}
}
Loading

0 comments on commit 341b8c8

Please sign in to comment.