@silvana-one/token 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ import { Field, Provable, UInt64, Gadgets, Struct } from "o1js";
2
+ export class MulDivResult extends Struct({
3
+ result: UInt64,
4
+ remainder: UInt64,
5
+ }) {
6
+ }
7
+ class MulDivResultInternal extends Struct({
8
+ result: Field,
9
+ remainder: Field,
10
+ }) {
11
+ }
12
+ export function mulDiv(params) {
13
+ const { value, multiplier, denominator } = params;
14
+ denominator.equals(UInt64.zero).assertFalse("division by zero"); // should fail in case the denominator is zero
15
+ const fields = Provable.witness(MulDivResultInternal, () => {
16
+ const valueBigInt = value.toBigInt();
17
+ const multiplierBigInt = multiplier.toBigInt();
18
+ const denominatorBigInt = denominator.toBigInt();
19
+ // handle division by zero for first pass of the prover that can pass zero instead of the real value
20
+ if (denominatorBigInt === 0n) {
21
+ return { result: Field.from(0n), remainder: Field.from(0n) };
22
+ }
23
+ const result = (valueBigInt * multiplierBigInt) / denominatorBigInt;
24
+ const remainder = valueBigInt * multiplierBigInt - result * denominatorBigInt;
25
+ return { result: Field.from(result), remainder: Field.from(remainder) };
26
+ });
27
+ Gadgets.rangeCheck64(fields.result);
28
+ Gadgets.rangeCheck64(fields.remainder);
29
+ fields.remainder.assertLessThan(denominator.value); // should fail in case the denominator is zero
30
+ fields.result
31
+ .mul(denominator.value)
32
+ .add(fields.remainder)
33
+ .assertEquals(value.value.mul(multiplier.value)); // should fail in case the denominator is zero
34
+ return {
35
+ result: UInt64.Unsafe.fromField(fields.result),
36
+ remainder: UInt64.Unsafe.fromField(fields.remainder),
37
+ };
38
+ }
39
+ //# sourceMappingURL=div.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"div.js","sourceRoot":"","sources":["../../src/div.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEhE,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC;IACvC,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,MAAM;CAClB,CAAC;CAAG;AAEL,MAAM,oBAAqB,SAAQ,MAAM,CAAC;IACxC,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,KAAK;CACjB,CAAC;CAAG;AAEL,MAAM,UAAU,MAAM,CAAC,MAItB;IACC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAClD,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,8CAA8C;IAC/G,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACzD,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QACjD,oGAAoG;QACpG,IAAI,iBAAiB,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/D,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,WAAW,GAAG,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;QACpE,MAAM,SAAS,GACb,WAAW,GAAG,gBAAgB,GAAG,MAAM,GAAG,iBAAiB,CAAC;QAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,8CAA8C;IAClG,MAAM,CAAC,MAAM;SACV,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;SACtB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;SACrB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,8CAA8C;IAClG,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;KACrD,CAAC;AACJ,CAAC"}
package/dist/web/offer.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import { AccountUpdate, method, Permissions, PublicKey, State, state, UInt64, SmartContract, Bool, Field, Struct, } from "o1js";
2
+ import { AccountUpdate, method, Permissions, PublicKey, State, state, UInt64, SmartContract, Bool, Struct, } from "o1js";
3
3
  import { Whitelist } from "@silvana-one/storage";
4
4
  import { FungibleToken } from "./FungibleToken.js";
5
+ import { mulDiv } from "./div.js";
5
6
  export class OfferEvent extends Struct({
6
7
  amount: UInt64,
7
8
  address: PublicKey,
@@ -90,11 +91,11 @@ export class FungibleTokenOfferContract extends SmartContract {
90
91
  const tokenId = tokenContract.deriveTokenId();
91
92
  tokenId.assertEquals(this.tokenId);
92
93
  const price = this.price.getAndRequireEquals();
93
- const totalPriceField = price.value
94
- .mul(amount.value)
95
- .div(Field(1_000_000_000));
96
- totalPriceField.assertLessThan(UInt64.MAXINT().value, "totalPrice overflow");
97
- const totalPrice = UInt64.Unsafe.fromField(totalPriceField);
94
+ const totalPrice = mulDiv({
95
+ value: price,
96
+ multiplier: amount,
97
+ denominator: UInt64.from(1_000_000_000),
98
+ }).result;
98
99
  const buyer = this.sender.getUnconstrained();
99
100
  const buyerUpdate = AccountUpdate.createSigned(buyer);
100
101
  buyerUpdate.send({ to: seller, amount: totalPrice });
@@ -1 +1 @@
1
- {"version":3,"file":"offer.js","sourceRoot":"","sources":["../../src/offer.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EAEb,MAAM,EACN,WAAW,EACX,SAAS,EACT,KAAK,EACL,KAAK,EACL,MAAM,EACN,aAAa,EACb,IAAI,EACJ,KAAK,EACL,MAAM,GACP,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnD,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC;IACrC,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,SAAS;CACnB,CAAC;CAAG;AAEL,MAAM,OAAO,0BAA2B,SAAQ,aAAa;IAA7D;;QACiB,UAAK,GAAG,KAAK,EAAU,CAAC;QACrB,WAAM,GAAG,KAAK,EAAa,CAAC;QAC5B,UAAK,GAAG,KAAK,EAAa,CAAC;QAC3B,cAAS,GAAG,KAAK,EAAa,CAAC;QAcjD,WAAM,GAAG;YACP,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,UAAU;YACf,eAAe,EAAE,SAAS;SAC3B,CAAC;IAgHJ,CAAC;IAjIC,KAAK,CAAC,MAAM,CAAC,IAA2C;QACtD,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC;YAC3B,GAAG,WAAW,CAAC,OAAO,EAAE;YACxB,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE;YACzB,kBAAkB,EAChB,WAAW,CAAC,eAAe,CAAC,8BAA8B,EAAE;YAC9D,cAAc,EAAE,WAAW,CAAC,UAAU,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IASa,AAAN,KAAK,CAAC,UAAU,CACtB,MAAiB,EAAE,0GAA0G;IAC7H,KAAgB,EAChB,MAAc,EACd,KAAa;QAEb,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAgB,CAAC,CAAC;IACrE,CAAC;IAEa,AAAN,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,KAAa;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAClD,kDAAkD;QAClD,KAAK;aACF,MAAM,CAAC,QAAQ,CAAC;aAChB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;aAClC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACxD,YAAY,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5B,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAgB,CAAC,CAAC;IACrE,CAAC;IAEa,AAAN,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,YAAY,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,WAAW,CAAC,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAC3E,WAAW,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAgB,CAAC,CAAC;IACxE,CAAC;IAEa,AAAN,KAAK,CAAC,GAAG,CAAC,MAAc;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;QAC9C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK;aAChC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;aACjB,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7B,eAAe,CAAC,cAAc,CAC5B,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EACrB,qBAAqB,CACtB,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtD,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,WAAW,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,WAAW,CAAC,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAC3E,WAAW,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;QACvD,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,qBAAqB,CAC1B,iBAAiB,CAAC,UAAU,CAAC,yCAAyC,CAAC,CACxE,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAgB,CAAC,CAAC;IAClE,CAAC;IAEa,AAAN,KAAK,CAAC,eAAe,CAAC,SAAoB;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACxD,YAAY,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;CACF;AAtIgB;IAAd,KAAK,CAAC,MAAM,CAAC;;yDAAyB;AACrB;IAAjB,KAAK,CAAC,SAAS,CAAC;;0DAA6B;AAC5B;IAAjB,KAAK,CAAC,SAAS,CAAC;;yDAA4B;AAC3B;IAAjB,KAAK,CAAC,SAAS,CAAC;;6DAAgC;AAqBnC;IAAb,MAAM;;qCACG,SAAS;QACV,SAAS;QACR,MAAM;QACP,MAAM;;4DAYd;AAEa;IAAb,MAAM;;qCAAqB,MAAM,EAAS,MAAM;;uDAuBhD;AAEa;IAAb,MAAM;;qCAAwB,MAAM;;0DAmBpC;AAEa;IAAb,MAAM;;qCAAmB,MAAM;;qDAkC/B;AAEa;IAAb,MAAM;;qCAAkC,SAAS;;iEASjD"}
1
+ {"version":3,"file":"offer.js","sourceRoot":"","sources":["../../src/offer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@silvana-one/token",
3
3
  "description": "Silvana Fungible Token Library",
4
- "version": "0.1.1",
4
+ "version": "0.1.2",
5
5
  "author": "DFST",
6
6
  "bugs": "https://github.com/SilvanaOne/silvana-lib/issues",
7
7
  "dependencies": {
8
8
  "tslib": "^2.8.1"
9
9
  },
10
10
  "devDependencies": {
11
- "@silvana-one/api": "0.1.1",
12
- "@silvana-one/storage": "0.1.1",
11
+ "@silvana-one/api": "0.1.2",
12
+ "@silvana-one/storage": "0.1.2",
13
13
  "@types/node": "^22.10.2",
14
- "esbuild": "^0.24.0",
14
+ "esbuild": "^0.25.0",
15
15
  "o1js": "^2.2.0",
16
16
  "typescript": "^5.7.2"
17
17
  },
@@ -47,8 +47,8 @@
47
47
  "license": "Apache-2.0",
48
48
  "main": "dist/web/index.js",
49
49
  "peerDependencies": {
50
- "@silvana-one/api": "0.1.1",
51
- "@silvana-one/storage": "0.1.1",
50
+ "@silvana-one/api": "0.1.2",
51
+ "@silvana-one/storage": "0.1.2",
52
52
  "o1js": "^2.2.0"
53
53
  },
54
54
  "publishConfig": {
package/src/bid.ts CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  } from "o1js";
15
15
  import { Whitelist } from "@silvana-one/storage";
16
16
  import { FungibleToken } from "./FungibleToken.js";
17
+ import { mulDiv } from "./div.js";
17
18
 
18
19
  export interface FungibleTokenBidContractDeployProps
19
20
  extends Exclude<DeployArgs, undefined> {
@@ -55,14 +56,11 @@ export class FungibleTokenBidContract extends SmartContract {
55
56
  this.account.provedState.requireEquals(Bool(false));
56
57
  amount.equals(UInt64.from(0)).assertFalse();
57
58
 
58
- const totalPriceField = price.value
59
- .mul(amount.value)
60
- .div(Field(1_000_000_000));
61
- totalPriceField.assertLessThan(
62
- UInt64.MAXINT().value,
63
- "totalPrice overflow"
64
- );
65
- const totalPrice = UInt64.Unsafe.fromField(totalPriceField);
59
+ const totalPrice = mulDiv({
60
+ value: price,
61
+ multiplier: amount,
62
+ denominator: UInt64.from(1_000_000_000),
63
+ }).result;
66
64
 
67
65
  const buyer = this.sender.getUnconstrained();
68
66
  const buyerUpdate = AccountUpdate.createSigned(buyer);
@@ -87,14 +85,11 @@ export class FungibleTokenBidContract extends SmartContract {
87
85
  .assertTrue();
88
86
  this.price.set(price);
89
87
 
90
- const totalPriceField = price.value
91
- .mul(amount.value)
92
- .div(Field(1_000_000_000));
93
- totalPriceField.assertLessThan(
94
- UInt64.MAXINT().value,
95
- "totalPrice overflow"
96
- );
97
- const totalPrice = UInt64.Unsafe.fromField(totalPriceField);
88
+ const totalPrice = mulDiv({
89
+ value: price,
90
+ multiplier: amount,
91
+ denominator: UInt64.from(1_000_000_000),
92
+ }).result;
98
93
 
99
94
  const sender = this.sender.getUnconstrained();
100
95
  const buyer = this.buyer.getAndRequireEquals();
@@ -128,14 +123,11 @@ export class FungibleTokenBidContract extends SmartContract {
128
123
  @method async sell(amount: UInt64) {
129
124
  amount.equals(UInt64.from(0)).assertFalse();
130
125
  const price = this.price.getAndRequireEquals();
131
- const totalPriceField = price.value
132
- .mul(amount.value)
133
- .div(Field(1_000_000_000));
134
- totalPriceField.assertLessThan(
135
- UInt64.MAXINT().value,
136
- "totalPrice overflow"
137
- );
138
- const totalPrice = UInt64.Unsafe.fromField(totalPriceField);
126
+ const totalPrice = mulDiv({
127
+ value: price,
128
+ multiplier: amount,
129
+ denominator: UInt64.from(1_000_000_000),
130
+ }).result;
139
131
 
140
132
  this.account.balance.requireBetween(totalPrice, UInt64.MAXINT());
141
133
  const buyer = this.buyer.getAndRequireEquals();
package/src/div.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { Field, Provable, UInt64, Gadgets, Struct } from "o1js";
2
+
3
+ export class MulDivResult extends Struct({
4
+ result: UInt64,
5
+ remainder: UInt64,
6
+ }) {}
7
+
8
+ class MulDivResultInternal extends Struct({
9
+ result: Field,
10
+ remainder: Field,
11
+ }) {}
12
+
13
+ export function mulDiv(params: {
14
+ value: UInt64;
15
+ multiplier: UInt64;
16
+ denominator: UInt64;
17
+ }): MulDivResult {
18
+ const { value, multiplier, denominator } = params;
19
+ denominator.equals(UInt64.zero).assertFalse("division by zero"); // should fail in case the denominator is zero
20
+ const fields = Provable.witness(MulDivResultInternal, () => {
21
+ const valueBigInt = value.toBigInt();
22
+ const multiplierBigInt = multiplier.toBigInt();
23
+ const denominatorBigInt = denominator.toBigInt();
24
+ // handle division by zero for first pass of the prover that can pass zero instead of the real value
25
+ if (denominatorBigInt === 0n) {
26
+ return { result: Field.from(0n), remainder: Field.from(0n) };
27
+ }
28
+ const result = (valueBigInt * multiplierBigInt) / denominatorBigInt;
29
+ const remainder =
30
+ valueBigInt * multiplierBigInt - result * denominatorBigInt;
31
+ return { result: Field.from(result), remainder: Field.from(remainder) };
32
+ });
33
+ Gadgets.rangeCheck64(fields.result);
34
+ Gadgets.rangeCheck64(fields.remainder);
35
+ fields.remainder.assertLessThan(denominator.value); // should fail in case the denominator is zero
36
+ fields.result
37
+ .mul(denominator.value)
38
+ .add(fields.remainder)
39
+ .assertEquals(value.value.mul(multiplier.value)); // should fail in case the denominator is zero
40
+ return {
41
+ result: UInt64.Unsafe.fromField(fields.result),
42
+ remainder: UInt64.Unsafe.fromField(fields.remainder),
43
+ };
44
+ }
package/src/offer.ts CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  } from "o1js";
15
15
  import { Whitelist } from "@silvana-one/storage";
16
16
  import { FungibleToken } from "./FungibleToken.js";
17
+ import { mulDiv } from "./div.js";
17
18
 
18
19
  export interface FungibleTokenOfferContractDeployProps
19
20
  extends Exclude<DeployArgs, undefined> {
@@ -124,14 +125,11 @@ export class FungibleTokenOfferContract extends SmartContract {
124
125
  const tokenId = tokenContract.deriveTokenId();
125
126
  tokenId.assertEquals(this.tokenId);
126
127
  const price = this.price.getAndRequireEquals();
127
- const totalPriceField = price.value
128
- .mul(amount.value)
129
- .div(Field(1_000_000_000));
130
- totalPriceField.assertLessThan(
131
- UInt64.MAXINT().value,
132
- "totalPrice overflow"
133
- );
134
- const totalPrice = UInt64.Unsafe.fromField(totalPriceField);
128
+ const totalPrice = mulDiv({
129
+ value: price,
130
+ multiplier: amount,
131
+ denominator: UInt64.from(1_000_000_000),
132
+ }).result;
135
133
 
136
134
  const buyer = this.sender.getUnconstrained();
137
135
  const buyerUpdate = AccountUpdate.createSigned(buyer);