@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.
- package/dist/node/bid.js +17 -16
- package/dist/node/bid.js.map +1 -1
- package/dist/node/div.d.ts +62 -0
- package/dist/node/div.js +39 -0
- package/dist/node/div.js.map +1 -0
- package/dist/node/index.cjs +348 -304
- package/dist/node/offer.js +7 -6
- package/dist/node/offer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.web.tsbuildinfo +1 -1
- package/dist/web/bid.js +17 -16
- package/dist/web/bid.js.map +1 -1
- package/dist/web/div.d.ts +62 -0
- package/dist/web/div.js +39 -0
- package/dist/web/div.js.map +1 -0
- package/dist/web/offer.js +7 -6
- package/dist/web/offer.js.map +1 -1
- package/package.json +6 -6
- package/src/bid.ts +16 -24
- package/src/div.ts +44 -0
- package/src/offer.ts +6 -8
package/dist/web/div.js
ADDED
|
@@ -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,
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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 });
|
package/dist/web/offer.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
12
|
-
"@silvana-one/storage": "0.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.
|
|
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.
|
|
51
|
-
"@silvana-one/storage": "0.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
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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);
|