Skip to content

Commit

Permalink
Off-chain: create AMM pool+Redeem LP+Refund tests (#25)
Browse files Browse the repository at this point in the history
* wip

* happ case

* redeem LP

* refund orders test

* finish create amm pool test

* add validation for redeem lp and refund

* format
  • Loading branch information
m1n999999 authored Jun 12, 2024
1 parent 3519170 commit 0c7d40c
Show file tree
Hide file tree
Showing 9 changed files with 674 additions and 42 deletions.
28 changes: 14 additions & 14 deletions plutus.json

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions plutus.ts

Large diffs are not rendered by default.

130 changes: 118 additions & 12 deletions src/build-tx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -618,11 +618,11 @@ export class WarehouseBuilder {
} = options;
invariant(treasuryInput.datum);
const treasuryInDatum = this.fromDatumTreasury(treasuryInput.datum);
invariant(
treasuryInDatum.collectedFund ==
treasuryInDatum.reserveRaise + treasuryInDatum.totalPenalty,
"Please collect all orders!",
);
// invariant(
// treasuryInDatum.collectedFund ==
// treasuryInDatum.reserveRaise + treasuryInDatum.totalPenalty,
// "Please collect all orders!",
// );
const projectOwnerLp = (totalLiquidity - LP_COLATERAL) / 2n;
const treasuryOutDatum: TreasuryDatum = {
...treasuryInDatum,
Expand Down Expand Up @@ -723,22 +723,42 @@ export class WarehouseBuilder {
const sortedOrders = sortUTxOs(orderInputs);
let totalFund = 0n;
let totalLiquidity = 0n;
let totalBonusRaise = 0n;
const userOutputs: { address: Address; assets: Assets }[] = [];
const totalBonusRaiseAsset =
treasuryInDatum.maximumRaise &&
treasuryInDatum.reserveRaise + treasuryInDatum.totalPenalty >
treasuryInDatum.maximumRaise
? treasuryInDatum.reserveRaise +
treasuryInDatum.totalPenalty -
treasuryInDatum.maximumRaise
: 0n;
const raiseAsset = toUnit(
this.raiseAsset!.policyId,
this.raiseAsset!.assetName,
);
for (const order of sortedOrders) {
invariant(order.datum);
const datum = this.fromDatumOrder(order.datum);
const lpAmount =
(datum.amount * treasuryInDatum.totalLiquidity) /
treasuryInDatum.reserveRaise;
const bonusRaise =
(datum.amount * totalBonusRaiseAsset) / treasuryInDatum.reserveRaise;
const assets = {
lovelace: ORDER_MIN_ADA,
[this.ammLpToken]: lpAmount,
};
assets[raiseAsset] = assets[raiseAsset]
? assets[raiseAsset] + bonusRaise
: bonusRaise;
const output: { address: Address; assets: Assets } = {
address: plutusAddress2Address(this.t.network, datum.owner),
assets: {
lovelace: ORDER_MIN_ADA,
[this.ammLpToken]: lpAmount,
},
assets,
};
totalFund += datum.amount + datum.penaltyAmount;
totalLiquidity += lpAmount;
totalBonusRaise += bonusRaise;
userOutputs.push(output);
}
const treasuryOutDatum: TreasuryDatum = {
Expand Down Expand Up @@ -768,6 +788,84 @@ export class WarehouseBuilder {
this.payingTreasuryOutput({
treasuryOutDatum,
deltaLp: totalLiquidity,
deltaRaise: totalBonusRaise,
});
},
() => {
this.mintingOrderToken(-1n * BigInt(orderInputs.length));
},
() => {
this.tx.validFrom(validFrom).validTo(validTo);
},
() => {
this.withdrawFromFactory();
},
);
return this;
}
public buildRefundOrders(
options: BuildRedeemOrdersOptions,
): WarehouseBuilder {
const { treasuryInput, orderInputs, validFrom, validTo } = options;
invariant(treasuryInput.datum);
const treasuryInDatum = this.fromDatumTreasury(treasuryInput.datum);
this.setInnerAssets(treasuryInDatum.baseAsset, treasuryInDatum.raiseAsset);
invariant(this.ammLpToken);
const sortedOrders = sortUTxOs(orderInputs);
let totalRaise = 0n;
let totalPenalty = 0n;
const userOutputs: { address: Address; assets: Assets }[] = [];
const raiseAsset = toUnit(
this.raiseAsset!.policyId,
this.raiseAsset!.assetName,
);
for (const order of sortedOrders) {
invariant(order.datum);
const { penaltyAmount, amount, owner } = this.fromDatumOrder(order.datum);
const assets: Record<string, bigint> = {
lovelace: ORDER_MIN_ADA,
};
assets[raiseAsset] = assets[raiseAsset]
? assets[raiseAsset] + amount + penaltyAmount
: amount + penaltyAmount;
const output: { address: Address; assets: Assets } = {
address: plutusAddress2Address(this.t.network, owner),
assets,
};
totalRaise += amount;
totalPenalty += penaltyAmount;
userOutputs.push(output);
}
const treasuryOutDatum: TreasuryDatum = {
...treasuryInDatum,
collectedFund: treasuryInDatum.collectedFund - totalRaise - totalPenalty,
reserveRaise: treasuryInDatum.reserveRaise - totalRaise,
totalPenalty: treasuryInDatum.totalPenalty - totalPenalty,
};
this.tasks.push(
() => {
this.treasuryInputs = [treasuryInput];
this.treasuryRedeemer = "RedeemOrders";
this.orderInputs = orderInputs;
this.orderRedeemer = "RedeemOrder";
this.mintRedeemer = "MintRedeemOrders";
},
() => {
for (const output of userOutputs) {
this.tx.payToAddress(output.address, output.assets);
}
},
() => {
this.spendingTreasuryInput();
},
() => {
this.spendingOrderInput();
},
() => {
this.payingTreasuryOutput({
treasuryOutDatum,
deltaLp: 0n,
deltaRaise: totalRaise + totalPenalty,
});
},
() => {
Expand Down Expand Up @@ -1115,8 +1213,10 @@ export class WarehouseBuilder {
treasuryOutDatum: TreasuryDatum;
deltaCollectedFund?: bigint;
deltaLp?: bigint;
deltaRaise?: bigint;
}) {
const { treasuryOutDatum, deltaCollectedFund, deltaLp } = options;
const { treasuryOutDatum, deltaCollectedFund, deltaLp, deltaRaise } =
options;
const innerPay = (assets: Assets) => {
this.tx.payToAddressWithData(
this.treasuryAddress,
Expand Down Expand Up @@ -1160,9 +1260,15 @@ export class WarehouseBuilder {
const redeemAssets = () => {
invariant(this.treasuryInputs.length > 0);
invariant(this.ammLpToken);
invariant(deltaLp);
invariant(deltaLp !== undefined);
invariant(deltaRaise !== undefined);
const assets = { ...this.treasuryInputs[0].assets };
assets[this.ammLpToken] -= deltaLp;
assets[this.ammLpToken] = (assets[this.ammLpToken] ?? 0n) - deltaLp;
const raiseAsset = toUnit(
treasuryOutDatum.raiseAsset.policyId,
treasuryOutDatum.raiseAsset.assetName,
);
assets[raiseAsset] -= deltaRaise;
if (assets[this.ammLpToken] === 0n) {
delete assets[this.ammLpToken];
}
Expand Down
3 changes: 1 addition & 2 deletions src/tests/collect-sellers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@ import {
import { genWarehouse } from "./warehouse";

let utxoIndex: number;
type AwaitedReturnType<T> = T extends Promise<infer R> ? R : T;

let warehouse: AwaitedReturnType<ReturnType<typeof genTestWarehouse>>;
let warehouse: Awaited<ReturnType<typeof genTestWarehouse>>;

const MINt = {
policyId: "29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6",
Expand Down
Loading

0 comments on commit 0c7d40c

Please sign in to comment.