Skip to content

Commit

Permalink
OFF-CHAIN | Fix collecting orders
Browse files Browse the repository at this point in the history
  • Loading branch information
ljttl3q04t committed Jun 5, 2024
1 parent 627abad commit bbbfae3
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 85 deletions.
32 changes: 16 additions & 16 deletions plutus.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion plutus.ts

Large diffs are not rendered by default.

13 changes: 9 additions & 4 deletions src/build-tx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
MINSWAP_V2_MAX_LIQUIDITY,
MINSWAP_V2_POOL_AUTH_AN,
ORDER_AUTH_AN,
ORDER_MIN_ADA,
SELLER_AUTH_AN,
SELLER_MIN_ADA,
TREASURY_AUTH_AN,
Expand Down Expand Up @@ -705,13 +706,14 @@ export class WarehouseBuilder {
const { treasuryInput, orderInputs, validFrom, validTo } = options;
invariant(treasuryInput.datum);
const treasuryInDatum = this.fromDatumTreasury(treasuryInput.datum);
const treasuryOutDatum: TreasuryDatum = {
let treasuryOutDatum: TreasuryDatum = {
...treasuryInDatum,
};
const orderOutDatums: OrderDatum[] = [];
let deltaCollectedFund = 0n;

for (const o of orderInputs) {
const sortedOrders = sortUTxOs(orderInputs);
for (const o of sortedOrders) {
invariant(o.datum);
const datum: OrderDatum = {
...this.fromDatumOrder(o.datum),
Expand All @@ -720,7 +722,10 @@ export class WarehouseBuilder {
orderOutDatums.push(datum);
deltaCollectedFund += datum.amount + datum.penaltyAmount;
}
treasuryOutDatum.collectedFund += deltaCollectedFund;
treasuryOutDatum = {
...treasuryOutDatum,
collectedFund: treasuryOutDatum.collectedFund + deltaCollectedFund,
};

this.tasks.push(
() => {
Expand Down Expand Up @@ -1139,7 +1144,7 @@ export class WarehouseBuilder {
const assets = {
[this.orderToken]: 1n,
lovelace:
LBE_MIN_OUTPUT_ADA + (datum.isCollected ? LBE_FEE : LBE_FEE * 2n),
ORDER_MIN_ADA + (datum.isCollected ? LBE_FEE : LBE_FEE * 2n),
};
const raiseAsset = toUnit(
datum.raiseAsset.policyId,
Expand Down
2 changes: 1 addition & 1 deletion src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ export const DUMMY_REDEEMER = "d87980"; // 121([])
export const TREASURY_MIN_ADA = 3_000_000n;
export const MANAGER_MIN_ADA = 2_000_000n;
export const SELLER_MIN_ADA = 2_000_000n;
export const ORDER_MIN_ADA = 2_000_000n;
export const MAX_PENALTY_RATE = 25n;
export const ORDER_MIN_ADA = 5_000_000n;
245 changes: 182 additions & 63 deletions src/tests/collect-orders.test.ts
Original file line number Diff line number Diff line change
@@ -1,68 +1,187 @@
// import { TreasuryValidateTreasurySpending } from "../../plutus";
// import { WarehouseBuilder, type BuildCollectOrdersOptions } from "../build-tx";
// import { ORDER_MIN_ADA, TREASURY_MIN_ADA } from "../constants";
// import type { UTxO } from "../types";
// import { assertValidator, loadModule } from "./utils";
// import { genWarehouse } from "./warehouse";
import { WarehouseBuilder, type BuildCollectOrdersOptions } from "../build-tx";
import { LBE_FEE, ORDER_MIN_ADA, TREASURY_MIN_ADA } from "../constants";
import type { OrderDatum, TreasuryDatum, UTxO } from "../types";
import { assertValidator, loadModule, quickSubmitBuilder } from "./utils";
import { genWarehouse } from "./warehouse";

// let W: GenTestWarehouse;
let W: GenTestWarehouse;
const MAX_SIZE = 15;

// beforeAll(async () => {
// await loadModule();
// });
beforeAll(async () => {
await loadModule();
});

// type GenTestWarehouse = Awaited<ReturnType<typeof genTestWarehouse>>;
// async function genTestWarehouse() {
// let warehouse = await genWarehouse();
// let builder = new WarehouseBuilder(warehouse.warehouseOptions);
// const treasuryDatum: TreasuryValidateTreasurySpending["treasuryInDatum"] = {
// ...warehouse.defaultTreasuryDatum,
// };
// const treasuryInput: UTxO = {
// txHash: "00".repeat(32),
// outputIndex: 1,
// assets: {
// [builder.treasuryToken]: 1n,
// [warehouse.minswapTokenRaw]: treasuryDatum.reserveBase,
// lovelace: TREASURY_MIN_ADA,
// },
// address: builder.treasuryAddress,
// datum: builder.toDatumTreasury(treasuryDatum),
// };
// let orderAmount = 100_000_000n;
// let orderDatum: FeedTyp = {
// ...warehouse.defaultOrderDatum,
// amount:
// };
// let orderInput: UTxO = {
// txHash: "00".repeat(32),
// outputIndex: 2,
// assets: {
// [builder.orderToken]: 1n,
// lovelace: ORDER_MIN_ADA + orderAmount,
// },
// address: builder.orderAddress,
// datum: builder.toDatumOrder(orderDatum),
// };
// const options: BuildCollectOrdersOptions = {
// treasuryInput: treasuryInput,
// orderInputs: [orderInput],
// validFrom: warehouse.t.utils.slotToUnixTime(warehouse.emulator.slot),
// validTo: warehouse.t.utils.slotToUnixTime(warehouse.emulator.slot + 100),
// };
// return {
// ...warehouse,
// treasuryInput,
// treasuryDatum,
// builder,
// options,
// };
// }
type GenTestWarehouse = Awaited<ReturnType<typeof genTestWarehouse>>;
async function genTestWarehouse() {
let warehouse = await genWarehouse();
let builder = new WarehouseBuilder(warehouse.warehouseOptions);
let orderAmount = 100_000_000n;
let penaltyAmount = 20_000_000n;
const treasuryDatum: TreasuryDatum = {
...warehouse.defaultTreasuryDatum,
isManagerCollected: true,
reserveRaise: orderAmount,
};
const treasuryInput: UTxO = {
txHash: "00".repeat(32),
outputIndex: 1,
assets: {
[builder.treasuryToken]: 1n,
[warehouse.minswapTokenRaw]: treasuryDatum.reserveBase,
lovelace: TREASURY_MIN_ADA,
},
address: builder.treasuryAddress,
datum: builder.toDatumTreasury(treasuryDatum),
};
let orderDatum: OrderDatum = {
...warehouse.defaultOrderDatum,
amount: orderAmount,
penaltyAmount,
};
let orderInput: UTxO = {
txHash: "00".repeat(32),
outputIndex: 2,
assets: {
[builder.orderToken]: 1n,
lovelace: ORDER_MIN_ADA + 2n * LBE_FEE + orderAmount,
},
address: builder.orderAddress,
datum: builder.toDatumOrder(orderDatum),
};
const options: BuildCollectOrdersOptions = {
treasuryInput: treasuryInput,
orderInputs: [orderInput],
validFrom: warehouse.t.utils.slotToUnixTime(warehouse.emulator.slot),
validTo: warehouse.t.utils.slotToUnixTime(warehouse.emulator.slot + 100),
};
return {
...warehouse,
orderAmount,
treasuryInput,
orderInput,
orderDatum,
treasuryDatum,
builder,
options,
};
}

// beforeEach(async () => {
// W = await genTestWarehouse();
// });
let remixTreasuryInput = (remixDatum: any): UTxO => {
let treasuryDatum = {
...W.treasuryDatum,
...remixDatum,
};
return {
...W.treasuryInput,
datum: W.builder.toDatumTreasury(treasuryDatum),
};
};

// test("collect-orders | PASS | if you're happy!", async () => {
// assertValidator(W.builder.buildCollectOrders(W.options), "");
// });
let remixOptions = (remixOptions: {
treasuryDatum: any;
}): BuildCollectOrdersOptions => {
let { options } = W;
let { treasuryDatum } = remixOptions;
if (treasuryDatum) {
options = {
...options,
treasuryInput: remixTreasuryInput(treasuryDatum),
};
}
return options;
};

beforeEach(async () => {
W = await genTestWarehouse();
});

test("collect-orders | PASS | if you're happy!", async () => {
assertValidator(W.builder.buildCollectOrders(W.options), "");
});

test("collect-orders | PASS | LBE was cancelled", async () => {
let { options, builder } = W;
let remix = {
treasuryDatum: { isCancelled: true },
};
options = remixOptions(remix);
assertValidator(builder.buildCollectOrders(options), "");
});

test(`collect-orders | PASS | collect ${MAX_SIZE} orders`, async () => {
let orderInputs: UTxO[] = [];
for (let i = 0; i < MAX_SIZE; i++) {
let orderInput: UTxO = {
...W.orderInput,
outputIndex: i * 10,
};
orderInputs.push(orderInput);
}
let options = remixOptions({
treasuryDatum: { reserveRaise: W.orderAmount * BigInt(MAX_SIZE) },
});
options = { ...options, orderInputs };
assertValidator(W.builder.buildCollectOrders(options), "");
});

test(`collect-orders | PASS | collect orders many times`, async () => {
let { builder } = W;
let orderInputs: UTxO[] = [];
for (let i = 0; i < MAX_SIZE; i++) {
let orderInput: UTxO = {
...W.orderInput,
outputIndex: i * 10,
};
orderInputs.push(orderInput);
}
let options = remixOptions({
treasuryDatum: { reserveRaise: W.orderAmount * BigInt(MAX_SIZE) },
});
W.emulator.addUTxO(options.treasuryInput);
for (let o of orderInputs) {
W.emulator.addUTxO(o);
}

options = { ...options, orderInputs: orderInputs.slice(0, 3) };
builder.buildCollectOrders(options);
const tx1 = await quickSubmitBuilder(W.emulator)({
txBuilder: builder.complete(),
});
expect(tx1).toBeTruthy();

let treasuryInput = await W.findTreasuryInput();
options = { ...options, orderInputs: orderInputs.slice(3), treasuryInput };
// restart builder
builder = new WarehouseBuilder(W.warehouseOptions);
builder.buildCollectOrders(options);
const tx2 = await quickSubmitBuilder(W.emulator)({
txBuilder: builder.complete(),
});
expect(tx2).toBeTruthy();
});

test(`collect-orders | PASS | collect -> cancel -> collect`, async () => {
let { builder } = W;
let orderInputs: UTxO[] = [];
for (let i = 0; i < MAX_SIZE; i++) {
let orderInput: UTxO = {
...W.orderInput,
outputIndex: i * 10,
};
orderInputs.push(orderInput);
}
let options = remixOptions({
treasuryDatum: { reserveRaise: W.orderAmount * BigInt(MAX_SIZE) },
});
W.emulator.addUTxO(options.treasuryInput);
for (let o of orderInputs) {
W.emulator.addUTxO(o);
}

options = { ...options, orderInputs: orderInputs.slice(0, 3) };
builder.buildCollectOrders(options);
const tx1 = await quickSubmitBuilder(W.emulator)({
txBuilder: builder.complete(),
});
expect(tx1).toBeTruthy();
});

0 comments on commit bbbfae3

Please sign in to comment.