@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.
Files changed (68) hide show
  1. package/README.md +1 -0
  2. package/dist/node/BondingCurveAdmin.d.ts +690 -0
  3. package/dist/node/BondingCurveAdmin.js +504 -0
  4. package/dist/node/BondingCurveAdmin.js.map +1 -0
  5. package/dist/node/FungibleToken.d.ts +414 -0
  6. package/dist/node/FungibleToken.js +7 -0
  7. package/dist/node/FungibleToken.js.map +1 -0
  8. package/dist/node/FungibleTokenAdvancedAdmin.d.ts +124 -0
  9. package/dist/node/FungibleTokenAdvancedAdmin.js +226 -0
  10. package/dist/node/FungibleTokenAdvancedAdmin.js.map +1 -0
  11. package/dist/node/FungibleTokenContract.d.ts +526 -0
  12. package/dist/node/FungibleTokenContract.js +295 -0
  13. package/dist/node/FungibleTokenContract.js.map +1 -0
  14. package/dist/node/FungibleTokenStandardAdmin.d.ts +27 -0
  15. package/dist/node/FungibleTokenStandardAdmin.js +101 -0
  16. package/dist/node/FungibleTokenStandardAdmin.js.map +1 -0
  17. package/dist/node/bid.d.ts +86 -0
  18. package/dist/node/bid.js +168 -0
  19. package/dist/node/bid.js.map +1 -0
  20. package/dist/node/claim.d.ts +89 -0
  21. package/dist/node/claim.js +156 -0
  22. package/dist/node/claim.js.map +1 -0
  23. package/dist/node/index.cjs +1576 -0
  24. package/dist/node/index.d.ts +8 -0
  25. package/dist/node/index.js +9 -0
  26. package/dist/node/index.js.map +1 -0
  27. package/dist/node/offer.d.ts +87 -0
  28. package/dist/node/offer.js +169 -0
  29. package/dist/node/offer.js.map +1 -0
  30. package/dist/tsconfig.tsbuildinfo +1 -0
  31. package/dist/tsconfig.web.tsbuildinfo +1 -0
  32. package/dist/web/BondingCurveAdmin.d.ts +690 -0
  33. package/dist/web/BondingCurveAdmin.js +504 -0
  34. package/dist/web/BondingCurveAdmin.js.map +1 -0
  35. package/dist/web/FungibleToken.d.ts +414 -0
  36. package/dist/web/FungibleToken.js +7 -0
  37. package/dist/web/FungibleToken.js.map +1 -0
  38. package/dist/web/FungibleTokenAdvancedAdmin.d.ts +124 -0
  39. package/dist/web/FungibleTokenAdvancedAdmin.js +226 -0
  40. package/dist/web/FungibleTokenAdvancedAdmin.js.map +1 -0
  41. package/dist/web/FungibleTokenContract.d.ts +526 -0
  42. package/dist/web/FungibleTokenContract.js +295 -0
  43. package/dist/web/FungibleTokenContract.js.map +1 -0
  44. package/dist/web/FungibleTokenStandardAdmin.d.ts +27 -0
  45. package/dist/web/FungibleTokenStandardAdmin.js +101 -0
  46. package/dist/web/FungibleTokenStandardAdmin.js.map +1 -0
  47. package/dist/web/bid.d.ts +86 -0
  48. package/dist/web/bid.js +168 -0
  49. package/dist/web/bid.js.map +1 -0
  50. package/dist/web/claim.d.ts +89 -0
  51. package/dist/web/claim.js +156 -0
  52. package/dist/web/claim.js.map +1 -0
  53. package/dist/web/index.d.ts +8 -0
  54. package/dist/web/index.js +9 -0
  55. package/dist/web/index.js.map +1 -0
  56. package/dist/web/offer.d.ts +87 -0
  57. package/dist/web/offer.js +169 -0
  58. package/dist/web/offer.js.map +1 -0
  59. package/package.json +64 -0
  60. package/src/BondingCurveAdmin.ts +590 -0
  61. package/src/FungibleToken.ts +11 -0
  62. package/src/FungibleTokenAdvancedAdmin.ts +260 -0
  63. package/src/FungibleTokenContract.ts +337 -0
  64. package/src/FungibleTokenStandardAdmin.ts +95 -0
  65. package/src/bid.ts +170 -0
  66. package/src/claim.ts +151 -0
  67. package/src/index.ts +8 -0
  68. 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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"}