@silvana-one/token 0.1.0
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/README.md +1 -0
- package/dist/node/BondingCurveAdmin.d.ts +690 -0
- package/dist/node/BondingCurveAdmin.js +504 -0
- package/dist/node/BondingCurveAdmin.js.map +1 -0
- package/dist/node/FungibleToken.d.ts +414 -0
- package/dist/node/FungibleToken.js +7 -0
- package/dist/node/FungibleToken.js.map +1 -0
- package/dist/node/FungibleTokenAdvancedAdmin.d.ts +124 -0
- package/dist/node/FungibleTokenAdvancedAdmin.js +226 -0
- package/dist/node/FungibleTokenAdvancedAdmin.js.map +1 -0
- package/dist/node/FungibleTokenContract.d.ts +526 -0
- package/dist/node/FungibleTokenContract.js +295 -0
- package/dist/node/FungibleTokenContract.js.map +1 -0
- package/dist/node/FungibleTokenStandardAdmin.d.ts +27 -0
- package/dist/node/FungibleTokenStandardAdmin.js +101 -0
- package/dist/node/FungibleTokenStandardAdmin.js.map +1 -0
- package/dist/node/bid.d.ts +86 -0
- package/dist/node/bid.js +168 -0
- package/dist/node/bid.js.map +1 -0
- package/dist/node/claim.d.ts +89 -0
- package/dist/node/claim.js +156 -0
- package/dist/node/claim.js.map +1 -0
- package/dist/node/index.cjs +1576 -0
- package/dist/node/index.d.ts +8 -0
- package/dist/node/index.js +9 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/offer.d.ts +87 -0
- package/dist/node/offer.js +169 -0
- package/dist/node/offer.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/tsconfig.web.tsbuildinfo +1 -0
- package/dist/web/BondingCurveAdmin.d.ts +690 -0
- package/dist/web/BondingCurveAdmin.js +504 -0
- package/dist/web/BondingCurveAdmin.js.map +1 -0
- package/dist/web/FungibleToken.d.ts +414 -0
- package/dist/web/FungibleToken.js +7 -0
- package/dist/web/FungibleToken.js.map +1 -0
- package/dist/web/FungibleTokenAdvancedAdmin.d.ts +124 -0
- package/dist/web/FungibleTokenAdvancedAdmin.js +226 -0
- package/dist/web/FungibleTokenAdvancedAdmin.js.map +1 -0
- package/dist/web/FungibleTokenContract.d.ts +526 -0
- package/dist/web/FungibleTokenContract.js +295 -0
- package/dist/web/FungibleTokenContract.js.map +1 -0
- package/dist/web/FungibleTokenStandardAdmin.d.ts +27 -0
- package/dist/web/FungibleTokenStandardAdmin.js +101 -0
- package/dist/web/FungibleTokenStandardAdmin.js.map +1 -0
- package/dist/web/bid.d.ts +86 -0
- package/dist/web/bid.js +168 -0
- package/dist/web/bid.js.map +1 -0
- package/dist/web/claim.d.ts +89 -0
- package/dist/web/claim.js +156 -0
- package/dist/web/claim.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.js +9 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/offer.d.ts +87 -0
- package/dist/web/offer.js +169 -0
- package/dist/web/offer.js.map +1 -0
- package/package.json +64 -0
- package/src/BondingCurveAdmin.ts +590 -0
- package/src/FungibleToken.ts +11 -0
- package/src/FungibleTokenAdvancedAdmin.ts +260 -0
- package/src/FungibleTokenContract.ts +337 -0
- package/src/FungibleTokenStandardAdmin.ts +95 -0
- package/src/bid.ts +170 -0
- package/src/claim.ts +151 -0
- package/src/index.ts +8 -0
- package/src/offer.ts +164 -0
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { AccountUpdate, Bool, method, Permissions, Provable, PublicKey, TokenContract, State, state, UInt64, VerificationKey, Field, Struct, Int64, UInt32, fetchAccount, Mina, } from "o1js";
|
|
3
|
+
import { FungibleTokenContract, } from "@silvana-one/token";
|
|
4
|
+
/**
|
|
5
|
+
* Default bonding curve:
|
|
6
|
+
* Initial price: 1 MINA per 100,000 tokens (0.00001 MINA per token), or 10_000 / 10 ** 9
|
|
7
|
+
* Curve K: 1 MINA per 100,000 tokens (0.00001 MINA per token), or 10_000 / 10 ** 9 MINA
|
|
8
|
+
* Owner fee: 10% in 0.001 % units(10 * 1000 = 10_000)
|
|
9
|
+
* Price formula: price = startPrice + curveK * totalSupply
|
|
10
|
+
* Example:
|
|
11
|
+
* If supply is 200,000 tokens, price = 1 MINA + 1 MINA * 200_000 / 100_000 = 3 MINA per 100,000 tokens
|
|
12
|
+
* or per token in MINA/1e9
|
|
13
|
+
* 10000 + 10000 * 200_000 / 100_000 = 30000 per token,
|
|
14
|
+
* or 30_000 * 100_000 = 3_000_000_000, or 3 MINA per 100,000 tokens
|
|
15
|
+
*
|
|
16
|
+
* To calculate the max supply for the given price for 100,000 tokens:
|
|
17
|
+
* price = startPrice + curveK * totalSupply
|
|
18
|
+
* price - startPrice = curveK * totalSupply
|
|
19
|
+
* (price - startPrice) / curveK = totalSupply
|
|
20
|
+
* (3 MINA - 1 MINA) / 1 MINA = 2 * 100_000 = 200_000 tokens
|
|
21
|
+
* (30_000 - 10_000) / 10_000 = 2 * 100_000 = 200_000 tokens
|
|
22
|
+
* or, in 1e9 units:
|
|
23
|
+
* (30_000 - 10_000) * 1e9 * 100_000 / 10_000 = 200_000_000_000_000, or to avoid overflow,
|
|
24
|
+
* (30_000 - 10_000) * 1e9 / 10_000 * 100_000 = 200_000_000_000_000
|
|
25
|
+
*/
|
|
26
|
+
export class BondingCurveParams extends Struct({
|
|
27
|
+
startPrice: UInt64,
|
|
28
|
+
curveK: UInt64,
|
|
29
|
+
fee: UInt32, // 1000 = 1%
|
|
30
|
+
mintingIsAllowed: Bool,
|
|
31
|
+
}) {
|
|
32
|
+
pack() {
|
|
33
|
+
return Field.fromBits([
|
|
34
|
+
...this.startPrice.value.toBits(64),
|
|
35
|
+
...this.curveK.value.toBits(64),
|
|
36
|
+
...this.fee.value.toBits(32),
|
|
37
|
+
this.mintingIsAllowed,
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
static unpack(field) {
|
|
41
|
+
const bits = field.toBits(64 + 64 + 32 + 1);
|
|
42
|
+
const startPrice = UInt64.Unsafe.fromField(Field.fromBits(bits.slice(0, 64)));
|
|
43
|
+
const curveK = UInt64.Unsafe.fromField(Field.fromBits(bits.slice(64, 64 + 64)));
|
|
44
|
+
const fee = UInt32.Unsafe.fromField(Field.fromBits(bits.slice(64 + 64, 64 + 64 + 32)));
|
|
45
|
+
const mintingIsAllowed = bits[64 + 64 + 32];
|
|
46
|
+
return new BondingCurveParams({
|
|
47
|
+
startPrice,
|
|
48
|
+
curveK,
|
|
49
|
+
fee,
|
|
50
|
+
mintingIsAllowed,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export class BondingMintEvent extends Struct({
|
|
55
|
+
to: PublicKey,
|
|
56
|
+
amount: UInt64,
|
|
57
|
+
price: UInt64,
|
|
58
|
+
payment: UInt64,
|
|
59
|
+
fee: UInt64,
|
|
60
|
+
}) {
|
|
61
|
+
}
|
|
62
|
+
export class BondingRedeemEvent extends Struct({
|
|
63
|
+
seller: PublicKey,
|
|
64
|
+
amount: UInt64,
|
|
65
|
+
payment: UInt64,
|
|
66
|
+
minBalance: UInt64,
|
|
67
|
+
maxSupply: UInt64,
|
|
68
|
+
fee: UInt64,
|
|
69
|
+
}) {
|
|
70
|
+
}
|
|
71
|
+
export class BondingCurveAdminInitializeProps extends Struct({
|
|
72
|
+
tokenAddress: PublicKey,
|
|
73
|
+
startPrice: UInt64,
|
|
74
|
+
curveK: UInt64,
|
|
75
|
+
feeMaster: PublicKey,
|
|
76
|
+
fee: UInt32, // 1000 = 1%
|
|
77
|
+
launchFee: UInt64,
|
|
78
|
+
numberOfNewAccounts: UInt64,
|
|
79
|
+
}) {
|
|
80
|
+
}
|
|
81
|
+
export class FungibleTokenBondingCurveAdmin extends TokenContract {
|
|
82
|
+
constructor() {
|
|
83
|
+
super(...arguments);
|
|
84
|
+
this.owner = State(PublicKey.empty());
|
|
85
|
+
this.token = State(PublicKey.empty());
|
|
86
|
+
this.feeMaster = State(PublicKey.empty());
|
|
87
|
+
this.curve = State();
|
|
88
|
+
this.insideMint = State(Bool(false));
|
|
89
|
+
this.events = {
|
|
90
|
+
mint: BondingMintEvent,
|
|
91
|
+
redeem: BondingRedeemEvent,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async deploy(props) {
|
|
95
|
+
await super.deploy(props);
|
|
96
|
+
this.curve.set(new BondingCurveParams({
|
|
97
|
+
startPrice: UInt64.from(10_000),
|
|
98
|
+
curveK: UInt64.from(10_000),
|
|
99
|
+
fee: UInt32.from(1000),
|
|
100
|
+
mintingIsAllowed: Bool(false),
|
|
101
|
+
}).pack());
|
|
102
|
+
this.account.permissions.set({
|
|
103
|
+
...Permissions.default(),
|
|
104
|
+
setVerificationKey: Permissions.VerificationKey.impossibleDuringCurrentVersion(),
|
|
105
|
+
setPermissions: Permissions.impossible(),
|
|
106
|
+
send: Permissions.proof(),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async approveBase(forest) {
|
|
110
|
+
throw Error("Transfer not allowed");
|
|
111
|
+
}
|
|
112
|
+
async initialize(props) {
|
|
113
|
+
const { tokenAddress, feeMaster, startPrice, curveK, fee, launchFee, numberOfNewAccounts, } = props;
|
|
114
|
+
this.account.provedState.requireEquals(Bool(false));
|
|
115
|
+
this.token.set(tokenAddress);
|
|
116
|
+
this.feeMaster.set(feeMaster);
|
|
117
|
+
this.curve.set(new BondingCurveParams({
|
|
118
|
+
startPrice,
|
|
119
|
+
curveK,
|
|
120
|
+
fee,
|
|
121
|
+
mintingIsAllowed: Bool(false),
|
|
122
|
+
}).pack());
|
|
123
|
+
/*
|
|
124
|
+
We cannot constrain the circulating supply of the token,
|
|
125
|
+
as the error Can't transfer to/from the circulation account
|
|
126
|
+
is thrown for ANY AccountUpdate for the circulation tracking account
|
|
127
|
+
so we keep the copy if the circulation amount here and sync sometimes
|
|
128
|
+
in the case the user burns tokens without calling the redeem method
|
|
129
|
+
*/
|
|
130
|
+
const supplyUpdate = AccountUpdate.createSigned(this.address, this.deriveTokenId());
|
|
131
|
+
let permissions = Permissions.default();
|
|
132
|
+
permissions.send = Permissions.none();
|
|
133
|
+
permissions.setPermissions = Permissions.impossible();
|
|
134
|
+
supplyUpdate.account.permissions.set(permissions);
|
|
135
|
+
const payment = launchFee.add(numberOfNewAccounts.mul(UInt64.from(1_000_000_000)));
|
|
136
|
+
const owner = this.sender.getUnconstrained();
|
|
137
|
+
const ownerUpdate = AccountUpdate.create(owner);
|
|
138
|
+
ownerUpdate.requireSignature();
|
|
139
|
+
this.owner.set(owner);
|
|
140
|
+
ownerUpdate.body.useFullCommitment = Bool(true);
|
|
141
|
+
ownerUpdate.account.balance.requireBetween(payment, UInt64.MAXINT());
|
|
142
|
+
ownerUpdate.balance.subInPlace(payment);
|
|
143
|
+
const feeUpdate = AccountUpdate.create(feeMaster);
|
|
144
|
+
feeUpdate.balance.addInPlace(launchFee);
|
|
145
|
+
}
|
|
146
|
+
async mint(to, amount, price) {
|
|
147
|
+
this.insideMint.getAndRequireEquals().assertEquals(Bool(false));
|
|
148
|
+
this.insideMint.set(Bool(true));
|
|
149
|
+
const tokenAddress = this.token.getAndRequireEquals();
|
|
150
|
+
const token = new BondingCurveFungibleToken(tokenAddress);
|
|
151
|
+
const { startPrice, curveK, fee, mintingIsAllowed } = BondingCurveParams.unpack(this.curve.getAndRequireEquals());
|
|
152
|
+
const buyer = this.sender.getUnconstrained();
|
|
153
|
+
const buyerUpdate = AccountUpdate.create(buyer);
|
|
154
|
+
buyerUpdate.requireSignature();
|
|
155
|
+
buyerUpdate.body.useFullCommitment = Bool(true);
|
|
156
|
+
const owner = this.owner.getAndRequireEquals();
|
|
157
|
+
const isOwner = owner.equals(buyer);
|
|
158
|
+
const canMint = isOwner.or(mintingIsAllowed);
|
|
159
|
+
canMint.assertTrue("Minting is disabled for this token");
|
|
160
|
+
this.curve.set(new BondingCurveParams({
|
|
161
|
+
startPrice,
|
|
162
|
+
curveK,
|
|
163
|
+
fee,
|
|
164
|
+
mintingIsAllowed: Bool(true),
|
|
165
|
+
}).pack());
|
|
166
|
+
/*
|
|
167
|
+
* (price - startPrice) / curveK = totalSupply
|
|
168
|
+
* (3 MINA - 1 MINA) / 1 MINA = 2 * 100_000 = 200_000 tokens
|
|
169
|
+
* (30_000 - 10_000) / 10_000 = 2 * 100_000 = 200_000 tokens
|
|
170
|
+
* or, in 1e9 units:
|
|
171
|
+
* (30_000 - 10_000) * 1e9 * 100_000 / 10_000 = 200_000_000_000_000, or to avoid overflow,
|
|
172
|
+
* (30_000 - 10_000) * 1e9 / 10_000 * 100_000 = 200_000_000_000_000
|
|
173
|
+
* (price - startPrice) * 1e9 / curveK * 100_000 = maximumSupply
|
|
174
|
+
* maximumSupply * curveK = (price - startPrice) * 1e14
|
|
175
|
+
* maximumSupply * curveK + startPrice * 1e14 = price * 1e14
|
|
176
|
+
*
|
|
177
|
+
*/
|
|
178
|
+
const maximumSupplyField = Provable.witness(Field, () => {
|
|
179
|
+
if (price.toBigInt() < startPrice.toBigInt()) {
|
|
180
|
+
throw Error("Price must be greater than or equal to the start price");
|
|
181
|
+
}
|
|
182
|
+
return Field.from(((price.toBigInt() - startPrice.toBigInt()) * 10n ** 14n) /
|
|
183
|
+
curveK.toBigInt());
|
|
184
|
+
});
|
|
185
|
+
maximumSupplyField
|
|
186
|
+
.mul(curveK.value)
|
|
187
|
+
.add(startPrice.value.mul(Field.from(10 ** 14)))
|
|
188
|
+
.assertLessThanOrEqual(price.value.mul(Field.from(10 ** 14)));
|
|
189
|
+
maximumSupplyField.assertLessThan(UInt64.MAXINT().value);
|
|
190
|
+
const maximumSupply = UInt64.Unsafe.fromField(maximumSupplyField);
|
|
191
|
+
const supplyUpdate = AccountUpdate.create(this.address, this.deriveTokenId());
|
|
192
|
+
supplyUpdate.account.balance.requireBetween(UInt64.zero, maximumSupply);
|
|
193
|
+
amount.assertLessThanOrEqual(UInt64.from(2n ** 62n));
|
|
194
|
+
supplyUpdate.balanceChange = Int64.fromUnsigned(amount);
|
|
195
|
+
const paymentField = Provable.witness(Field, () => {
|
|
196
|
+
let payment = (price.toBigInt() * amount.toBigInt()) / 10n ** 9n;
|
|
197
|
+
if (payment * 10n ** 9n !== price.toBigInt() * amount.toBigInt()) {
|
|
198
|
+
payment++;
|
|
199
|
+
}
|
|
200
|
+
if (payment * 10n ** 9n < price.toBigInt() * amount.toBigInt()) {
|
|
201
|
+
throw Error("Payment calculation failed");
|
|
202
|
+
}
|
|
203
|
+
return Field.from(payment);
|
|
204
|
+
});
|
|
205
|
+
paymentField
|
|
206
|
+
.mul(Field.from(10 ** 9))
|
|
207
|
+
.assertGreaterThanOrEqual(price.value.mul(amount.value));
|
|
208
|
+
paymentField.assertLessThan(UInt64.MAXINT().value);
|
|
209
|
+
const payment = UInt64.Unsafe.fromField(paymentField);
|
|
210
|
+
const feePaymentField = Provable.witness(Field, () => {
|
|
211
|
+
let feePayment = (payment.toBigInt() * fee.toBigint()) / 100000n;
|
|
212
|
+
if (feePayment * 100000n !== payment.toBigInt() * fee.toBigint()) {
|
|
213
|
+
feePayment++;
|
|
214
|
+
}
|
|
215
|
+
if (feePayment * 100000n < payment.toBigInt() * fee.toBigint()) {
|
|
216
|
+
throw Error("Fee calculation failed");
|
|
217
|
+
}
|
|
218
|
+
return Field.from(feePayment);
|
|
219
|
+
});
|
|
220
|
+
feePaymentField
|
|
221
|
+
.mul(Field.from(100_000))
|
|
222
|
+
.assertGreaterThanOrEqual(payment.value.mul(fee.value));
|
|
223
|
+
feePaymentField.assertLessThan(UInt64.MAXINT().value);
|
|
224
|
+
let feePayment = UInt64.Unsafe.fromField(feePaymentField);
|
|
225
|
+
feePayment = Provable.if(feePayment.lessThan(UInt64.from(100_000_000)), UInt64.from(100_000_000), feePayment);
|
|
226
|
+
const tokenUpdate = await token.mint(to, amount);
|
|
227
|
+
const isNew = tokenUpdate.account.isNew.get();
|
|
228
|
+
const totalPayment = payment
|
|
229
|
+
.add(feePayment)
|
|
230
|
+
.add(Provable.if(isNew, UInt64.from(1_000_000_000), UInt64.zero));
|
|
231
|
+
buyerUpdate.account.balance.requireBetween(totalPayment, UInt64.MAXINT());
|
|
232
|
+
buyerUpdate.balance.subInPlace(totalPayment);
|
|
233
|
+
this.balance.addInPlace(payment);
|
|
234
|
+
const feeUpdate = AccountUpdate.create(this.feeMaster.getAndRequireEquals());
|
|
235
|
+
feeUpdate.body.useFullCommitment = Bool(true);
|
|
236
|
+
feeUpdate.balance.addInPlace(feePayment);
|
|
237
|
+
this.emitEvent("mint", new BondingMintEvent({
|
|
238
|
+
to,
|
|
239
|
+
amount,
|
|
240
|
+
price,
|
|
241
|
+
payment,
|
|
242
|
+
fee: feePayment,
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
/*
|
|
246
|
+
In case of other txs being included in the same block, the balance and supply may change.
|
|
247
|
+
We need to ensure that the balance is at least minBalance and the supply is at most maxSupply.
|
|
248
|
+
It is recommended to put 5% buffer for minBalance and 5% buffer for maxSupply for tx to succeed.
|
|
249
|
+
*/
|
|
250
|
+
async redeem(amount, minPrice, slippage) {
|
|
251
|
+
const tokenAddress = this.token.getAndRequireEquals();
|
|
252
|
+
const token = new BondingCurveFungibleToken(tokenAddress);
|
|
253
|
+
const balance = await Provable.witnessAsync(UInt64, async () => {
|
|
254
|
+
await fetchAccount({
|
|
255
|
+
publicKey: this.address,
|
|
256
|
+
tokenId: this.tokenId,
|
|
257
|
+
});
|
|
258
|
+
const balance = Mina.getAccount(this.address, this.tokenId).balance;
|
|
259
|
+
console.log("redeem: balance", balance.toBigInt());
|
|
260
|
+
return balance;
|
|
261
|
+
});
|
|
262
|
+
slippage.assertLessThan(UInt32.from(1000));
|
|
263
|
+
const minBalanceField = Provable.witness(Field, () => {
|
|
264
|
+
let minBalance = (balance.toBigInt() * (1000n - slippage.toBigint())) / 1000n;
|
|
265
|
+
if (minBalance * 1000n !==
|
|
266
|
+
balance.toBigInt() * (1000n - slippage.toBigint())) {
|
|
267
|
+
minBalance++;
|
|
268
|
+
}
|
|
269
|
+
if (minBalance * 1000n <
|
|
270
|
+
balance.toBigInt() * (1000n - slippage.toBigint())) {
|
|
271
|
+
throw Error("Min balance calculation failed");
|
|
272
|
+
}
|
|
273
|
+
return Field.from(minBalance);
|
|
274
|
+
});
|
|
275
|
+
minBalanceField
|
|
276
|
+
.mul(Field.from(1000))
|
|
277
|
+
.add(balance.value.mul(slippage.value))
|
|
278
|
+
.assertGreaterThanOrEqual(balance.value.mul(Field.from(1000)));
|
|
279
|
+
minBalanceField.assertLessThan(UInt64.MAXINT().value);
|
|
280
|
+
const minBalance = UInt64.Unsafe.fromField(minBalanceField);
|
|
281
|
+
this.account.balance.requireBetween(minBalance, UInt64.MAXINT());
|
|
282
|
+
const supply = await Provable.witnessAsync(UInt64, async () => {
|
|
283
|
+
await fetchAccount({
|
|
284
|
+
publicKey: this.address,
|
|
285
|
+
tokenId: this.deriveTokenId(),
|
|
286
|
+
});
|
|
287
|
+
const balance = Mina.getAccount(this.address, this.deriveTokenId()).balance;
|
|
288
|
+
console.log("redeem: supply", balance.toBigInt());
|
|
289
|
+
return balance;
|
|
290
|
+
});
|
|
291
|
+
supply.assertGreaterThanOrEqual(amount);
|
|
292
|
+
supply.assertGreaterThan(UInt64.zero);
|
|
293
|
+
const maxSupplyField = Provable.witness(Field, () => Field.from((supply.toBigInt() * (1000n + slippage.toBigint())) / 1000n));
|
|
294
|
+
maxSupplyField
|
|
295
|
+
.mul(Field.from(1000))
|
|
296
|
+
.assertLessThanOrEqual(supply.value.mul(Field.from(1000).add(slippage.value)));
|
|
297
|
+
maxSupplyField.assertLessThan(UInt64.MAXINT().value);
|
|
298
|
+
const maxSupply = UInt64.Unsafe.fromField(maxSupplyField);
|
|
299
|
+
const supplyUpdate = AccountUpdate.create(this.address, this.deriveTokenId());
|
|
300
|
+
supplyUpdate.account.balance.requireBetween(UInt64.zero, maxSupply);
|
|
301
|
+
supplyUpdate.balanceChange = Int64.fromUnsigned(amount).neg();
|
|
302
|
+
// We avoid modular division that is not working in case there is remainder
|
|
303
|
+
const paymentField = Provable.witness(Field, () => Field.from((minBalance.toBigInt() * amount.toBigInt()) / maxSupply.toBigInt()));
|
|
304
|
+
// We use assertLessThanOrEqual to handle the case when there is remainder
|
|
305
|
+
paymentField
|
|
306
|
+
.mul(maxSupply.value)
|
|
307
|
+
.assertLessThanOrEqual(minBalance.value.mul(amount.value));
|
|
308
|
+
paymentField.assertLessThan(Field.from(2n ** 62n));
|
|
309
|
+
amount.value
|
|
310
|
+
.mul(minPrice.value)
|
|
311
|
+
.assertLessThanOrEqual(paymentField.mul(Field.from(10 ** 9)));
|
|
312
|
+
const payment = UInt64.Unsafe.fromField(paymentField);
|
|
313
|
+
const { fee, mintingIsAllowed } = BondingCurveParams.unpack(this.curve.getAndRequireEquals());
|
|
314
|
+
mintingIsAllowed.assertTrue("Minting is disabled for this token, nothing to redeem");
|
|
315
|
+
let feePayment = Provable.witness(UInt64, () => {
|
|
316
|
+
let feePayment = (payment.toBigInt() * fee.toBigint()) / 100000n;
|
|
317
|
+
if (feePayment * 100000n !== payment.toBigInt() * fee.toBigint()) {
|
|
318
|
+
feePayment++;
|
|
319
|
+
}
|
|
320
|
+
if (feePayment * 100000n < payment.toBigInt() * fee.toBigint()) {
|
|
321
|
+
throw Error("Fee calculation failed");
|
|
322
|
+
}
|
|
323
|
+
return UInt64.from(feePayment);
|
|
324
|
+
});
|
|
325
|
+
feePayment = Provable.if(feePayment.lessThan(UInt64.from(100_000_000)), UInt64.from(100_000_000), feePayment);
|
|
326
|
+
const seller = this.sender.getUnconstrained();
|
|
327
|
+
const sellerUpdate = AccountUpdate.create(seller);
|
|
328
|
+
const isNew = await Provable.witnessAsync(Bool, async () => {
|
|
329
|
+
const sellerAccount = await fetchAccount({
|
|
330
|
+
publicKey: seller,
|
|
331
|
+
});
|
|
332
|
+
return Bool(sellerAccount.account === undefined);
|
|
333
|
+
});
|
|
334
|
+
sellerUpdate.account.isNew.requireEquals(isNew);
|
|
335
|
+
const accountCreationFee = Provable.if(isNew, UInt64.from(1_000_000_000), UInt64.zero);
|
|
336
|
+
payment.assertGreaterThan(feePayment.add(accountCreationFee));
|
|
337
|
+
sellerUpdate.requireSignature();
|
|
338
|
+
sellerUpdate.body.useFullCommitment = Bool(true);
|
|
339
|
+
const totalPayment = Provable.witness(UInt64, () => {
|
|
340
|
+
if (payment.toBigInt() <
|
|
341
|
+
feePayment.toBigInt() + accountCreationFee.toBigInt()) {
|
|
342
|
+
console.error(`The redeem amount ${Number(payment.toBigInt() / 10n ** 6n) / 1000} MINA is too low to cover the fee ${Number(feePayment.toBigInt() / 10n ** 6n) / 1000} MINA and account creation fee ${Number(accountCreationFee.toBigInt() / 10n ** 6n) / 1000} MINA for the account ${seller.toBase58()}`, {
|
|
343
|
+
payment: payment.toBigInt(),
|
|
344
|
+
feePayment: feePayment.toBigInt(),
|
|
345
|
+
accountCreationFee: accountCreationFee.toBigInt(),
|
|
346
|
+
minBalance: minBalance.toBigInt(),
|
|
347
|
+
maxSupply: maxSupply.toBigInt(),
|
|
348
|
+
supply: supply.toBigInt(),
|
|
349
|
+
amount: amount.toBigInt(),
|
|
350
|
+
balance: balance.toBigInt(),
|
|
351
|
+
tokenAddress: tokenAddress.toBase58(),
|
|
352
|
+
seller: seller.toBase58(),
|
|
353
|
+
isNew: isNew.toBoolean(),
|
|
354
|
+
});
|
|
355
|
+
throw Error(`The redeem amount ${Number(payment.toBigInt() / 10n ** 6n) / 1000} MINA is too low to cover the fee ${Number(feePayment.toBigInt() / 10n ** 6n) / 1000} MINA and account creation fee ${Number(accountCreationFee.toBigInt() / 10n ** 6n) / 1000} MINA for the account ${seller.toBase58()}`);
|
|
356
|
+
}
|
|
357
|
+
return UInt64.from(payment.toBigInt() -
|
|
358
|
+
feePayment.toBigInt() -
|
|
359
|
+
accountCreationFee.toBigInt());
|
|
360
|
+
});
|
|
361
|
+
totalPayment.add(feePayment).add(accountCreationFee).assertEquals(payment);
|
|
362
|
+
sellerUpdate.balance.addInPlace(totalPayment);
|
|
363
|
+
const feeUpdate = AccountUpdate.create(this.feeMaster.getAndRequireEquals());
|
|
364
|
+
feeUpdate.body.useFullCommitment = Bool(true);
|
|
365
|
+
feeUpdate.balance.addInPlace(feePayment);
|
|
366
|
+
this.balance.subInPlace(payment);
|
|
367
|
+
await token.burn(seller, amount);
|
|
368
|
+
this.emitEvent("redeem", new BondingRedeemEvent({
|
|
369
|
+
seller,
|
|
370
|
+
amount,
|
|
371
|
+
payment,
|
|
372
|
+
minBalance,
|
|
373
|
+
maxSupply,
|
|
374
|
+
fee: feePayment,
|
|
375
|
+
}));
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* In case the user burned tokens without calling the redeem method,
|
|
379
|
+
* we need to sync the supply to the actual circulated supply
|
|
380
|
+
*/
|
|
381
|
+
async sync() {
|
|
382
|
+
const tokenAddress = this.token.getAndRequireEquals();
|
|
383
|
+
const token = new BondingCurveFungibleToken(tokenAddress);
|
|
384
|
+
const supplyUpdate = AccountUpdate.create(this.address, this.deriveTokenId());
|
|
385
|
+
const circulatingSupply = await token.getBalanceOf(tokenAddress);
|
|
386
|
+
const totalSupply = supplyUpdate.account.balance.getAndRequireEquals();
|
|
387
|
+
supplyUpdate.balanceChange = Int64.fromUnsigned(totalSupply.sub(circulatingSupply)).neg();
|
|
388
|
+
}
|
|
389
|
+
/** Update the verification key.
|
|
390
|
+
* Note that because we have set the permissions for setting the verification key to `impossibleDuringCurrentVersion()`, this will only be possible in case of a protocol update that requires an update.
|
|
391
|
+
*/
|
|
392
|
+
async updateVerificationKey(vk) {
|
|
393
|
+
this.account.verificationKey.set(vk);
|
|
394
|
+
}
|
|
395
|
+
ensureOwnerSignature() {
|
|
396
|
+
const owner = this.owner.getAndRequireEquals();
|
|
397
|
+
const update = AccountUpdate.createSigned(owner);
|
|
398
|
+
update.body.useFullCommitment = Bool(true);
|
|
399
|
+
return update;
|
|
400
|
+
}
|
|
401
|
+
async canMint(_accountUpdate) {
|
|
402
|
+
this.insideMint.requireEquals(Bool(true));
|
|
403
|
+
this.insideMint.set(Bool(false));
|
|
404
|
+
return Bool(true);
|
|
405
|
+
}
|
|
406
|
+
async canChangeAdmin(_admin) {
|
|
407
|
+
this.ensureOwnerSignature();
|
|
408
|
+
return Bool(true);
|
|
409
|
+
}
|
|
410
|
+
async canPause() {
|
|
411
|
+
this.ensureOwnerSignature();
|
|
412
|
+
return Bool(true);
|
|
413
|
+
}
|
|
414
|
+
async canResume() {
|
|
415
|
+
this.ensureOwnerSignature();
|
|
416
|
+
return Bool(true);
|
|
417
|
+
}
|
|
418
|
+
async canChangeVerificationKey(_vk) {
|
|
419
|
+
this.ensureOwnerSignature();
|
|
420
|
+
return Bool(true);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
__decorate([
|
|
424
|
+
state(PublicKey),
|
|
425
|
+
__metadata("design:type", Object)
|
|
426
|
+
], FungibleTokenBondingCurveAdmin.prototype, "owner", void 0);
|
|
427
|
+
__decorate([
|
|
428
|
+
state(PublicKey),
|
|
429
|
+
__metadata("design:type", Object)
|
|
430
|
+
], FungibleTokenBondingCurveAdmin.prototype, "token", void 0);
|
|
431
|
+
__decorate([
|
|
432
|
+
state(PublicKey),
|
|
433
|
+
__metadata("design:type", Object)
|
|
434
|
+
], FungibleTokenBondingCurveAdmin.prototype, "feeMaster", void 0);
|
|
435
|
+
__decorate([
|
|
436
|
+
state(Field),
|
|
437
|
+
__metadata("design:type", Object)
|
|
438
|
+
], FungibleTokenBondingCurveAdmin.prototype, "curve", void 0);
|
|
439
|
+
__decorate([
|
|
440
|
+
state(Bool),
|
|
441
|
+
__metadata("design:type", Object)
|
|
442
|
+
], FungibleTokenBondingCurveAdmin.prototype, "insideMint", void 0);
|
|
443
|
+
__decorate([
|
|
444
|
+
method,
|
|
445
|
+
__metadata("design:type", Function),
|
|
446
|
+
__metadata("design:paramtypes", [BondingCurveAdminInitializeProps]),
|
|
447
|
+
__metadata("design:returntype", Promise)
|
|
448
|
+
], FungibleTokenBondingCurveAdmin.prototype, "initialize", null);
|
|
449
|
+
__decorate([
|
|
450
|
+
method,
|
|
451
|
+
__metadata("design:type", Function),
|
|
452
|
+
__metadata("design:paramtypes", [PublicKey, UInt64, UInt64]),
|
|
453
|
+
__metadata("design:returntype", Promise)
|
|
454
|
+
], FungibleTokenBondingCurveAdmin.prototype, "mint", null);
|
|
455
|
+
__decorate([
|
|
456
|
+
method,
|
|
457
|
+
__metadata("design:type", Function),
|
|
458
|
+
__metadata("design:paramtypes", [UInt64, UInt64, UInt32]),
|
|
459
|
+
__metadata("design:returntype", Promise)
|
|
460
|
+
], FungibleTokenBondingCurveAdmin.prototype, "redeem", null);
|
|
461
|
+
__decorate([
|
|
462
|
+
method,
|
|
463
|
+
__metadata("design:type", Function),
|
|
464
|
+
__metadata("design:paramtypes", []),
|
|
465
|
+
__metadata("design:returntype", Promise)
|
|
466
|
+
], FungibleTokenBondingCurveAdmin.prototype, "sync", null);
|
|
467
|
+
__decorate([
|
|
468
|
+
method,
|
|
469
|
+
__metadata("design:type", Function),
|
|
470
|
+
__metadata("design:paramtypes", [VerificationKey]),
|
|
471
|
+
__metadata("design:returntype", Promise)
|
|
472
|
+
], FungibleTokenBondingCurveAdmin.prototype, "updateVerificationKey", null);
|
|
473
|
+
__decorate([
|
|
474
|
+
method.returns(Bool),
|
|
475
|
+
__metadata("design:type", Function),
|
|
476
|
+
__metadata("design:paramtypes", [AccountUpdate]),
|
|
477
|
+
__metadata("design:returntype", Promise)
|
|
478
|
+
], FungibleTokenBondingCurveAdmin.prototype, "canMint", null);
|
|
479
|
+
__decorate([
|
|
480
|
+
method.returns(Bool),
|
|
481
|
+
__metadata("design:type", Function),
|
|
482
|
+
__metadata("design:paramtypes", [PublicKey]),
|
|
483
|
+
__metadata("design:returntype", Promise)
|
|
484
|
+
], FungibleTokenBondingCurveAdmin.prototype, "canChangeAdmin", null);
|
|
485
|
+
__decorate([
|
|
486
|
+
method.returns(Bool),
|
|
487
|
+
__metadata("design:type", Function),
|
|
488
|
+
__metadata("design:paramtypes", []),
|
|
489
|
+
__metadata("design:returntype", Promise)
|
|
490
|
+
], FungibleTokenBondingCurveAdmin.prototype, "canPause", null);
|
|
491
|
+
__decorate([
|
|
492
|
+
method.returns(Bool),
|
|
493
|
+
__metadata("design:type", Function),
|
|
494
|
+
__metadata("design:paramtypes", []),
|
|
495
|
+
__metadata("design:returntype", Promise)
|
|
496
|
+
], FungibleTokenBondingCurveAdmin.prototype, "canResume", null);
|
|
497
|
+
__decorate([
|
|
498
|
+
method.returns(Bool),
|
|
499
|
+
__metadata("design:type", Function),
|
|
500
|
+
__metadata("design:paramtypes", [VerificationKey]),
|
|
501
|
+
__metadata("design:returntype", Promise)
|
|
502
|
+
], FungibleTokenBondingCurveAdmin.prototype, "canChangeVerificationKey", null);
|
|
503
|
+
export const BondingCurveFungibleToken = FungibleTokenContract(FungibleTokenBondingCurveAdmin);
|
|
504
|
+
//# sourceMappingURL=BondingCurveAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BondingCurveAdmin.js","sourceRoot":"","sources":["../../src/BondingCurveAdmin.ts"],"names":[],"mappings":"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"}
|