Skip to content

Commit 88d348a

Browse files
committed
Merge branch 'main' into dark-pool
2 parents 4512652 + 55c23d8 commit 88d348a

File tree

11 files changed

+96
-60
lines changed

11 files changed

+96
-60
lines changed

.github/workflows/test.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Test
2+
3+
on: [push]
4+
5+
jobs:
6+
test:
7+
runs-on: ubuntu-20.04
8+
strategy:
9+
matrix:
10+
node-version: [20]
11+
12+
steps:
13+
- uses: actions/checkout@v4
14+
- uses: pnpm/action-setup@v4
15+
16+
- name: Use Node.js ${{ matrix.node-version }}
17+
uses: actions/setup-node@v4
18+
with:
19+
node-version: ${{ matrix.node-version }}
20+
cache: "pnpm"
21+
22+
- name: Install dependencies
23+
run: pnpm install --frozen-lockfile
24+
25+
- name: Run tests
26+
# TODO(security): test all packages & apps (js, noir & rust)
27+
run: cd packages/contracts && pnpm test

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"name": "@repo/monorepo",
33
"type": "module",
44
"private": true,
5+
"packageManager": "pnpm@9.15.4",
56
"devDependencies": {
67
"prettier-plugin-svelte": "^3.2.7",
78
"typescript": "^5.6.3"

packages/contracts/envConfig.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import { zPrivateKey } from "./shared/utils";
66
* Parse env variables in a typesafe way.
77
*/
88
const EnvConfigSchema = z.object({
9-
DEPLOYER_PRIVATE_KEY: zPrivateKey(),
9+
DEPLOYER_PRIVATE_KEY: zPrivateKey().default(
10+
// random key
11+
"0x845074c29c6487a92fa902e06" + "f1a1fe1ac0eb801fd6624b0a486e3c04a75721f",
12+
),
1013
});
1114

1215
let envConfig: z.infer<typeof EnvConfigSchema>;

packages/contracts/noir/erc20/src/lib.nr

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,17 @@ pub mod Token {
5252
from_secret_key: Field,
5353
from_note_inputs: common::Erc20NoteConsumptionInputs,
5454
to: common::WaAddress,
55-
amount: common::U256,
55+
amount: common::TokenAmount,
5656
to_randomness: Field,
5757
change_randomness: Field,
5858
) {
5959
common::Erc20Note::sub_and_emit_change(
6060
context,
6161
[from_note_inputs],
62-
common::TokenAmount { token: from_note_inputs.note.amount.token, amount },
62+
amount,
6363
change_randomness,
6464
from_secret_key,
6565
);
66-
common::Erc20Note {
67-
owner: to,
68-
amount: common::TokenAmount { token: from_note_inputs.note.amount.token, amount },
69-
randomness: to_randomness,
70-
}
71-
.emit(context);
66+
common::Erc20Note { owner: to, amount, randomness: to_randomness }.emit(context);
7267
}
7368
}

packages/contracts/noir/erc20_transfer/src/main.nr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fn main(
55
from_note_inputs: erc20::Erc20NoteConsumptionInputs,
66
// transfer params
77
to: common::WaAddress,
8-
amount: common::U256,
8+
amount: common::TokenAmount,
99
to_randomness: Field,
1010
// change
1111
change_randomness: Field,

packages/contracts/noir/lob_router/src/lib.nr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ mod LobRouter {
33
context: &mut common::Context,
44
seller_secret_key: Field,
55
seller_note: erc20::Erc20NoteConsumptionInputs,
6-
seller_amount: common::U256,
6+
seller_amount: common::TokenAmount,
77
seller_randomness: Field,
88
buyer_secret_key: Field,
99
buyer_note: erc20::Erc20NoteConsumptionInputs,
10-
buyer_amount: common::U256,
10+
buyer_amount: common::TokenAmount,
1111
buyer_randomness: Field,
1212
) {
1313
// TODO(security): orders must be signed by parties and the prices should match

packages/contracts/noir/lob_router_swap/src/main.nr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ fn main(
33
// seller
44
seller_secret_key: Field,
55
seller_note: erc20::Erc20NoteConsumptionInputs,
6-
seller_amount: common::U256,
6+
seller_amount: common::TokenAmount,
77
seller_randomness: Field,
88
// buyer
99
buyer_secret_key: Field,
1010
buyer_note: erc20::Erc20NoteConsumptionInputs,
11-
buyer_amount: common::U256,
11+
buyer_amount: common::TokenAmount,
1212
buyer_randomness: Field,
1313
) -> pub common::Result<4, 2> {
1414
let mut context = common::Context::from(tree_roots);

packages/contracts/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
"name": "@repo/contracts",
33
"private": true,
44
"scripts": {
5-
"compile": "hardhat compile --typecheck",
6-
"test": "hardhat test --typecheck",
7-
"test:no-typecheck": "hardhat test",
5+
"compile": "hardhat compile",
6+
"test": "hardhat test",
87
"deploy": "pnpm hardhat deploy-and-export",
98
"deploy:localhost": "rm -rf deployments/localhost && pnpm hardhat deploy-and-export --network localhost --gasprice 1gwei"
109
},

packages/contracts/sdk/LobService.ts

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
type NoirAndBackend,
1010
type PoolErc20Service,
1111
} from "./RollupService.js";
12-
import { prove, toNoirU256 } from "./utils.js";
12+
import { prove } from "./utils.js";
1313

1414
export class LobService {
1515
constructor(
@@ -24,10 +24,10 @@ export class LobService {
2424
async swap(params: {
2525
sellerSecretKey: string;
2626
sellerNote: Erc20Note;
27-
sellerAmount: bigint;
27+
sellerAmount: TokenAmount;
2828
buyerSecretKey: string;
2929
buyerNote: Erc20Note;
30-
buyerAmount: bigint;
30+
buyerAmount: TokenAmount;
3131
}) {
3232
const { Fr } = await import("@aztec/aztec.js");
3333

@@ -37,34 +37,22 @@ export class LobService {
3737

3838
const sellerChangeNote = await Erc20Note.from({
3939
owner: await CompleteWaAddress.fromSecretKey(params.sellerSecretKey),
40-
amount: await TokenAmount.from({
41-
token: params.sellerNote.amount.token,
42-
amount: params.sellerNote.amount.amount - params.sellerAmount,
43-
}),
40+
amount: params.sellerNote.amount.sub(params.sellerAmount),
4441
randomness: sellerRandomness,
4542
});
4643
const buyerChangeNote = await Erc20Note.from({
4744
owner: await CompleteWaAddress.fromSecretKey(params.buyerSecretKey),
48-
amount: await TokenAmount.from({
49-
token: params.buyerNote.amount.token,
50-
amount: params.buyerNote.amount.amount - params.buyerAmount,
51-
}),
45+
amount: params.buyerNote.amount.sub(params.buyerAmount),
5246
randomness: buyerRandomness,
5347
});
5448
const sellerSwapNote = await Erc20Note.from({
5549
owner: await CompleteWaAddress.fromSecretKey(params.sellerSecretKey),
56-
amount: await TokenAmount.from({
57-
token: params.buyerNote.amount.token,
58-
amount: params.buyerAmount,
59-
}),
50+
amount: params.buyerAmount,
6051
randomness: sellerRandomness,
6152
});
6253
const buyerSwapNote = await Erc20Note.from({
6354
owner: await CompleteWaAddress.fromSecretKey(params.buyerSecretKey),
64-
amount: await TokenAmount.from({
65-
token: params.sellerNote.amount.token,
66-
amount: params.sellerAmount,
67-
}),
55+
amount: params.sellerAmount,
6856
randomness: buyerRandomness,
6957
});
7058

@@ -75,15 +63,15 @@ export class LobService {
7563
params.sellerSecretKey,
7664
params.sellerNote,
7765
),
78-
seller_amount: toNoirU256(params.sellerAmount),
66+
seller_amount: await params.sellerAmount.toNoir(),
7967
seller_randomness: sellerRandomness,
8068

8169
buyer_secret_key: params.buyerSecretKey,
8270
buyer_note: await this.poolErc20.toNoteConsumptionInputs(
8371
params.buyerSecretKey,
8472
params.buyerNote,
8573
),
86-
buyer_amount: toNoirU256(params.buyerAmount),
74+
buyer_amount: await params.buyerAmount.toNoir(),
8775
buyer_randomness: buyerRandomness,
8876
};
8977
const { proof } = await prove("swap", swapCircuit, input);

packages/contracts/sdk/RollupService.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export class PoolErc20Service {
218218
secretKey: string;
219219
fromNote: Erc20Note;
220220
to: CompleteWaAddress;
221-
amount: bigint;
221+
amount: TokenAmount;
222222
}) {
223223
const { Fr } = await import("@aztec/aztec.js");
224224

@@ -231,25 +231,19 @@ export class PoolErc20Service {
231231
from_note_inputs: await this.toNoteConsumptionInputs(secretKey, fromNote),
232232
from_secret_key: secretKey,
233233
to: { inner: to.address },
234-
amount: toNoirU256(amount),
234+
amount: await amount.toNoir(),
235235
to_randomness,
236236
change_randomness,
237237
};
238238
const changeNote = await Erc20Note.from({
239239
owner: fromNote.owner,
240-
amount: await TokenAmount.from({
241-
token: fromNote.amount.token,
242-
amount: fromNote.amount.amount - amount,
243-
}),
240+
amount: fromNote.amount.sub(amount),
244241
randomness: change_randomness,
245242
});
246243
assert(changeNote.amount.amount >= 0n, "invalid change note");
247244
const toNote = await Erc20Note.from({
248245
owner: to,
249-
amount: await TokenAmount.from({
250-
token: fromNote.amount.token,
251-
amount,
252-
}),
246+
amount,
253247
randomness: to_randomness,
254248
});
255249
// console.log("input\n", JSON.stringify(input));
@@ -498,6 +492,12 @@ export class TokenAmount {
498492
amount: toNoirU256(this.amount),
499493
};
500494
}
495+
496+
sub(other: TokenAmount): TokenAmount {
497+
const result = this.amount - other.amount;
498+
assert(result >= 0n, "TokenAmount.sub: underflow");
499+
return new TokenAmount(this.token, result);
500+
}
501501
}
502502

503503
export type WaAddress = string;

0 commit comments

Comments
 (0)