@gala-chain/launchpad 1.0.9 → 1.0.10
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/CLAUDE.md +279 -0
- package/lib/package.json +2 -2
- package/lib/src/chaincode/launchpad/buyWithNative.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/buyWithNative.js +11 -4
- package/lib/src/chaincode/launchpad/buyWithNative.js.map +1 -1
- package/lib/src/chaincode/launchpad/sellWithNative.d.ts.map +1 -1
- package/lib/src/chaincode/launchpad/sellWithNative.js +9 -1
- package/lib/src/chaincode/launchpad/sellWithNative.js.map +1 -1
- package/lib/src/chaincode/test/launchpadgala.js +1 -1
- package/lib/src/chaincode/test/launchpadgala.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/chaincode/launchpad/buyExactToken.spec.ts +90 -20
- package/src/chaincode/launchpad/buyWithNative.spec.ts +99 -25
- package/src/chaincode/launchpad/buyWithNative.ts +20 -5
- package/src/chaincode/launchpad/callMemeTokenIn.spec.ts +244 -0
- package/src/chaincode/launchpad/callMemeTokenOut.spec.ts +1 -1
- package/src/chaincode/launchpad/callNativeTokenIn.spec.ts +269 -0
- package/src/chaincode/launchpad/callNativeTokenOut.spec.ts +276 -0
- package/src/chaincode/launchpad/configureLaunchpadFeeConfig.spec.ts +202 -0
- package/src/chaincode/launchpad/createSale.spec.ts +259 -0
- package/src/chaincode/launchpad/fetchSaleDetails.spec.ts +141 -0
- package/src/chaincode/launchpad/finalizeTokenAllocation.spec.ts +126 -0
- package/src/chaincode/launchpad/sellExactToken.spec.ts +284 -0
- package/src/chaincode/launchpad/sellWithNative.spec.ts +329 -0
- package/src/chaincode/launchpad/sellWithNative.ts +22 -5
- package/src/chaincode/test/launchpadgala.ts +1 -1
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
GalaChain Launchpad Chaincode - A blockchain smart contract for token sales and DEX operations built on the GalaChain platform.
|
|
7
|
+
|
|
8
|
+
## Development Commands
|
|
9
|
+
|
|
10
|
+
### Build and Compilation
|
|
11
|
+
- `npm run build` - Compile TypeScript to JavaScript
|
|
12
|
+
- `npm run build:watch` - Compile with watch mode
|
|
13
|
+
- `npm run clean` - Clean build artifacts
|
|
14
|
+
|
|
15
|
+
### Code Quality
|
|
16
|
+
- `npm run lint` - Run ESLint on .ts and .js files
|
|
17
|
+
- `npm run fix` - Fix ESLint issues automatically
|
|
18
|
+
- `npm run format` - Format code with Prettier
|
|
19
|
+
|
|
20
|
+
### Testing
|
|
21
|
+
- `npm test` - Run unit tests with Jest (uses RBAC by default)
|
|
22
|
+
- `npm run test:e2e` - Run end-to-end tests
|
|
23
|
+
- `npm run test:e2e-mocked` - Run e2e tests with mocked chaincode
|
|
24
|
+
- `npm run update-snapshot` - Update Jest snapshots
|
|
25
|
+
- Running a single test: Use Jest with specific test file path
|
|
26
|
+
|
|
27
|
+
### Network Operations
|
|
28
|
+
- `npm run network:start` - Start local test network with watch mode
|
|
29
|
+
- `npm run network:up` - Start network with specific contracts
|
|
30
|
+
- `npm run network:prune` - Clean up network
|
|
31
|
+
- `npm run network:recreate` - Full network reset and restart
|
|
32
|
+
|
|
33
|
+
## Architecture
|
|
34
|
+
|
|
35
|
+
### Core Structure
|
|
36
|
+
The codebase follows a chaincode pattern with clear separation:
|
|
37
|
+
|
|
38
|
+
- **src/chaincode/** - Smart contract implementation
|
|
39
|
+
- `LaunchpadContract.ts` - Main contract with all transaction methods
|
|
40
|
+
- `launchpad/` - Individual transaction implementations (buy, sell, trade operations)
|
|
41
|
+
- `dexLaunchpadFeeGate.ts` - Fee calculation and validation logic
|
|
42
|
+
|
|
43
|
+
- **src/api/** - External API layer
|
|
44
|
+
- `types/` - DTOs and data models (LaunchpadSale, LaunchpadFeeConfig, etc.)
|
|
45
|
+
- `validators/` - Custom validation decorators
|
|
46
|
+
- `utils/` - Utility functions
|
|
47
|
+
|
|
48
|
+
### Key Patterns
|
|
49
|
+
1. **Transaction Methods**: Each major operation (buy, sell, trade) is implemented as a separate module in `src/chaincode/launchpad/`
|
|
50
|
+
2. **Fee Management**: Centralized fee logic through fee gates and configuration
|
|
51
|
+
3. **Batch Operations**: Support for batch submit authorities and batch processing
|
|
52
|
+
4. **GalaChain Integration**: Built on GalaChain SDK with GalaContract base class
|
|
53
|
+
|
|
54
|
+
### Dependencies
|
|
55
|
+
- Built on GalaChain SDK (@gala-chain/api, @gala-chain/chaincode)
|
|
56
|
+
- Integrates with @gala-chain/dex for DEX functionality
|
|
57
|
+
- Uses Fabric Contract API for blockchain interactions
|
|
58
|
+
|
|
59
|
+
### Testing Approach
|
|
60
|
+
- Unit tests alongside implementation files (*.spec.ts)
|
|
61
|
+
- E2E tests in separate e2e/ directory
|
|
62
|
+
- RBAC (Role-Based Access Control) enabled by default for tests
|
|
63
|
+
- Test environment configured via .dev-env file
|
|
64
|
+
|
|
65
|
+
## Unit Test Guidelines
|
|
66
|
+
|
|
67
|
+
### Test Structure Pattern
|
|
68
|
+
Follow this consistent pattern for all unit tests:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
describe("Feature Name", () => {
|
|
72
|
+
// Declare reusable variables at describe block level
|
|
73
|
+
let contract: LaunchpadContract;
|
|
74
|
+
let currencyClass: TokenClass;
|
|
75
|
+
let sale: LaunchpadSale;
|
|
76
|
+
let userBalance: TokenBalance;
|
|
77
|
+
// ... other test fixtures
|
|
78
|
+
|
|
79
|
+
beforeEach(() => {
|
|
80
|
+
// Initialize all reusable variables here
|
|
81
|
+
contract = new LaunchpadContract();
|
|
82
|
+
currencyClass = currency.tokenClass();
|
|
83
|
+
// ... setup test data
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should describe expected behavior", async () => {
|
|
87
|
+
// Given - Setup test prerequisites
|
|
88
|
+
const { ctx, contract } = fixture(LaunchpadContract)
|
|
89
|
+
.registeredUsers(users.testUser1)
|
|
90
|
+
.savedState(
|
|
91
|
+
currencyClass,
|
|
92
|
+
sale,
|
|
93
|
+
userBalance
|
|
94
|
+
// ... all required chain state
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const dto = new SomeDto(param1, param2);
|
|
98
|
+
dto.uniqueKey = randomUniqueKey();
|
|
99
|
+
dto.sign(users.testUser1.privateKey);
|
|
100
|
+
|
|
101
|
+
// When - Execute the contract method
|
|
102
|
+
const result = await contract.SomeMethod(ctx, dto);
|
|
103
|
+
|
|
104
|
+
// Then - Verify expected outcomes
|
|
105
|
+
expect(result.Status).toBe(1);
|
|
106
|
+
expect(result.Data?.someProperty).toBe("expectedValue");
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Key Requirements
|
|
112
|
+
|
|
113
|
+
1. **Proper Fixture Setup**: Always use `fixture(ContractClass).registeredUsers(...).savedState(...)` to set up blockchain state
|
|
114
|
+
2. **DTO Construction**: Use proper constructors with required parameters - never construct with empty `new Dto()`
|
|
115
|
+
3. **User Alias Format**: Use `asValidUserAlias("client|username")` format for user identifiers
|
|
116
|
+
4. **Signing**: Always call `dto.sign(user.privateKey)` before submitting DTOs
|
|
117
|
+
5. **State Dependencies**: Include ALL required chain objects (token classes, instances, balances, sales) in `.savedState()`
|
|
118
|
+
|
|
119
|
+
### Common Patterns
|
|
120
|
+
|
|
121
|
+
#### Balance Setup
|
|
122
|
+
```typescript
|
|
123
|
+
const userBalance = plainToInstance(TokenBalance, {
|
|
124
|
+
...currency.tokenBalance(),
|
|
125
|
+
owner: users.testUser1.identityKey,
|
|
126
|
+
quantity: new BigNumber("1000")
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### DTO Creation and Signing
|
|
131
|
+
```typescript
|
|
132
|
+
const dto = new ExactTokenQuantityDto(vaultAddress, new BigNumber("100"));
|
|
133
|
+
dto.expectedNativeToken = new BigNumber("10"); // Optional slippage protection
|
|
134
|
+
dto.uniqueKey = randomUniqueKey();
|
|
135
|
+
dto.sign(users.testUser1.privateKey);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Result Validation
|
|
139
|
+
```typescript
|
|
140
|
+
// Test successful operations
|
|
141
|
+
expect(result.Status).toBe(1);
|
|
142
|
+
expect(result.Data?.outputQuantity).toBe("100");
|
|
143
|
+
|
|
144
|
+
// Test failures
|
|
145
|
+
expect(result.Status).toBe(0);
|
|
146
|
+
expect(result.ErrorKey).toContain("VALIDATION_FAILED");
|
|
147
|
+
expect(result.Message).toContain("expected error text");
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Test Data Management
|
|
151
|
+
- Use helper functions from `src/chaincode/test/` (e.g., `currency`, `launchpadgala`)
|
|
152
|
+
- Create consistent test users via `users.testUser1`, `users.testUser2`, etc.
|
|
153
|
+
- Use `plainToInstance()` to create properly typed test objects
|
|
154
|
+
- Set up complete object graphs - don't leave required properties undefined
|
|
155
|
+
|
|
156
|
+
### User Authorization in Tests
|
|
157
|
+
The `@gala-chain/test` package provides different user types for different testing scenarios:
|
|
158
|
+
|
|
159
|
+
- **`users.admin`**: A Curator user with CuratorOrg privileges. Use for testing methods that require organization-level permissions (e.g., `ConfigureLaunchpadFeeAddress`, `FinalizeTokenAllocation`)
|
|
160
|
+
- **`users.testUser1`, `users.testUser2`, etc.**: Normal end users representing typical client interactions. Use for standard trading operations and user-facing functionality
|
|
161
|
+
|
|
162
|
+
**CuratorOrg Methods**: For methods with `allowedOrgs: ["CuratorOrg"]`, you MUST use the `caClientIdentity` fixture method to set the proper organization context:
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
const { ctx, contract } = fixture(LaunchpadContract)
|
|
166
|
+
.caClientIdentity("test-admin", "CuratorOrg") // Essential for CuratorOrg methods
|
|
167
|
+
.registeredUsers(users.admin)
|
|
168
|
+
.savedState(feeConfig);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Important**: Always use both `caClientIdentity("test-admin", "CuratorOrg")` AND `users.admin` for testing methods that require CuratorOrg privileges, otherwise tests will fail with permission errors.
|
|
172
|
+
|
|
173
|
+
### Key Technical Insights
|
|
174
|
+
|
|
175
|
+
#### DTO Construction Pattern
|
|
176
|
+
*Sometimes* DTOs don't take constructor parameters: If the DTO defines a constructor, it generally uses a constructor. Otherwise, use `plainToInstance` (imported from `class-transformer`) or `createValidDTO` (imported from `@gala-chain/api`).
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// DTO with constructor
|
|
180
|
+
const dto = new ExactTokenQuantityDto(vaultAddress, new BigNumber("100"));
|
|
181
|
+
|
|
182
|
+
// DTO without constructor
|
|
183
|
+
const dto = new ConfigureLaunchpadFeeAddressDto();
|
|
184
|
+
dto.newPlatformFeeAddress = asValidUserAlias("client|feeAddress");
|
|
185
|
+
dto.newFeeAmount = 0.01;
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### Organization Permissions
|
|
189
|
+
Methods like `ConfigureLaunchpadFeeAddress` and `FinalizeTokenAllocation` require CuratorOrg privileges. Always use `users.admin` for testing these methods, not regular test users.
|
|
190
|
+
|
|
191
|
+
#### Bonding Curve Constraints
|
|
192
|
+
Sell operations are mathematically constrained by previous buy operations and token precision limits. The bonding curve calculations can produce high-precision results that may exceed token decimal constraints (typically 10 decimal places).
|
|
193
|
+
|
|
194
|
+
#### Test Data Setup Requirements
|
|
195
|
+
Proper fixture setup requires comprehensive chain state including:
|
|
196
|
+
- Token classes and instances for both native and meme tokens
|
|
197
|
+
- Token balances for all participants (users and sale vaults)
|
|
198
|
+
- LaunchpadSale objects with appropriate initial state
|
|
199
|
+
- Fee configurations when testing fee-related functionality
|
|
200
|
+
|
|
201
|
+
### Execution Testing
|
|
202
|
+
- Always execute actual contract methods, not just internal functions
|
|
203
|
+
- Test both success and failure scenarios
|
|
204
|
+
- Verify state changes through result objects and contract responses
|
|
205
|
+
- Use real cryptographic signing and validation flows
|
|
206
|
+
|
|
207
|
+
### Response Validation Best Practices
|
|
208
|
+
Prefer using `transactionSuccess()` and `transactionError()` helper methods from `@gala-chain/test` over manual status checks:
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
// Given expected inputs and outputs
|
|
212
|
+
const expectedResponse = new SomeResponseDto();
|
|
213
|
+
expectedResponse.someProperty = "expectedValue";
|
|
214
|
+
|
|
215
|
+
// When
|
|
216
|
+
const response = await contract.SomeMethod(ctx, dto);
|
|
217
|
+
|
|
218
|
+
// Then - Use helper methods for better error reporting
|
|
219
|
+
expect(response).toEqual(transactionSuccess(expectedResponse));
|
|
220
|
+
// Instead of: expect(response.Status).toBe(1);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Benefits**:
|
|
224
|
+
- Single assertion compares both status and response properties
|
|
225
|
+
- Detailed error messages show actual vs expected responses
|
|
226
|
+
- Reveals underlying implementation issues (e.g., decimal precision errors)
|
|
227
|
+
- Better test failure diagnostics for debugging
|
|
228
|
+
|
|
229
|
+
## Chaincode Unit Test File Organization
|
|
230
|
+
|
|
231
|
+
Unit test are written in files side-by-side with source code files in `src/`. End-to-End intgration tests go in `e2e/`.
|
|
232
|
+
|
|
233
|
+
### 1:1 File-to-Test Association
|
|
234
|
+
The `src/chaincode/launchpad/` directory generally follows a 1:1 correspondence between implementation files and their test files:
|
|
235
|
+
|
|
236
|
+
- **Implementation files**: `{functionName}.ts` - Contains the core transaction logic
|
|
237
|
+
- **Test files**: `{functionName}.spec.ts` - Contains comprehensive unit tests for the function
|
|
238
|
+
- **Contract mapping**: Each function is exposed as a method in `LaunchpadContract.ts` and exported via `index.ts`
|
|
239
|
+
|
|
240
|
+
This is not a strict rule but is a general convention.
|
|
241
|
+
|
|
242
|
+
### Current Implementation Coverage
|
|
243
|
+
Based on contract methods in `LaunchpadContract.ts`, the following functions should have corresponding files:
|
|
244
|
+
|
|
245
|
+
**Contract Methods → Implementation Files:**
|
|
246
|
+
- `CreateSale` → `createSale.ts`
|
|
247
|
+
- `FetchSaleDetails` → `fetchSaleDetails.ts`
|
|
248
|
+
- `BuyExactToken` → `buyExactToken.ts`
|
|
249
|
+
- `SellExactToken` → `sellExactToken.ts`
|
|
250
|
+
- `BuyWithNative` → `buyWithNative.ts`
|
|
251
|
+
- `SellWithNative` → `sellWithNative.ts`
|
|
252
|
+
- `CallNativeTokenIn` → `callNativeTokenIn.ts`
|
|
253
|
+
- `CallMemeTokenOut` → `callMemeTokenOut.ts`
|
|
254
|
+
- `CallNativeTokenOut` → `callNativeTokenOut.ts`
|
|
255
|
+
- `CallMemeTokenIn` → `callMemeTokenIn.ts`
|
|
256
|
+
- `ConfigureLaunchpadFeeAddress` → `configureLaunchpadFeeConfig.ts`
|
|
257
|
+
- `FinalizeTokenAllocation` → `finalizeTokenAllocation.ts`
|
|
258
|
+
- `FetchLaunchpadFeeAmount` → `fetchLaunchpadFeeAmount.ts`
|
|
259
|
+
- `AuthorizeBatchSubmitter` → `launchpadBatchSubmitAuthorizations.ts`
|
|
260
|
+
- `DeauthorizeBatchSubmitter` → `launchpadBatchSubmitAuthorizations.ts`
|
|
261
|
+
- `GetBatchSubmitAuthorities` → `launchpadBatchSubmitAuthorizations.ts`
|
|
262
|
+
|
|
263
|
+
### Test Coverage Standards
|
|
264
|
+
Each `.spec.ts` file should comprehensively test:
|
|
265
|
+
|
|
266
|
+
1. **Happy Path Scenarios**: Valid inputs producing expected outputs
|
|
267
|
+
3. **Business Logic Edge Cases**: Insufficient balances, expired sales, quantity limits
|
|
268
|
+
5. **State Verification**: Proper updates to balances, sales, and configurations
|
|
269
|
+
|
|
270
|
+
#### Unnecessary coverage
|
|
271
|
+
|
|
272
|
+
1. **Validation Failures**: Invalid DTOs, missing required fields, etc: These cases are tested via class-validator and/or in the defined DTO classes that extend ChainCallDTO or SubmitCallDTO. The `@GalaTransaction` and `@Submit` decorators will always validate DTOs before these methods are executed by the contract.
|
|
273
|
+
2. **Error Conditions**: Network failures, state inconsistencies, concurrent operations, etc. should be tested as needed via integration tests (e2e directory) not unit tests.
|
|
274
|
+
|
|
275
|
+
### Naming Conventions
|
|
276
|
+
- Implementation files use camelCase: `buyExactToken.ts`
|
|
277
|
+
- Test files match with `.spec.ts` suffix: `buyExactToken.spec.ts`
|
|
278
|
+
- Exported function names match the implementation file name
|
|
279
|
+
- Contract method names use PascalCase: `BuyExactToken`
|
package/lib/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gala-chain/launchpad",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "GalaChain Launchpad Chaincode",
|
|
5
5
|
"main": "lib/src/index.js",
|
|
6
6
|
"types": "lib/src/index.d.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@gala-chain/api": "~2.3.4",
|
|
27
27
|
"@gala-chain/chaincode": "~2.3.4",
|
|
28
|
-
"@gala-chain/dex": "1.0.
|
|
28
|
+
"@gala-chain/dex": "1.0.19",
|
|
29
29
|
"@grpc/grpc-js": "1.10.10",
|
|
30
30
|
"decimal.js": "^10.5.0",
|
|
31
31
|
"dotenv": "^16.0.1",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyWithNative.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/buyWithNative.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"buyWithNative.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/buyWithNative.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,gBAAgB,EAMjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAwC,sBAAsB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAO5G;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,gBAAgB,EACrB,WAAW,EAAE,sBAAsB,GAClC,OAAO,CAAC,WAAW,CAAC,CA0HtB"}
|
|
@@ -54,11 +54,17 @@ async function buyWithNative(ctx, buyTokenDTO) {
|
|
|
54
54
|
let tokensToBuy = new bignumber_js_1.default(callMemeTokenOutResult.calculatedQuantity);
|
|
55
55
|
const nativeToken = sale.fetchNativeTokenInstanceKey();
|
|
56
56
|
const memeToken = sale.fetchSellingTokenInstanceKey();
|
|
57
|
+
// Round tokensToBuy based on decimals property of sellToken TokenClass entry,
|
|
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);
|
|
57
63
|
// If vault has fewer tokens than what user wants to buy, cap the purchase
|
|
58
64
|
if (tokensLeftInVault.comparedTo(tokensToBuy) <= 0) {
|
|
59
|
-
tokensToBuy = tokensLeftInVault;
|
|
60
|
-
const
|
|
61
|
-
const callNativeTokenInResult = await (0, callNativeTokenIn_1.callNativeTokenIn)(ctx,
|
|
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);
|
|
62
68
|
transactionFees = callMemeTokenOutResult.extraFees.transactionFees;
|
|
63
69
|
buyTokenDTO.nativeTokenQuantity = new bignumber_js_1.default(callNativeTokenInResult.calculatedQuantity);
|
|
64
70
|
isSaleFinalized = true;
|
|
@@ -66,8 +72,9 @@ async function buyWithNative(ctx, buyTokenDTO) {
|
|
|
66
72
|
// Finalize sale if market cap is reached
|
|
67
73
|
if (buyTokenDTO.nativeTokenQuantity
|
|
68
74
|
.plus(new bignumber_js_1.default(sale.nativeTokenQuantity))
|
|
69
|
-
.gte(new bignumber_js_1.default(types_1.LaunchpadSale.MARKET_CAP)))
|
|
75
|
+
.gte(new bignumber_js_1.default(types_1.LaunchpadSale.MARKET_CAP))) {
|
|
70
76
|
isSaleFinalized = true;
|
|
77
|
+
}
|
|
71
78
|
// Check for slippage condition
|
|
72
79
|
if (buyTokenDTO.expectedToken && buyTokenDTO.expectedToken.comparedTo(tokensToBuy) > 0) {
|
|
73
80
|
throw new error_1.SlippageToleranceExceededError("Tokens expected from this operation are more than the actual amount that will be provided.");
|
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sellWithNative.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/sellWithNative.ts"],"names":[],"mappings":"AAeA,OAAO,
|
|
1
|
+
{"version":3,"file":"sellWithNative.d.ts","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/sellWithNative.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,gBAAgB,EAKjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAiB,sBAAsB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMrF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,sBAAsB,GACnC,OAAO,CAAC,WAAW,CAAC,CAsGtB"}
|
|
@@ -46,6 +46,14 @@ async function sellWithNative(ctx, sellTokenDTO) {
|
|
|
46
46
|
var _a, _b, _c;
|
|
47
47
|
// Fetch and validate the sale object
|
|
48
48
|
const sale = await (0, utils_1.fetchAndValidateSale)(ctx, sellTokenDTO.vaultAddress);
|
|
49
|
+
const { collection, category, type, additionalKey } = sale.sellingToken;
|
|
50
|
+
const sellingTokenCompositeKey = api_1.TokenClass.getCompositeKeyFromParts(api_1.TokenClass.INDEX_KEY, [
|
|
51
|
+
collection,
|
|
52
|
+
category,
|
|
53
|
+
type,
|
|
54
|
+
additionalKey
|
|
55
|
+
]);
|
|
56
|
+
const sellingToken = await (0, chaincode_1.getObjectByKey)(ctx, api_1.TokenClass, sellingTokenCompositeKey);
|
|
49
57
|
const nativeTokensLeftInVault = new bignumber_js_1.default(sale.nativeTokenQuantity);
|
|
50
58
|
// Cap nativeTokenQuantity to the vault balance if the requested amount exceeds it
|
|
51
59
|
if (nativeTokensLeftInVault.comparedTo(sellTokenDTO.nativeTokenQuantity) < 0) {
|
|
@@ -54,7 +62,7 @@ async function sellWithNative(ctx, sellTokenDTO) {
|
|
|
54
62
|
// Calculate how many tokens need to be sold to get the requested native amount
|
|
55
63
|
const callMemeTokenInResult = await (0, callMemeTokenIn_1.callMemeTokenIn)(ctx, sellTokenDTO);
|
|
56
64
|
const transactionFees = callMemeTokenInResult.extraFees.transactionFees;
|
|
57
|
-
const tokensToSell = new bignumber_js_1.default(callMemeTokenInResult.calculatedQuantity);
|
|
65
|
+
const tokensToSell = new bignumber_js_1.default(callMemeTokenInResult.calculatedQuantity).decimalPlaces(sellingToken.decimals);
|
|
58
66
|
const nativeToken = sale.fetchNativeTokenInstanceKey();
|
|
59
67
|
const memeToken = sale.fetchSellingTokenInstanceKey();
|
|
60
68
|
// Enforce slippage tolerance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sellWithNative.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/sellWithNative.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;GAaG;AACH,
|
|
1
|
+
{"version":3,"file":"sellWithNative.js","sourceRoot":"","sources":["../../../../src/chaincode/launchpad/sellWithNative.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;GAaG;AACH,yCAAoE;AACpE,qDAM+B;AAC/B,wEAAqC;AAGrC,iDAAuE;AACvE,oCAA0E;AAC1E,uDAAoD;AACpD,iCAAmD;AAEnD;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,cAAc,CAClC,GAAqB,EACrB,YAAoC;;IAEpC,qCAAqC;IACrC,MAAM,IAAI,GAAkB,MAAM,IAAA,4BAAoB,EAAC,GAAG,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IAEvF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;IACxE,MAAM,wBAAwB,GAAG,gBAAU,CAAC,wBAAwB,CAAC,gBAAU,CAAC,SAAS,EAAE;QACzF,UAAU;QACV,QAAQ;QACR,IAAI;QACJ,aAAa;KACd,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,MAAM,IAAA,0BAAc,EAAC,GAAG,EAAE,gBAAU,EAAE,wBAAwB,CAAC,CAAC;IAErF,MAAM,uBAAuB,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAExE,kFAAkF;IAClF,IAAI,uBAAuB,CAAC,UAAU,CAAC,YAAY,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;QAC5E,MAAM,IAAI,2BAAqB,CAAC,+DAA+D,CAAC,CAAC;KAClG;IAED,+EAA+E;IAC/E,MAAM,qBAAqB,GAAG,MAAM,IAAA,iCAAe,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,CAAC,eAAe,CAAC;IACxE,MAAM,YAAY,GAAG,IAAI,sBAAS,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,aAAa,CACxF,YAAY,CAAC,QAAQ,CACtB,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAEtD,6BAA6B;IAC7B,IAAI,YAAY,CAAC,aAAa,IAAI,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;QACzF,MAAM,IAAI,sCAA8B,CACtC,+FAA+F,CAChG,CAAC;KACH;IAED,mDAAmD;IACnD,kEAAkE;IAClE,MAAM,IAAA,gCAAyB,EAC7B,GAAG,EACH,IAAI,EACJ,YAAY,CAAC,mBAAmB,EAChC,MAAA,YAAY,CAAC,SAAS,0CAAE,mCAAmC,CAC5D,CAAC;IAEF,oDAAoD;IACpD,MAAM,gCAAgC,GAAG,MAAM,IAAA,gCAAwB,EAAC,GAAG,CAAC,CAAC;IAC7E,IAAI,gCAAgC,IAAI,eAAe,EAAE;QACvD,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;YACvB,IAAI,EAAE,GAAG,CAAC,WAAW;YACrB,EAAE,EAAE,gCAAgC,CAAC,UAAU;YAC/C,gBAAgB,EAAE,WAAW;YAC7B,QAAQ,EAAE,IAAI,sBAAS,CAAC,eAAe,CAAC;YACxC,eAAe,EAAE,EAAE;YACnB,kBAAkB,EAAE,SAAS;SAC9B,CAAC,CAAC;KACJ;IAED,sCAAsC;IACtC,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;QACvB,IAAI,EAAE,GAAG,CAAC,WAAW;QACrB,EAAE,EAAE,YAAY,CAAC,YAAY;QAC7B,gBAAgB,EAAE,SAAS;QAC3B,QAAQ,EAAE,YAAY;QACtB,eAAe,EAAE,EAAE;QACnB,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;QACvB,IAAI,EAAE,YAAY,CAAC,YAAY;QAC/B,EAAE,EAAE,GAAG,CAAC,WAAW;QACnB,gBAAgB,EAAE,WAAW;QAC7B,QAAQ,EAAE,YAAY,CAAC,mBAAmB;QAC1C,eAAe,EAAE,EAAE;QACnB,kBAAkB,EAAE;YAClB,eAAe,EAAE,YAAY,CAAC,YAAY;YAC1C,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B;KACF,CAAC,CAAC;IAEH,gCAAgC;IAChC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,IAAA,0BAAc,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAG,MAAM,IAAA,2BAAe,EAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE;QACrC,SAAS,EAAE,IAAI,sBAAS,CAAC,eAAe,CAAC;aACtC,IAAI,CAAC,MAAA,MAAA,YAAY,CAAC,SAAS,0CAAE,mCAAmC,mCAAI,CAAC,CAAC;aACtE,OAAO,EAAE;QACZ,cAAc,EAAE,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAC1D,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,gBAAgB;QAC9B,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE;KACvC,CAAC;AACJ,CAAC;AAzGD,wCAyGC"}
|
|
@@ -33,7 +33,7 @@ const tokenClassKeyPlain = (0, utils_1.createPlainFn)({
|
|
|
33
33
|
const tokenClassPlain = (0, utils_1.createPlainFn)({
|
|
34
34
|
...tokenClassKeyPlain(),
|
|
35
35
|
description: "Generated via automated test suite.",
|
|
36
|
-
decimals:
|
|
36
|
+
decimals: 8,
|
|
37
37
|
image: "https://app.gala.games/test-image-placeholder-url.png",
|
|
38
38
|
isNonFungible: false,
|
|
39
39
|
maxCapacity: new bignumber_js_1.default(100000000000000),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchpadgala.js","sourceRoot":"","sources":["../../../../src/chaincode/test/launchpadgala.ts"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;GAaG;AACH,yCASyB;AACzB,2CAAyC;AACzC,+DAAsF;AACtF,wEAAqC;AAErC,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,mCAAI,MAAM,CAAC;AACpG,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,mCAAI,MAAM,CAAC;AAChG,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,yBAAyB,mCAAI,MAAM,CAAC;AACxF,OAAO,CAAC,GAAG,CAAC,mCAAmC,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,mCAAI,MAAM,CAAC;AAE5G,MAAM,kBAAkB,GAAG,IAAA,qBAAa,EAAC;IACvC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,+BAA+B;IACvD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B;IACnD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IAC3C,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC;CAC/D,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAA,qBAAa,EAAC;IACpC,GAAG,kBAAkB,EAAE;IACvB,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"launchpadgala.js","sourceRoot":"","sources":["../../../../src/chaincode/test/launchpadgala.ts"],"names":[],"mappings":"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"}
|