@gala-chain/launchpad 1.0.13 → 1.0.15
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/lib/package.json +1 -1
- package/lib/src/api/types/LaunchpadDtos.d.ts +3 -1
- package/lib/src/api/types/LaunchpadDtos.d.ts.map +1 -1
- package/lib/src/api/types/LaunchpadDtos.js +14 -1
- package/lib/src/api/types/LaunchpadDtos.js.map +1 -1
- package/lib/src/api/types/LaunchpadSale.d.ts +5 -2
- package/lib/src/api/types/LaunchpadSale.d.ts.map +1 -1
- package/lib/src/api/types/LaunchpadSale.js +35 -9
- package/lib/src/api/types/LaunchpadSale.js.map +1 -1
- package/lib/src/chaincode/LaunchpadContract.js +6 -6
- package/lib/src/chaincode/LaunchpadContract.js.map +1 -1
- package/lib/src/chaincode/launchpad/buyExactToken.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/buyExactToken.js +18 -42
- package/lib/src/chaincode/launchpad/buyExactToken.js.map +1 -1
- package/lib/src/chaincode/launchpad/buyWithNative.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/buyWithNative.js +12 -43
- package/lib/src/chaincode/launchpad/buyWithNative.js.map +1 -1
- package/lib/src/chaincode/launchpad/callMemeTokenIn.d.ts +4 -10
- package/lib/src/chaincode/launchpad/callMemeTokenIn.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/callMemeTokenIn.js +13 -9
- package/lib/src/chaincode/launchpad/callMemeTokenIn.js.map +1 -1
- package/lib/src/chaincode/launchpad/callMemeTokenOut.d.ts +4 -10
- package/lib/src/chaincode/launchpad/callMemeTokenOut.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/callMemeTokenOut.js +46 -22
- package/lib/src/chaincode/launchpad/callMemeTokenOut.js.map +1 -1
- package/lib/src/chaincode/launchpad/callNativeTokenIn.d.ts +4 -10
- package/lib/src/chaincode/launchpad/callNativeTokenIn.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/callNativeTokenIn.js +35 -14
- package/lib/src/chaincode/launchpad/callNativeTokenIn.js.map +1 -1
- package/lib/src/chaincode/launchpad/callNativeTokenOut.d.ts +4 -10
- package/lib/src/chaincode/launchpad/callNativeTokenOut.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/callNativeTokenOut.js +17 -12
- package/lib/src/chaincode/launchpad/callNativeTokenOut.js.map +1 -1
- package/lib/src/chaincode/launchpad/configureLaunchpadFeeConfig.js +1 -1
- package/lib/src/chaincode/launchpad/configureLaunchpadFeeConfig.js.map +1 -1
- package/lib/src/chaincode/launchpad/createSale.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/createSale.js +15 -1
- package/lib/src/chaincode/launchpad/createSale.js.map +1 -1
- package/lib/src/chaincode/launchpad/fees.d.ts +11 -0
- package/lib/src/chaincode/launchpad/fees.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/fees.js +42 -3
- package/lib/src/chaincode/launchpad/fees.js.map +1 -1
- package/lib/src/chaincode/launchpad/finaliseSale.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/finaliseSale.js +7 -4
- package/lib/src/chaincode/launchpad/finaliseSale.js.map +1 -1
- package/lib/src/chaincode/launchpad/sellExactToken.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/sellExactToken.js +14 -23
- package/lib/src/chaincode/launchpad/sellExactToken.js.map +1 -1
- package/lib/src/chaincode/launchpad/sellWithNative.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/sellWithNative.js +10 -19
- package/lib/src/chaincode/launchpad/sellWithNative.js.map +1 -1
- package/lib/src/chaincode/test/launchpadgala.d.ts.map +1 -1
- package/lib/src/chaincode/test/launchpadgala.js +2 -1
- package/lib/src/chaincode/test/launchpadgala.js.map +1 -1
- package/lib/src/chaincode/utils/launchpadSaleUtils.d.ts +4 -0
- package/lib/src/chaincode/utils/launchpadSaleUtils.d.ts.map +1 -1
- package/lib/src/chaincode/utils/launchpadSaleUtils.js +19 -1
- package/lib/src/chaincode/utils/launchpadSaleUtils.js.map +1 -1
- package/lib/src/cli.js +3 -1
- package/lib/src/cli.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/api/types/LaunchpadDtos.ts +15 -1
- package/src/api/types/LaunchpadSale.ts +32 -10
- package/src/chaincode/LaunchpadContract.ts +3 -3
- package/src/chaincode/launchpad/buyExactToken.spec.ts +3 -38
- package/src/chaincode/launchpad/buyExactToken.ts +22 -56
- package/src/chaincode/launchpad/buyWithNative.spec.ts +105 -45
- package/src/chaincode/launchpad/buyWithNative.ts +15 -65
- package/src/chaincode/launchpad/callMemeTokenIn.ts +36 -12
- package/src/chaincode/launchpad/callMemeTokenOut.spec.ts +2 -2
- package/src/chaincode/launchpad/callMemeTokenOut.ts +72 -26
- package/src/chaincode/launchpad/callNativeTokenIn.ts +62 -19
- package/src/chaincode/launchpad/callNativeTokenOut.ts +38 -15
- package/src/chaincode/launchpad/configureLaunchpadFeeConfig.spec.ts +0 -1
- package/src/chaincode/launchpad/configureLaunchpadFeeConfig.ts +1 -1
- package/src/chaincode/launchpad/createSale.ts +26 -3
- package/src/chaincode/launchpad/fees.ts +55 -3
- package/src/chaincode/launchpad/finaliseSale.ts +7 -4
- package/src/chaincode/launchpad/launchpadBatchSubmitAuthorizations.spec.ts +150 -68
- package/src/chaincode/launchpad/sellExactToken.spec.ts +4 -81
- package/src/chaincode/launchpad/sellExactToken.ts +16 -25
- package/src/chaincode/launchpad/sellWithNative.spec.ts +2 -42
- package/src/chaincode/launchpad/sellWithNative.ts +14 -23
- package/src/chaincode/test/launchpadgala.ts +3 -1
- package/src/chaincode/utils/launchpadSaleUtils.ts +25 -1
- package/src/cli.ts +3 -1
|
@@ -16,14 +16,13 @@ const tslib_1 = require("tslib");
|
|
|
16
16
|
* See the License for the specific language governing permissions and
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
|
-
const api_1 = require("@gala-chain/api");
|
|
20
19
|
const chaincode_1 = require("@gala-chain/chaincode");
|
|
21
20
|
const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
|
|
22
21
|
const types_1 = require("../../api/types");
|
|
23
22
|
const error_1 = require("../../api/utils/error");
|
|
24
23
|
const utils_1 = require("../utils");
|
|
25
24
|
const callMemeTokenOut_1 = require("./callMemeTokenOut");
|
|
26
|
-
const
|
|
25
|
+
const fees_1 = require("./fees");
|
|
27
26
|
const finaliseSale_1 = require("./finaliseSale");
|
|
28
27
|
/**
|
|
29
28
|
* Executes the purchase of tokens using a specified amount of native tokens.
|
|
@@ -47,61 +46,31 @@ async function buyWithNative(ctx, buyTokenDTO) {
|
|
|
47
46
|
let isSaleFinalized = false;
|
|
48
47
|
// Fetch and validate sale state
|
|
49
48
|
const sale = await (0, utils_1.fetchAndValidateSale)(ctx, buyTokenDTO.vaultAddress);
|
|
50
|
-
const tokensLeftInVault = new bignumber_js_1.default(sale.sellingTokenQuantity);
|
|
51
49
|
// Calculate how many tokens the user can buy and fee info
|
|
52
50
|
const callMemeTokenOutResult = await (0, callMemeTokenOut_1.callMemeTokenOut)(ctx, buyTokenDTO);
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
const transactionFees = new bignumber_js_1.default(callMemeTokenOutResult.extraFees.transactionFees); // transaction fees
|
|
52
|
+
const nativeTokensRequired = new bignumber_js_1.default(callMemeTokenOutResult.originalQuantity); // number of native tokens user wants to spend
|
|
53
|
+
const tokensToBuy = new bignumber_js_1.default(callMemeTokenOutResult.calculatedQuantity); // number of tokens user will be buying
|
|
55
54
|
const nativeToken = sale.fetchNativeTokenInstanceKey();
|
|
56
55
|
const memeToken = sale.fetchSellingTokenInstanceKey();
|
|
57
|
-
//
|
|
58
|
-
// because otherwise `transferToken()` call below will fail with
|
|
59
|
-
// an INVALID_DECIMALS error.
|
|
60
|
-
const { collection, category, type, additionalKey } = sale.sellingToken;
|
|
61
|
-
const memeTokenClass = await (0, chaincode_1.getObjectByKey)(ctx, api_1.TokenClass, api_1.TokenClass.getCompositeKeyFromParts(api_1.TokenClass.INDEX_KEY, [collection, category, type, additionalKey]));
|
|
62
|
-
tokensToBuy = tokensToBuy.decimalPlaces(memeTokenClass.decimals);
|
|
63
|
-
// If vault has fewer tokens than what user wants to buy, cap the purchase
|
|
64
|
-
if (tokensLeftInVault.comparedTo(tokensToBuy) <= 0) {
|
|
65
|
-
tokensToBuy = tokensLeftInVault.decimalPlaces(memeTokenClass.decimals);
|
|
66
|
-
const nativeTokensRequiredToBuyDto = new types_1.ExactTokenQuantityDto(buyTokenDTO.vaultAddress, tokensToBuy);
|
|
67
|
-
const callNativeTokenInResult = await (0, callNativeTokenIn_1.callNativeTokenIn)(ctx, nativeTokensRequiredToBuyDto);
|
|
68
|
-
transactionFees = callMemeTokenOutResult.extraFees.transactionFees;
|
|
69
|
-
buyTokenDTO.nativeTokenQuantity = new bignumber_js_1.default(callNativeTokenInResult.calculatedQuantity);
|
|
70
|
-
isSaleFinalized = true;
|
|
71
|
-
}
|
|
72
|
-
// Finalize sale if market cap is reached
|
|
56
|
+
// If native tokens required exceeds the market cap, the sale can be finalized
|
|
73
57
|
if (buyTokenDTO.nativeTokenQuantity
|
|
74
58
|
.plus(new bignumber_js_1.default(sale.nativeTokenQuantity))
|
|
75
|
-
.
|
|
59
|
+
.isGreaterThanOrEqualTo(new bignumber_js_1.default(types_1.LaunchpadSale.MARKET_CAP))) {
|
|
76
60
|
isSaleFinalized = true;
|
|
77
61
|
}
|
|
78
62
|
// Check for slippage condition
|
|
79
|
-
if (buyTokenDTO.expectedToken && buyTokenDTO.expectedToken.
|
|
63
|
+
if (buyTokenDTO.expectedToken && buyTokenDTO.expectedToken.isGreaterThan(tokensToBuy)) {
|
|
80
64
|
throw new error_1.SlippageToleranceExceededError(`expected ${buyTokenDTO.expectedToken.toString()}, but only ${tokensToBuy.toString()} tokens can be provided. Reduce the expected amount or adjust your slippage tolerance.`);
|
|
81
65
|
}
|
|
82
66
|
// Transfer transaction fees to launchpad fee address
|
|
83
|
-
|
|
84
|
-
if (launchpadFeeAddressConfiguration && transactionFees) {
|
|
85
|
-
const totalRequired = new bignumber_js_1.default(buyTokenDTO.nativeTokenQuantity).plus(transactionFees);
|
|
86
|
-
const buyerBalance = await (0, chaincode_1.fetchOrCreateBalance)(ctx, ctx.callingUser, sale.nativeToken);
|
|
87
|
-
if (buyerBalance.getQuantityTotal().lt(totalRequired)) {
|
|
88
|
-
throw new api_1.ValidationFailedError(`Insufficient balance: Total amount required including fee is ${totalRequired}`);
|
|
89
|
-
}
|
|
90
|
-
await (0, chaincode_1.transferToken)(ctx, {
|
|
91
|
-
from: ctx.callingUser,
|
|
92
|
-
to: launchpadFeeAddressConfiguration.feeAddress,
|
|
93
|
-
tokenInstanceKey: nativeToken,
|
|
94
|
-
quantity: new bignumber_js_1.default(transactionFees),
|
|
95
|
-
allowancesToUse: [],
|
|
96
|
-
authorizedOnBehalf: undefined
|
|
97
|
-
});
|
|
98
|
-
}
|
|
67
|
+
await (0, fees_1.transferTransactionFees)(ctx, sale, transactionFees, nativeToken, nativeTokensRequired);
|
|
99
68
|
// Transfer native tokens from buyer to vault
|
|
100
69
|
await (0, chaincode_1.transferToken)(ctx, {
|
|
101
70
|
from: ctx.callingUser,
|
|
102
71
|
to: buyTokenDTO.vaultAddress,
|
|
103
72
|
tokenInstanceKey: nativeToken,
|
|
104
|
-
quantity:
|
|
73
|
+
quantity: nativeTokensRequired,
|
|
105
74
|
allowancesToUse: [],
|
|
106
75
|
authorizedOnBehalf: undefined
|
|
107
76
|
});
|
|
@@ -118,7 +87,7 @@ async function buyWithNative(ctx, buyTokenDTO) {
|
|
|
118
87
|
}
|
|
119
88
|
});
|
|
120
89
|
// Update sale object with purchase data
|
|
121
|
-
sale.buyToken(tokensToBuy,
|
|
90
|
+
sale.buyToken(tokensToBuy, nativeTokensRequired);
|
|
122
91
|
await (0, chaincode_1.putChainObject)(ctx, sale);
|
|
123
92
|
// Finalize sale if it's complete
|
|
124
93
|
if (isSaleFinalized) {
|
|
@@ -126,8 +95,8 @@ async function buyWithNative(ctx, buyTokenDTO) {
|
|
|
126
95
|
}
|
|
127
96
|
const token = await (0, chaincode_1.fetchTokenClass)(ctx, sale.sellingToken);
|
|
128
97
|
return {
|
|
129
|
-
inputQuantity:
|
|
130
|
-
totalFees: transactionFees,
|
|
98
|
+
inputQuantity: nativeTokensRequired.toFixed(),
|
|
99
|
+
totalFees: transactionFees.toFixed(),
|
|
131
100
|
outputQuantity: tokensToBuy.toFixed(),
|
|
132
101
|
tokenName: token.name,
|
|
133
102
|
tradeType: "Buy",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyWithNative.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/buyWithNative.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;GAaG;AACH,
|
|
1
|
+
{"version":3,"file":"buyWithNative.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/buyWithNative.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GalaChainContext } from "@gala-chain/chaincode";
|
|
2
|
-
import { NativeTokenQuantityDto } from "../../api/types";
|
|
2
|
+
import { NativeTokenQuantityDto, TradeCalculationResDto } from "../../api/types";
|
|
3
3
|
/**
|
|
4
4
|
* Calculates the number of tokens that can be sold in exchange for a specified amount
|
|
5
5
|
* of native tokens using a bonding curve mechanism.
|
|
@@ -13,16 +13,10 @@ import { NativeTokenQuantityDto } from "../../api/types";
|
|
|
13
13
|
* - `nativeTokenAmount`: The amount of native tokens to be recieved from sale.
|
|
14
14
|
* - `expectedToken` (optional): The expected amount of tokens to be sold.
|
|
15
15
|
*
|
|
16
|
-
* @returns A promise that resolves to a
|
|
17
|
-
*
|
|
16
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
17
|
+
* quantity of tokens to be sent, the original quantity of native tokens used, and extra fees.
|
|
18
18
|
*
|
|
19
19
|
* @throws Error if the calculation results in an invalid amount (e.g., `InvalidAmountError`).
|
|
20
20
|
*/
|
|
21
|
-
export declare function callMemeTokenIn(ctx: GalaChainContext, sellTokenDTO: NativeTokenQuantityDto): Promise<
|
|
22
|
-
calculatedQuantity: string;
|
|
23
|
-
extraFees: {
|
|
24
|
-
reverseBondingCurve: string;
|
|
25
|
-
transactionFees: string;
|
|
26
|
-
};
|
|
27
|
-
}>;
|
|
21
|
+
export declare function callMemeTokenIn(ctx: GalaChainContext, sellTokenDTO: NativeTokenQuantityDto): Promise<TradeCalculationResDto>;
|
|
28
22
|
//# sourceMappingURL=callMemeTokenIn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callMemeTokenIn.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenIn.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAiB,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"callMemeTokenIn.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenIn.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAiB,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA4ChG;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,sBAAsB,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAsBjC"}
|
|
@@ -18,12 +18,13 @@ const tslib_1 = require("tslib");
|
|
|
18
18
|
*/
|
|
19
19
|
const api_1 = require("@gala-chain/api");
|
|
20
20
|
const decimal_js_1 = tslib_1.__importDefault(require("decimal.js"));
|
|
21
|
+
const types_1 = require("../../api/types");
|
|
21
22
|
const utils_1 = require("../utils");
|
|
22
23
|
const fees_1 = require("./fees");
|
|
23
|
-
function calculateMemeTokensRequired(sale, requestedNativeTokenQuantity) {
|
|
24
|
+
function calculateMemeTokensRequired(sale, requestedNativeTokenQuantity, nativeTokenDecimals, sellingTokenDecimals) {
|
|
24
25
|
const totalTokensSold = new decimal_js_1.default(sale.fetchTokensSold()); // current tokens sold / x
|
|
25
|
-
let nativeTokens = new decimal_js_1.default(requestedNativeTokenQuantity.toString());
|
|
26
|
-
const basePrice = new decimal_js_1.default(
|
|
26
|
+
let nativeTokens = new decimal_js_1.default(requestedNativeTokenQuantity.toString()).toDecimalPlaces(nativeTokenDecimals, decimal_js_1.default.ROUND_DOWN);
|
|
27
|
+
const basePrice = new decimal_js_1.default(types_1.LaunchpadSale.BASE_PRICE); // base price / a
|
|
27
28
|
const { exponentFactor, euler, decimals } = (0, utils_1.getBondingConstants)();
|
|
28
29
|
const nativeTokenInVault = new decimal_js_1.default(sale.nativeTokenQuantity);
|
|
29
30
|
if (nativeTokens.greaterThan(nativeTokenInVault)) {
|
|
@@ -32,14 +33,14 @@ function calculateMemeTokensRequired(sale, requestedNativeTokenQuantity) {
|
|
|
32
33
|
const exponent = exponentFactor.mul(totalTokensSold).div(decimals);
|
|
33
34
|
const exp1 = euler.pow(exponent);
|
|
34
35
|
const constantFactor = nativeTokens.mul(exponentFactor).div(basePrice);
|
|
35
|
-
if (exp1.
|
|
36
|
+
if (exp1.lessThanOrEqualTo(constantFactor)) {
|
|
36
37
|
throw new api_1.ValidationFailedError("Cannot sell more tokens than have been bought in this sale.");
|
|
37
38
|
}
|
|
38
39
|
const adjustedExp = exp1.minus(constantFactor);
|
|
39
40
|
const lnAdjustedExp = adjustedExp.ln();
|
|
40
41
|
const tokensSent = totalTokensSold.minus(lnAdjustedExp.mul(decimals).div(exponentFactor));
|
|
41
|
-
const roundedTokenSent = tokensSent.toDecimalPlaces(
|
|
42
|
-
return roundedTokenSent.toFixed();
|
|
42
|
+
const roundedTokenSent = tokensSent.toDecimalPlaces(sellingTokenDecimals, decimal_js_1.default.ROUND_UP);
|
|
43
|
+
return [nativeTokens.toFixed(), roundedTokenSent.toFixed()];
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* Calculates the number of tokens that can be sold in exchange for a specified amount
|
|
@@ -54,16 +55,19 @@ function calculateMemeTokensRequired(sale, requestedNativeTokenQuantity) {
|
|
|
54
55
|
* - `nativeTokenAmount`: The amount of native tokens to be recieved from sale.
|
|
55
56
|
* - `expectedToken` (optional): The expected amount of tokens to be sold.
|
|
56
57
|
*
|
|
57
|
-
* @returns A promise that resolves to a
|
|
58
|
-
*
|
|
58
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
59
|
+
* quantity of tokens to be sent, the original quantity of native tokens used, and extra fees.
|
|
59
60
|
*
|
|
60
61
|
* @throws Error if the calculation results in an invalid amount (e.g., `InvalidAmountError`).
|
|
61
62
|
*/
|
|
62
63
|
async function callMemeTokenIn(ctx, sellTokenDTO) {
|
|
63
64
|
const sale = await (0, utils_1.fetchAndValidateSale)(ctx, sellTokenDTO.vaultAddress);
|
|
64
65
|
const launchpadFeeAddressConfiguration = await (0, utils_1.fetchLaunchpadFeeAddress)(ctx);
|
|
66
|
+
const { nativeTokenDecimals, sellingTokenDecimals } = await (0, utils_1.fetchTokenDecimals)(ctx, sale);
|
|
67
|
+
const [originalQuantity, calculatedQuantity] = calculateMemeTokensRequired(sale, sellTokenDTO.nativeTokenQuantity, nativeTokenDecimals, sellingTokenDecimals);
|
|
65
68
|
return {
|
|
66
|
-
|
|
69
|
+
originalQuantity: originalQuantity,
|
|
70
|
+
calculatedQuantity: calculatedQuantity,
|
|
67
71
|
extraFees: {
|
|
68
72
|
reverseBondingCurve: (0, fees_1.calculateReverseBondingCurveFee)(sale, sellTokenDTO.nativeTokenQuantity).toString(),
|
|
69
73
|
transactionFees: (0, fees_1.calculateTransactionFee)(sellTokenDTO.nativeTokenQuantity, launchpadFeeAddressConfiguration === null || launchpadFeeAddressConfiguration === void 0 ? void 0 : launchpadFeeAddressConfiguration.feeAmount)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callMemeTokenIn.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenIn.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;GAaG;AACH,yCAAwD;AAGxD,oEAAiC;
|
|
1
|
+
{"version":3,"file":"callMemeTokenIn.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenIn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GalaChainContext } from "@gala-chain/chaincode";
|
|
2
|
-
import { NativeTokenQuantityDto } from "../../api/types";
|
|
2
|
+
import { NativeTokenQuantityDto, TradeCalculationResDto } from "../../api/types";
|
|
3
3
|
/**
|
|
4
4
|
* Calculates the number of tokens that can be purchased using a specified amount
|
|
5
5
|
* of native tokens based on a bonding curve mechanism.
|
|
@@ -11,16 +11,10 @@ import { NativeTokenQuantityDto } from "../../api/types";
|
|
|
11
11
|
* @param buyTokenDTO - The data transfer object containing the sale address
|
|
12
12
|
* and the amount of native tokens to spend for the purchase.
|
|
13
13
|
*
|
|
14
|
-
* @returns A promise that resolves to a
|
|
15
|
-
*
|
|
14
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
15
|
+
* quantity of tokens to be received, the original quantity of native tokens used, and extra fees.
|
|
16
16
|
*
|
|
17
17
|
* @throws Error if the calculation results in an invalid state.
|
|
18
18
|
*/
|
|
19
|
-
export declare function callMemeTokenOut(ctx: GalaChainContext, buyTokenDTO: NativeTokenQuantityDto): Promise<
|
|
20
|
-
calculatedQuantity: string;
|
|
21
|
-
extraFees: {
|
|
22
|
-
reverseBondingCurve: string;
|
|
23
|
-
transactionFees: string;
|
|
24
|
-
};
|
|
25
|
-
}>;
|
|
19
|
+
export declare function callMemeTokenOut(ctx: GalaChainContext, buyTokenDTO: NativeTokenQuantityDto): Promise<TradeCalculationResDto>;
|
|
26
20
|
//# sourceMappingURL=callMemeTokenOut.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callMemeTokenOut.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenOut.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAiB,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"callMemeTokenOut.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenOut.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAiB,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA+ChG;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,sBAAsB,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAsDjC"}
|
|
@@ -7,6 +7,34 @@ const decimal_js_1 = tslib_1.__importDefault(require("decimal.js"));
|
|
|
7
7
|
const types_1 = require("../../api/types");
|
|
8
8
|
const utils_1 = require("../utils");
|
|
9
9
|
const fees_1 = require("./fees");
|
|
10
|
+
function calculateTokensPurchasable(nativeTokens, totalTokensSold, nativeTokenDecimals, sellingTokenDecimals) {
|
|
11
|
+
const basePrice = new decimal_js_1.default(types_1.LaunchpadSale.BASE_PRICE);
|
|
12
|
+
const { exponentFactor, euler, decimals } = (0, utils_1.getBondingConstants)();
|
|
13
|
+
// Round native tokens, then calculate tokens based on that rounded amount
|
|
14
|
+
const roundedNativeTokens = nativeTokens.toDecimalPlaces(nativeTokenDecimals, decimal_js_1.default.ROUND_UP);
|
|
15
|
+
// Calculate tokens purchasable: newTokens = (decimals / exponentFactor) * ln((nativeTokens * exponentFactor / basePrice) + e^(exponentFactor * totalTokensSold / decimals)) - totalTokensSold
|
|
16
|
+
// Where:
|
|
17
|
+
// constant = nativeTokens * exponentFactor / basePrice
|
|
18
|
+
// exponent1 = exponentFactor * totalTokensSold / decimals
|
|
19
|
+
// eResult1 = e^(exponent1) = e^(exponentFactor * totalTokensSold / decimals)
|
|
20
|
+
// ethScaled = constant + eResult1 = (nativeTokens * exponentFactor / basePrice) + e^(exponentFactor * totalTokensSold / decimals)
|
|
21
|
+
// lnEthScaled = ln(ethScaled) * decimals
|
|
22
|
+
// lnEthScaledBase = lnEthScaled / exponentFactor = (decimals / exponentFactor) * ln(ethScaled)
|
|
23
|
+
// result = lnEthScaledBase - totalTokensSold
|
|
24
|
+
const constant = roundedNativeTokens.mul(exponentFactor).div(basePrice);
|
|
25
|
+
const exponent1 = exponentFactor.mul(totalTokensSold).div(decimals);
|
|
26
|
+
const eResult1 = euler.pow(exponent1);
|
|
27
|
+
const ethScaled = constant.add(eResult1);
|
|
28
|
+
const lnEthScaled = ethScaled.ln().mul(decimals);
|
|
29
|
+
const lnEthScaledBase = lnEthScaled.div(exponentFactor);
|
|
30
|
+
const result = lnEthScaledBase.minus(totalTokensSold);
|
|
31
|
+
let roundedResult = result.toDecimalPlaces(sellingTokenDecimals, decimal_js_1.default.ROUND_DOWN);
|
|
32
|
+
// Cap total supply to 10 million
|
|
33
|
+
if (roundedResult.add(totalTokensSold).greaterThan(new decimal_js_1.default("1e+7"))) {
|
|
34
|
+
roundedResult = new decimal_js_1.default("1e+7").minus(new decimal_js_1.default(totalTokensSold));
|
|
35
|
+
}
|
|
36
|
+
return [roundedNativeTokens.toFixed(), roundedResult.toFixed()];
|
|
37
|
+
}
|
|
10
38
|
/**
|
|
11
39
|
* Calculates the number of tokens that can be purchased using a specified amount
|
|
12
40
|
* of native tokens based on a bonding curve mechanism.
|
|
@@ -18,8 +46,8 @@ const fees_1 = require("./fees");
|
|
|
18
46
|
* @param buyTokenDTO - The data transfer object containing the sale address
|
|
19
47
|
* and the amount of native tokens to spend for the purchase.
|
|
20
48
|
*
|
|
21
|
-
* @returns A promise that resolves to a
|
|
22
|
-
*
|
|
49
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
50
|
+
* quantity of tokens to be received, the original quantity of native tokens used, and extra fees.
|
|
23
51
|
*
|
|
24
52
|
* @throws Error if the calculation results in an invalid state.
|
|
25
53
|
*/
|
|
@@ -29,39 +57,35 @@ async function callMemeTokenOut(ctx, buyTokenDTO) {
|
|
|
29
57
|
// Initialize total tokens sold
|
|
30
58
|
let totalTokensSold = new decimal_js_1.default(0);
|
|
31
59
|
// Fetch sale details and update parameters if this is not a sale premint calculation
|
|
60
|
+
let sale;
|
|
32
61
|
if (!buyTokenDTO.IsPreMint) {
|
|
33
|
-
|
|
62
|
+
sale = await (0, utils_1.fetchAndValidateSale)(ctx, buyTokenDTO.vaultAddress);
|
|
34
63
|
totalTokensSold = new decimal_js_1.default(sale.fetchTokensSold());
|
|
35
|
-
// Enforce market cap limit
|
|
64
|
+
// Enforce market cap limit, adjust number of native tokens that will be used in the transaction
|
|
65
|
+
// if total GALA tokens will exceed the market cap
|
|
36
66
|
if (nativeTokens
|
|
37
67
|
.add(new decimal_js_1.default(sale.nativeTokenQuantity))
|
|
38
68
|
.greaterThan(new decimal_js_1.default(types_1.LaunchpadSale.MARKET_CAP))) {
|
|
39
69
|
nativeTokens = new decimal_js_1.default(types_1.LaunchpadSale.MARKET_CAP).minus(new decimal_js_1.default(sale.nativeTokenQuantity));
|
|
40
70
|
}
|
|
41
71
|
}
|
|
42
|
-
//
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
const lnEthScaledBase = lnEthScaled.div(exponentFactor);
|
|
52
|
-
const result = lnEthScaledBase.minus(totalTokensSold);
|
|
53
|
-
let roundedResult = result.toDecimalPlaces(18, decimal_js_1.default.ROUND_DOWN);
|
|
54
|
-
// Cap total supply to 10 million
|
|
55
|
-
if (roundedResult.add(totalTokensSold).greaterThan(new decimal_js_1.default("1e+7"))) {
|
|
56
|
-
roundedResult = new decimal_js_1.default("1e+7").minus(new decimal_js_1.default(totalTokensSold));
|
|
57
|
-
}
|
|
72
|
+
// Get token decimals for rounding
|
|
73
|
+
const { nativeTokenDecimals, sellingTokenDecimals } = sale
|
|
74
|
+
? await (0, utils_1.fetchTokenDecimals)(ctx, sale)
|
|
75
|
+
: {
|
|
76
|
+
nativeTokenDecimals: types_1.LaunchpadSale.NATIVE_TOKEN_DECIMALS,
|
|
77
|
+
sellingTokenDecimals: types_1.LaunchpadSale.SELLING_TOKEN_DECIMALS
|
|
78
|
+
};
|
|
79
|
+
// Calculate tokens purchasable using bonding curve math
|
|
80
|
+
const [originalQuantity, calculatedQuantity] = calculateTokensPurchasable(nativeTokens, totalTokensSold, nativeTokenDecimals, sellingTokenDecimals);
|
|
58
81
|
// Fetch fee configuration and return result
|
|
59
82
|
const launchpadFeeAddressConfiguration = await (0, utils_1.fetchLaunchpadFeeAddress)(ctx);
|
|
60
83
|
return {
|
|
61
|
-
|
|
84
|
+
originalQuantity: originalQuantity,
|
|
85
|
+
calculatedQuantity: calculatedQuantity,
|
|
62
86
|
extraFees: {
|
|
63
87
|
reverseBondingCurve: "0",
|
|
64
|
-
transactionFees: (0, fees_1.calculateTransactionFee)((0, bignumber_js_1.default)(
|
|
88
|
+
transactionFees: (0, fees_1.calculateTransactionFee)((0, bignumber_js_1.default)(originalQuantity), launchpadFeeAddressConfiguration === null || launchpadFeeAddressConfiguration === void 0 ? void 0 : launchpadFeeAddressConfiguration.feeAmount)
|
|
65
89
|
}
|
|
66
90
|
};
|
|
67
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callMemeTokenOut.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenOut.ts"],"names":[],"mappings":";;;;AAeA,wEAAqC;AACrC,oEAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"callMemeTokenOut.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callMemeTokenOut.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GalaChainContext } from "@gala-chain/chaincode";
|
|
2
|
-
import { ExactTokenQuantityDto } from "../../api/types";
|
|
2
|
+
import { ExactTokenQuantityDto, TradeCalculationResDto } from "../../api/types";
|
|
3
3
|
/**
|
|
4
4
|
* Calculates the amount of native tokens required to purchase a specified amount
|
|
5
5
|
* of tokens using a bonding curve mechanism.
|
|
@@ -11,16 +11,10 @@ import { ExactTokenQuantityDto } from "../../api/types";
|
|
|
11
11
|
* @param buyTokenDTO - The data transfer object containing the sale address
|
|
12
12
|
* and the exact amount of tokens to be purchased.
|
|
13
13
|
*
|
|
14
|
-
* @returns A promise that resolves to a
|
|
15
|
-
*
|
|
14
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
15
|
+
* quantity of native tokens required for the purchase, the original quantity of tokens used, and extra fees.
|
|
16
16
|
*
|
|
17
17
|
* @throws Error if the calculation encounters an invalid state or data.
|
|
18
18
|
*/
|
|
19
|
-
export declare function callNativeTokenIn(ctx: GalaChainContext, buyTokenDTO: ExactTokenQuantityDto): Promise<
|
|
20
|
-
calculatedQuantity: string;
|
|
21
|
-
extraFees: {
|
|
22
|
-
reverseBondingCurve: string;
|
|
23
|
-
transactionFees: string;
|
|
24
|
-
};
|
|
25
|
-
}>;
|
|
19
|
+
export declare function callNativeTokenIn(ctx: GalaChainContext, buyTokenDTO: ExactTokenQuantityDto): Promise<TradeCalculationResDto>;
|
|
26
20
|
//# sourceMappingURL=callNativeTokenIn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callNativeTokenIn.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenIn.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"callNativeTokenIn.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenIn.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAiB,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA6C/F;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,qBAAqB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CAmCjC"}
|
|
@@ -4,8 +4,33 @@ exports.callNativeTokenIn = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
|
|
6
6
|
const decimal_js_1 = tslib_1.__importDefault(require("decimal.js"));
|
|
7
|
+
const types_1 = require("../../api/types");
|
|
7
8
|
const utils_1 = require("../utils");
|
|
8
9
|
const fees_1 = require("./fees");
|
|
10
|
+
function calculateNativeTokensRequired(tokensToBuy, totalTokensSold, sellingTokenDecimals, nativeTokenDecimals) {
|
|
11
|
+
const basePrice = new decimal_js_1.default(types_1.LaunchpadSale.BASE_PRICE);
|
|
12
|
+
const { exponentFactor, euler, decimals } = (0, utils_1.getBondingConstants)();
|
|
13
|
+
// Round tokens first, then calculate native tokens based on that rounded amount
|
|
14
|
+
const roundedTokensToBuy = tokensToBuy.toDecimalPlaces(sellingTokenDecimals, decimal_js_1.default.ROUND_DOWN);
|
|
15
|
+
// Calculate native tokens required: price = (basePrice / exponentFactor) * (e^(exponentFactor * (totalTokensSold + tokensToBuy) / decimals) - e^(exponentFactor * totalTokensSold / decimals))
|
|
16
|
+
// Where:
|
|
17
|
+
// exponent1 = exponentFactor * (totalTokensSold + tokensToBuy) / decimals
|
|
18
|
+
// exponent2 = exponentFactor * totalTokensSold / decimals
|
|
19
|
+
// eResult1 = e^(exponent1) = e^(exponentFactor * (totalTokensSold + tokensToBuy) / decimals)
|
|
20
|
+
// eResult2 = e^(exponent2) = e^(exponentFactor * totalTokensSold / decimals)
|
|
21
|
+
// constantFactor = basePrice / exponentFactor
|
|
22
|
+
// differenceOfExponentials = eResult1 - eResult2
|
|
23
|
+
// price = constantFactor * differenceOfExponentials
|
|
24
|
+
const exponent1 = exponentFactor.mul(totalTokensSold.add(roundedTokensToBuy)).div(decimals);
|
|
25
|
+
const exponent2 = exponentFactor.mul(totalTokensSold).div(decimals);
|
|
26
|
+
const eResult1 = euler.pow(exponent1);
|
|
27
|
+
const eResult2 = euler.pow(exponent2);
|
|
28
|
+
const constantFactor = basePrice.div(exponentFactor);
|
|
29
|
+
const differenceOfExponentials = eResult1.minus(eResult2);
|
|
30
|
+
const price = constantFactor.mul(differenceOfExponentials);
|
|
31
|
+
const roundedPrice = price.toDecimalPlaces(nativeTokenDecimals, decimal_js_1.default.ROUND_UP);
|
|
32
|
+
return [roundedTokensToBuy.toFixed(), roundedPrice.toFixed()];
|
|
33
|
+
}
|
|
9
34
|
/**
|
|
10
35
|
* Calculates the amount of native tokens required to purchase a specified amount
|
|
11
36
|
* of tokens using a bonding curve mechanism.
|
|
@@ -17,8 +42,8 @@ const fees_1 = require("./fees");
|
|
|
17
42
|
* @param buyTokenDTO - The data transfer object containing the sale address
|
|
18
43
|
* and the exact amount of tokens to be purchased.
|
|
19
44
|
*
|
|
20
|
-
* @returns A promise that resolves to a
|
|
21
|
-
*
|
|
45
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
46
|
+
* quantity of native tokens required for the purchase, the original quantity of tokens used, and extra fees.
|
|
22
47
|
*
|
|
23
48
|
* @throws Error if the calculation encounters an invalid state or data.
|
|
24
49
|
*/
|
|
@@ -26,25 +51,21 @@ async function callNativeTokenIn(ctx, buyTokenDTO) {
|
|
|
26
51
|
const sale = await (0, utils_1.fetchAndValidateSale)(ctx, buyTokenDTO.vaultAddress);
|
|
27
52
|
const totalTokensSold = new decimal_js_1.default(sale.fetchTokensSold());
|
|
28
53
|
let tokensToBuy = new decimal_js_1.default(buyTokenDTO.tokenQuantity.toString());
|
|
29
|
-
|
|
30
|
-
const { exponentFactor, euler, decimals } = (0, utils_1.getBondingConstants)();
|
|
54
|
+
// Adjust tokensToBuy if user is trying to buy more tokens than the total supply
|
|
31
55
|
if (tokensToBuy.add(totalTokensSold).greaterThan(new decimal_js_1.default("1e+7"))) {
|
|
32
56
|
tokensToBuy = new decimal_js_1.default(sale.sellingTokenQuantity);
|
|
33
57
|
}
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const constantFactor = basePrice.div(exponentFactor);
|
|
39
|
-
const differenceOfExponentials = eResult1.minus(eResult2);
|
|
40
|
-
const price = constantFactor.mul(differenceOfExponentials);
|
|
58
|
+
// Get token decimals for rounding
|
|
59
|
+
const { nativeTokenDecimals, sellingTokenDecimals } = await (0, utils_1.fetchTokenDecimals)(ctx, sale);
|
|
60
|
+
// Calculate native tokens required using bonding curve math
|
|
61
|
+
const [originalQuantity, calculatedQuantity] = calculateNativeTokensRequired(tokensToBuy, totalTokensSold, sellingTokenDecimals, nativeTokenDecimals);
|
|
41
62
|
const launchpadFeeAddressConfiguration = await (0, utils_1.fetchLaunchpadFeeAddress)(ctx);
|
|
42
|
-
const roundedPrice = price.toDecimalPlaces(8, decimal_js_1.default.ROUND_UP).toFixed();
|
|
43
63
|
return {
|
|
44
|
-
|
|
64
|
+
originalQuantity: originalQuantity,
|
|
65
|
+
calculatedQuantity: calculatedQuantity,
|
|
45
66
|
extraFees: {
|
|
46
67
|
reverseBondingCurve: "0",
|
|
47
|
-
transactionFees: (0, fees_1.calculateTransactionFee)((0, bignumber_js_1.default)(
|
|
68
|
+
transactionFees: (0, fees_1.calculateTransactionFee)((0, bignumber_js_1.default)(calculatedQuantity), launchpadFeeAddressConfiguration === null || launchpadFeeAddressConfiguration === void 0 ? void 0 : launchpadFeeAddressConfiguration.feeAmount)
|
|
48
69
|
}
|
|
49
70
|
};
|
|
50
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callNativeTokenIn.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenIn.ts"],"names":[],"mappings":";;;;AAeA,wEAAqC;AACrC,oEAAiC;
|
|
1
|
+
{"version":3,"file":"callNativeTokenIn.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenIn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GalaChainContext } from "@gala-chain/chaincode";
|
|
2
|
-
import { ExactTokenQuantityDto } from "../../api/types";
|
|
2
|
+
import { ExactTokenQuantityDto, TradeCalculationResDto } from "../../api/types";
|
|
3
3
|
/**
|
|
4
4
|
* Calculates the amount of native tokens a user would receive when selling
|
|
5
5
|
* a specified amount of tokens based on a bonding curve mechanism.
|
|
@@ -11,17 +11,11 @@ import { ExactTokenQuantityDto } from "../../api/types";
|
|
|
11
11
|
* @param sellTokenDTO - The data transfer object containing the sale address
|
|
12
12
|
* and the exact amount of tokens to be sold.
|
|
13
13
|
*
|
|
14
|
-
* @returns A promise that resolves to a
|
|
15
|
-
*
|
|
14
|
+
* @returns A promise that resolves to a TradeCalculationResDto object containing the calculated
|
|
15
|
+
* quantity of native tokens received, the quantity of tokens required, and extra fees.
|
|
16
16
|
*
|
|
17
17
|
* @throws DefaultError if the calculated new total tokens sold is less than zero
|
|
18
18
|
* or if the input amount is invalid.
|
|
19
19
|
*/
|
|
20
|
-
export declare function callNativeTokenOut(ctx: GalaChainContext, sellTokenDTO: ExactTokenQuantityDto): Promise<
|
|
21
|
-
calculatedQuantity: string;
|
|
22
|
-
extraFees: {
|
|
23
|
-
reverseBondingCurve: string;
|
|
24
|
-
transactionFees: string;
|
|
25
|
-
};
|
|
26
|
-
}>;
|
|
20
|
+
export declare function callNativeTokenOut(ctx: GalaChainContext, sellTokenDTO: ExactTokenQuantityDto): Promise<TradeCalculationResDto>;
|
|
27
21
|
//# sourceMappingURL=callNativeTokenOut.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callNativeTokenOut.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenOut.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAiB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"callNativeTokenOut.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/callNativeTokenOut.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAiB,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AA6C/F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAsBjC"}
|