Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config.env.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ gasPriceMultiplier: $GAS_PRICE_MULTIPLIER
gasLimitMultiplier: $GAS_LIMIT_MULTIPLIER
timeout: $TIMEOUT
maxRatio: $MAX_RATIO
skipSweep: $SKIP_SWEEP
rpOnly: $RP_ONLY
ownerProfile: $OWNER_PROFILE
selfFundVaults: $SELF_FUND_ORDERS
Expand Down
5 changes: 5 additions & 0 deletions config.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ timeout: 15
# Option to maximize maxIORatio, default true
maxRatio: true

# list of tokens to skip sweeping
skipSweep:
- "0x123...456"
- "0xabc...def"

# Only clear orders through RP4, excludes intra and inter orderbook clears, default true
rpOnly: true

Expand Down
1 change: 1 addition & 0 deletions src/cli/commands/sweep.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ export async function sweepFunds(opts: SweepOptions) {
topupAmount: "0",
contracts: {},
orderbookTradeTypes: {} as any,
skipSweep: new Set(),
};

// prepare state config fields
Expand Down
7 changes: 7 additions & 0 deletions src/config/yaml.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ gasPriceMultiplier: 150
gasLimitMultiplier: 90
timeout: 20000
maxRatio: true
skipSweep:
- "0x8888888888888888888888888888888888888888"
- "0x9999999999999999999999999999999999999999"
ownerProfile: $OWNER_PROFILE
selfFundVaults:
- token: "0x6666666666666666666666666666666666666666"
Expand Down Expand Up @@ -142,6 +145,7 @@ orderbookTradeTypes:
interOrderbook: new Set([`0x${"3".repeat(40)}`, `0x${"4".repeat(40)}`]),
intraOrderbook: new Set([`0x${"5".repeat(40)}`, `0x${"6".repeat(40)}`]),
},
skipSweep: new Set([`0x${"8".repeat(40)}`, `0x${"9".repeat(40)}`]),
};

// AppOptions returned from fromYaml() should match expected
Expand Down Expand Up @@ -180,6 +184,7 @@ orderbookTradeTypes:
gasLimitMultiplier: "90",
timeout: "20000",
maxRatio: true,
skipSweep: undefined,
ownerProfile: [
{ "0x4444444444444444444444444444444444444444": "100" },
{ "0x5555555555555555555555555555555555555555": "max" },
Expand Down Expand Up @@ -313,5 +318,7 @@ orderbookTradeTypes:
interOrderbook: new Set<string>([`0x${"3".repeat(40)}`, `0x${"4".repeat(40)}`]),
intraOrderbook: new Set<string>([`0x${"5".repeat(40)}`, `0x${"6".repeat(40)}`]),
});

assert.deepEqual(result.skipSweep, new Set());
});
});
6 changes: 6 additions & 0 deletions src/config/yaml.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ export type AppOptions = {
contracts: AppOptionsContracts;
/** Specifies enabled trade types for each orderbook address */
orderbookTradeTypes: OrderbookTradeTypes;
/** List of tokens to skip when sweeping bounty tokens */
skipSweep: Set<string>;
};

/** Provides methods to instantiate and validate AppOptions */
Expand Down Expand Up @@ -261,6 +263,10 @@ export namespace AppOptions {
"invalid orderbookTradeTypes.intraOrderbook, expected an array of orderbook addresses",
),
},
skipSweep: Validator.resolveAddressSet(
input.skipSweep,
"invalid skip sweep list, expected an array of token addresses",
),
} as AppOptions);
} catch (error: any) {
if (error instanceof AppOptionsError) {
Expand Down
8 changes: 4 additions & 4 deletions src/core/modes/simulator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ describe("Test TradeSimulatorBase", () => {
Result.err(setTransactionDataError),
);
const headroom = BigInt(
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.25).toFixed(),
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.75).toFixed(),
);

const result = await mockSimulator.trySimulateTrade();
Expand Down Expand Up @@ -326,7 +326,7 @@ describe("Test TradeSimulatorBase", () => {
};
(dryrun as Mock).mockResolvedValueOnce(Result.err(dryrunError));
const headroom = BigInt(
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.25).toFixed(),
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.75).toFixed(),
);

const result = await mockSimulator.trySimulateTrade();
Expand Down Expand Up @@ -410,7 +410,7 @@ describe("Test TradeSimulatorBase", () => {
.mockResolvedValueOnce(Result.ok(dryrunResult))
.mockResolvedValueOnce(Result.ok(dryrunResult2));
const headroom = BigInt(
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.25).toFixed(),
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.75).toFixed(),
);
// last call to setTransactionData fails
const setTransactionDataError = {
Expand Down Expand Up @@ -525,7 +525,7 @@ describe("Test TradeSimulatorBase", () => {
.mockResolvedValueOnce(Result.ok(dryrunResult))
.mockResolvedValueOnce(Result.ok(dryrunResult2));
const headroom = BigInt(
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.25).toFixed(),
(Number(mockSolver.appOptions.gasCoveragePercentage) * 100.75).toFixed(),
);
const profitEstimate = 1234n;
(mockSimulator.estimateProfit as Mock).mockReturnValueOnce(profitEstimate);
Expand Down
2 changes: 1 addition & 1 deletion src/core/modes/simulator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ export abstract class TradeSimulatorBase {

// determine the success of the trade with 0.25% headroom
const headroom = BigInt(
(Number(this.tradeArgs.solver.appOptions.gasCoveragePercentage) * 100.25).toFixed(),
(Number(this.tradeArgs.solver.appOptions.gasCoveragePercentage) * 100.75).toFixed(),
);
let minimumExpected = (estimatedGasCost * headroom) / 10000n;
this.spanAttributes["gasEst.initial.minBountyExpected"] = minimumExpected.toString();
Expand Down
6 changes: 6 additions & 0 deletions src/wallet/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ describe("Test WalletManager", () => {
getBalance: vi.fn().mockResolvedValue(0n),
chain: { contracts: { multicall3: { address: "0xmulticall" } } },
},
appOptions: {
skipSweep: new Set(),
},
} as any);

multiWalletState = new SharedState({
Expand All @@ -81,6 +84,9 @@ describe("Test WalletManager", () => {
getBalance: vi.fn().mockResolvedValue(0n),
chain: { contracts: { multicall3: { address: "0xmulticall" } } },
},
appOptions: {
skipSweep: new Set(),
},
} as any);

workerSigner = RainSolverSigner.create(
Expand Down
5 changes: 5 additions & 0 deletions src/wallet/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,11 @@ export class WalletManager {
for (const [, tokenDetails] of this.state.watchedTokens) {
report.setAttr(`details.swaps.${tokenDetails.symbol}.token`, tokenDetails.address);

if (this.state.appOptions.skipSweep.has(tokenDetails.address.toLowerCase())) {
report.setAttr(`details.swaps.${tokenDetails.symbol}.status`, "skipped");
continue;
}

try {
const {
route = undefined,
Expand Down
Loading