Skip to content

Commit 990afeb

Browse files
committed
start replacing matching engine calls
1 parent d1e071f commit 990afeb

File tree

4 files changed

+164
-133
lines changed

4 files changed

+164
-133
lines changed

evm/ts/src/protocol/matchingEngine.ts

+28-45
Original file line numberDiff line numberDiff line change
@@ -32,96 +32,79 @@ export class EvmMatchingEngine<N extends Network, C extends EvmChains>
3232
) {
3333
super(provider, contracts.matchingEngine, contracts.cctp.tokenMessenger);
3434
}
35-
registerRouter<RC extends Chain>(
36-
sender: AccountAddress<C>,
35+
async *registerRouter<RC extends Chain>(
36+
sender: AnyEvmAddress,
3737
chain: RC,
3838
cctpDomain: number,
3939
router: AccountAddress<RC>,
4040
tokenAccount?: AccountAddress<C> | undefined,
41-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
41+
) {
4242
throw new Error("Method not implemented.");
4343
}
44-
updateRouter<RC extends Chain>(
45-
sender: AccountAddress<C>,
44+
async *updateRouter<RC extends Chain>(
45+
sender: AnyEvmAddress,
4646
chain: RC,
4747
cctpDomain: number,
4848
router: AccountAddress<RC>,
4949
tokenAccount?: AccountAddress<C> | undefined,
50-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
50+
) {
5151
throw new Error("Method not implemented.");
5252
}
53-
disableRouter<RC extends Chain>(
54-
sender: AccountAddress<C>,
55-
chain: RC,
56-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
53+
async *disableRouter<RC extends Chain>(sender: AnyEvmAddress, chain: RC) {
5754
throw new Error("Method not implemented.");
5855
}
59-
setPause(
60-
sender: AccountAddress<C>,
61-
pause: boolean,
62-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
56+
async *setPause(sender: AnyEvmAddress, pause: boolean) {
6357
throw new Error("Method not implemented.");
6458
}
65-
setConfiguration(config: {
59+
async *setConfiguration(config: {
6660
enabled: boolean;
6761
maxAmount: bigint;
6862
baseFee: bigint;
6963
initAuctionFee: bigint;
70-
}): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
64+
}) {
7165
throw new Error("Method not implemented.");
7266
}
73-
placeInitialOffer(
74-
sender: AccountAddress<C>,
67+
async *placeInitialOffer(
68+
sender: AnyEvmAddress,
7569
vaa: VAA<"FastTransfer:FastMarketOrder">,
7670
offerPrice: bigint,
7771
totalDeposit?: bigint | undefined,
78-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
79-
throw new Error("Method not implemented.");
72+
) {
73+
const from = new EvmAddress(sender).unwrap();
74+
const txReq = await this.connect(this.provider).placeInitialBidTx(
75+
serialize(vaa),
76+
offerPrice,
77+
);
78+
79+
yield this.createUnsignedTx({ ...txReq, from }, "MatchingEngine.placeInitialOffer");
8080
}
81-
improveOffer(
82-
sender: AccountAddress<C>,
81+
async *improveOffer(
82+
sender: AnyEvmAddress,
8383
vaa: VAA<"FastTransfer:FastMarketOrder">,
8484
offer: bigint,
85-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
85+
) {
8686
throw new Error("Method not implemented.");
8787
}
88-
executeFastOrder(
89-
sender: AccountAddress<C>,
90-
vaa: VAA<"FastTransfer:FastMarketOrder">,
91-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
88+
async *executeFastOrder(sender: AnyEvmAddress, vaa: VAA<"FastTransfer:FastMarketOrder">) {
9289
throw new Error("Method not implemented.");
9390
}
94-
prepareOrderResponse(
91+
async *prepareOrderResponse(
9592
sender: AccountAddress<C>,
9693
vaa: VAA<"FastTransfer:FastMarketOrder">,
9794
deposit: VAA<"FastTransfer:CctpDeposit">,
9895
cctp: CircleBridge.Attestation,
99-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
96+
) {
10097
throw new Error("Method not implemented.");
10198
}
102-
settleOrder(
99+
async *settleOrder(
103100
sender: AccountAddress<C>,
104101
fast: VAA<"FastTransfer:FastMarketOrder">,
105102
deposit?: VAA<"FastTransfer:CctpDeposit"> | undefined,
106103
cctp?: CircleBridge.Attestation | undefined,
107-
): AsyncGenerator<UnsignedTransaction<N, C>, any, unknown> {
104+
) {
108105
throw new Error("Method not implemented.");
109106
}
110107

111-
//async *redeemFill(
112-
// sender: AnyEvmAddress,
113-
// vaa: VAA<"FastTransfer:CctpDeposit"> | VAA<"FastTransfer:FastFill">,
114-
// cctp?: CircleBridge.Attestation,
115-
//) {
116-
// const from = new EvmAddress(sender).unwrap();
117-
// const txReq = await this.redeemFillTx({
118-
// encodedWormholeMessage: serialize(vaa),
119-
// circleBridgeMessage: cctp ? CircleBridge.serialize(cctp.message) : new Uint8Array(),
120-
// circleAttestation: cctp ? encoding.hex.decode(cctp.attestation!) : new Uint8Array(),
121-
// });
122-
// yield this.createUnsignedTx({ ...txReq, from }, "TokenRouter.redeemFill");
123-
//}
124-
125108
private createUnsignedTx(
126109
txReq: ethers.TransactionRequest,
127110
description: string,

evm/ts/src/testing/utils.ts

+45-19
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import { ethers, isError } from "ethers";
2-
import { IERC20 } from "../types";
3-
import { IUSDC__factory } from "../types/factories/IUSDC__factory";
4-
import { WALLET_PRIVATE_KEYS } from "./consts";
5-
import { EvmMatchingEngine } from "..";
6-
import { signAndSendWait } from "@wormhole-foundation/sdk-connect";
71
import { Chain, Network } from "@wormhole-foundation/sdk-base";
2+
import { signAndSendWait } from "@wormhole-foundation/sdk-connect";
83
import {
94
SignAndSendSigner,
105
UnsignedTransaction,
11-
toNative,
126
toUniversal,
137
} from "@wormhole-foundation/sdk-definitions";
148
import { EvmChains, EvmNativeSigner } from "@wormhole-foundation/sdk-evm";
9+
import { ethers, isError } from "ethers";
10+
import { MatchingEngine } from "..";
11+
import { IERC20 } from "../types";
12+
import { IUSDC__factory } from "../types/factories/IUSDC__factory";
13+
import { WALLET_PRIVATE_KEYS } from "./consts";
1514

1615
export interface ScoreKeeper {
1716
player: ethers.NonceManager;
@@ -38,19 +37,21 @@ export class SdkSigner<N extends Network, C extends EvmChains>
3837
return this._signer as unknown as ethers.Wallet;
3938
}
4039

41-
async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<string[]> {
40+
// Does not wait for confirmations
41+
async signOnly(txs: UnsignedTransaction<N, C>[]): Promise<string[]> {
4242
const txids: string[] = [];
4343
for (let tx of txs) {
44-
for (let x = 0; x < 3; x++) {
44+
for (let retries = 0; retries < 3; retries++) {
4545
try {
4646
const res = await this._signer.sendTransaction(tx.transaction);
4747
txids.push(res.hash);
4848
break;
4949
} catch (e) {
5050
if (
51-
isError(e, "CALL_EXCEPTION") &&
52-
"info" in e &&
53-
e.info!.error.message === "nonce too low"
51+
(isError(e, "CALL_EXCEPTION") &&
52+
"info" in e &&
53+
e.info!.error.message === "nonce too low") ||
54+
isError(e, "NONCE_EXPIRED")
5455
) {
5556
const nonce = await this.wallet.getNonce();
5657
console.log("Setting nonce to ", nonce);
@@ -61,18 +62,34 @@ export class SdkSigner<N extends Network, C extends EvmChains>
6162
}
6263
}
6364
}
64-
65-
await mine(this.provider);
66-
await this.provider.waitForTransaction(txids[0], 1, 5000);
6765
return txids;
6866
}
67+
68+
// Mine and wait for transaction
69+
async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<string[]> {
70+
try {
71+
const txids = await this.signOnly(txs);
72+
await mine(this.provider);
73+
await this.provider.waitForTransaction(txids[0], 1, 5000);
74+
return txids;
75+
} catch (e) {
76+
console.error(e);
77+
throw e;
78+
}
79+
}
6980
}
7081

7182
export const sleep = async (seconds: number) =>
7283
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
7384

74-
export const nonceManagedWallet = (key: string, provider: ethers.Provider) =>
75-
new ethers.NonceManager(new ethers.Wallet(key, provider));
85+
export function getSigners(key: string, provider: ethers.Provider) {
86+
const wallet = new ethers.Wallet(key, provider);
87+
88+
return {
89+
wallet: new ethers.NonceManager(wallet),
90+
signer: getSdkSigner("Ethereum", wallet),
91+
};
92+
}
7693

7794
export async function mine(provider: ethers.JsonRpcProvider) {
7895
await provider.send("evm_mine", []);
@@ -90,7 +107,7 @@ export function tryNativeToUint8Array(address: string, chain: Chain) {
90107

91108
export async function mineToGracePeriod(
92109
auctionId: Uint8Array,
93-
engine: EvmMatchingEngine,
110+
engine: MatchingEngine,
94111
provider: ethers.JsonRpcProvider,
95112
) {
96113
const { startBlock } = await engine.liveAuctionInfo(auctionId);
@@ -104,7 +121,7 @@ export async function mineToGracePeriod(
104121

105122
export async function mineToPenaltyPeriod(
106123
auctionId: Uint8Array,
107-
engine: EvmMatchingEngine,
124+
engine: MatchingEngine,
108125
provider: ethers.JsonRpcProvider,
109126
penaltyBlocks: number,
110127
) {
@@ -116,6 +133,15 @@ export async function mineToPenaltyPeriod(
116133
await mineMany(provider, Number(blocksToMine));
117134
}
118135

136+
export async function signOnly<N extends Network, C extends EvmChains>(
137+
txs: AsyncGenerator<UnsignedTransaction<N, C>, void, unknown>,
138+
signer: SdkSigner<N, C>,
139+
) {
140+
const txns = [];
141+
for await (const tx of txs) txns.push(tx);
142+
await signer.signOnly(txns);
143+
}
144+
119145
export async function signSendMineWait<N extends Network, C extends EvmChains>(
120146
txs: AsyncGenerator<UnsignedTransaction<N, C>, void, unknown>,
121147
signer: SdkSigner<N, C>,

evm/ts/tests/03__marketOrder.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { TokenRouter } from "@wormhole-foundation/example-liquidity-layer-definitions";
2-
import { encoding } from "@wormhole-foundation/sdk-base";
3-
import { CircleBridge, deserialize, toNative } from "@wormhole-foundation/sdk-definitions";
2+
import { toNative } from "@wormhole-foundation/sdk-definitions";
43
import { expect } from "chai";
54
import { ethers } from "ethers";
65
import { EvmTokenRouter, OrderResponse, decodedOrderResponse } from "../src";

0 commit comments

Comments
 (0)