diff --git a/contracts/scripts/token_tx.ral b/contracts/scripts/token_tx.ral index 5605b58..82ebb2c 100644 --- a/contracts/scripts/token_tx.ral +++ b/contracts/scripts/token_tx.ral @@ -1,3 +1,9 @@ TxScript Withdraw(token: TokenFaucet, amount: U256) { token.withdraw(amount) } + +TxScript Airdrop(tokenOne: TokenFaucet, amountOne: U256, tokenTwo: TokenFaucet, amountTwo: U256, tokenThree: TokenFaucet, amountThree: U256) { + tokenOne.withdraw(amountOne) + tokenTwo.withdraw(amountTwo) + tokenThree.withdraw(amountThree) +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 434a7c4..52c7d5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@invariant-labs/alph-sdk", - "version": "0.0.12", + "version": "0.0.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@invariant-labs/alph-sdk", - "version": "0.0.12", + "version": "0.0.13", "license": "GPL", "dependencies": { "@alephium/cli": "^1.7.3", diff --git a/package.json b/package.json index 58866fc..0de06ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@invariant-labs/alph-sdk", - "version": "0.0.12", + "version": "0.0.13", "collaborators": [ "Invariant Labs" ], diff --git a/scripts/package-lock.json b/scripts/package-lock.json index 945e8a3..d51f76e 100644 --- a/scripts/package-lock.json +++ b/scripts/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@invariant-labs/alph-sdk": "file:../.", + "@invariant-labs/alph-sdk": "file:..", "dotenv": "^16.4.5", "invariant-old": "npm:@invariant-labs/alph-sdk@=0.0.8" }, @@ -30,7 +30,7 @@ }, "..": { "name": "@invariant-labs/alph-sdk", - "version": "0.0.8", + "version": "0.0.12", "license": "GPL", "dependencies": { "@alephium/cli": "^1.7.3", @@ -2551,9 +2551,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", "funding": [ { "type": "opencollective", @@ -2970,9 +2970,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.29", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==", "license": "ISC" }, "node_modules/elliptic": { diff --git a/scripts/package.json b/scripts/package.json index 2e0b0d1..aff1c41 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -7,11 +7,12 @@ "build": "tsc", "start": "tsc && node dist/index.js", "deploy-tokens": "npx tsc && node dist/deploy-tokens.js", - "setup": "npx tsc && node dist/setup.js", - "replace-code": "npx tsc && node dist/replace-code.js" + "replace-code": "npx tsc && node dist/replace-code.js", + "setup-testnet": "npx tsc && node dist/setup-testnet.js", + "setup-devnet": "npx tsc && node dist/setup-devnet.js" }, "dependencies": { - "@invariant-labs/alph-sdk": "file:../.", + "@invariant-labs/alph-sdk": "file:..", "invariant-old": "npm:@invariant-labs/alph-sdk@=0.0.8", "dotenv": "^16.4.5" }, @@ -19,7 +20,8 @@ "@types/chai": "^4.3.17", "chai": "^5.1.1", "@typescript-eslint/eslint-plugin": "^7.13.0", - "@typescript-eslint/parser": "^7.13.0", "eslint": "^8.37.0", + "@typescript-eslint/parser": "^7.13.0", + "eslint": "^8.37.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "typescript": "^5.4.5" diff --git a/scripts/src/setup-devnet.ts b/scripts/src/setup-devnet.ts new file mode 100644 index 0000000..48d74f0 --- /dev/null +++ b/scripts/src/setup-devnet.ts @@ -0,0 +1,153 @@ +import { + FEE_TIERS, + Invariant, + Network, + FungibleToken, + PoolKey, + calculateTick, + newPoolKey, + priceToSqrtPrice, + toPercentage, + setOfficialNodeProvider, + TokenAmount, + ALPH_TOKEN_ID, + Price, + Percentage, + getLiquidityByX, + SqrtPrice, + getSigner, + ONE_ALPH +} from '@invariant-labs/alph-sdk' +import dotenv from 'dotenv' + +dotenv.config() + +const main = async () => { + setOfficialNodeProvider(Network.Devnet) + + const account = await getSigner(ONE_ALPH * 100n) + + console.log(`Deployer: ${account.address}`) + const invariant = await Invariant.deploy(account, toPercentage(1n, 2n)) + console.log(`Invariant: ${invariant.instance.address.toString()}`) + + for (const feeTier of FEE_TIERS) { + await invariant.addFeeTier(account, feeTier) + } + console.log('Successfully added fee tiers') + + const BTCTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Bitcoin', 'BTC', 8n) + const ETHTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Ether', 'ETH', 18n) + const USDCTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'USDC', 'USDC', 6n) + const USDTTokenID = await FungibleToken.deploy( + account, + 0n as TokenAmount, + 'Tether USD', + 'USDT', + 6n + ) + const SOLTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Solana', 'SOL', 9n) + const decimals = { + [BTCTokenID]: 8n, + [ETHTokenID]: 18n, + [USDCTokenID]: 6n, + [USDTTokenID]: 6n, + [SOLTokenID]: 9n, + [ALPH_TOKEN_ID]: 18n + } + console.log( + `BTC: ${BTCTokenID}, ETH: ${ETHTokenID}, USDC: ${USDCTokenID}, USDT: ${USDTTokenID}, SOL: ${SOLTokenID}` + ) + + const response = await fetch( + 'https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=bitcoin,ethereum,alephium,solana' + ) + const data = await response.json() + const prices = { + [BTCTokenID]: data.find((coin: any) => coin.id === 'bitcoin').current_price, + [ETHTokenID]: data.find((coin: any) => coin.id === 'ethereum').current_price, + [USDCTokenID]: 1, + [USDTTokenID]: 1, + [SOLTokenID]: data.find((coin: any) => coin.id === 'solana').current_price, + [ALPH_TOKEN_ID]: data.find((coin: any) => coin.id === 'alephium').current_price + } + console.log( + `BTC: ${prices[BTCTokenID]}, ETH: ${prices[ETHTokenID]}, USDC: ${prices[USDCTokenID]}, USDT: ${prices[USDTTokenID]}, SOL: ${prices[SOLTokenID]}, ALPH: ${prices[ALPH_TOKEN_ID]}` + ) + + const poolKeys: PoolKey[] = [ + newPoolKey(BTCTokenID, ETHTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, USDCTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, USDCTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(USDCTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(USDCTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(USDTTokenID, SOLTokenID, FEE_TIERS[1]) + ] + for (const poolKey of poolKeys) { + const price = + (1 / (prices[poolKey.tokenY] / prices[poolKey.tokenX])) * + 10 ** (Number(decimals[poolKey.tokenY]) - Number(decimals[poolKey.tokenX])) * + 10 ** 24 + try { + const poolSqrtPrice = priceToSqrtPrice(BigInt(Math.round(price)) as Price) + await invariant.createPool(account, poolKey, poolSqrtPrice) + } catch (e) { + console.log('Create pool error', poolKey, e) + } + } + console.log('Successfully added pools') + + const token = FungibleToken.load() + await token.mint(account, (2n ** 96n - 1n) as TokenAmount, BTCTokenID) + await token.mint(account, (2n ** 96n - 1n) as TokenAmount, ETHTokenID) + await token.mint(account, (2n ** 96n - 1n) as TokenAmount, USDCTokenID) + await token.mint(account, (2n ** 96n - 1n) as TokenAmount, USDTTokenID) + await token.mint(account, (2n ** 96n - 1n) as TokenAmount, SOLTokenID) + for (const poolKey of poolKeys) { + const price = + (1 / (prices[poolKey.tokenY] / prices[poolKey.tokenX])) * + 10 ** (Number(decimals[poolKey.tokenY]) - Number(decimals[poolKey.tokenX])) * + 10 ** 24 + const lowerSqrtPrice = priceToSqrtPrice(BigInt(Math.round(price * 0.95)) as Price) + const upperSqrtPrice = priceToSqrtPrice(BigInt(Math.round(price * 1.05)) as Price) + const poolSqrtPrice = priceToSqrtPrice(BigInt(Math.round(price)) as Price) + try { + const lowerTick = calculateTick(lowerSqrtPrice, FEE_TIERS[1].tickSpacing) + const upperTick = calculateTick(upperSqrtPrice, FEE_TIERS[1].tickSpacing) + const tokenXAmount = BigInt( + Math.round((5000 / prices[poolKey.tokenX]) * 10 ** Number(decimals[poolKey.tokenX])) + ) + const { l: liquidity } = getLiquidityByX( + tokenXAmount as TokenAmount, + lowerTick, + upperTick, + poolSqrtPrice as SqrtPrice, + true + ) + const approvedAmountX = await token.getBalanceOf(account.address, poolKey.tokenX) + const approvedAmountY = await token.getBalanceOf(account.address, poolKey.tokenY) + await invariant.createPosition( + account, + poolKey, + lowerTick, + upperTick, + liquidity, + approvedAmountX, + approvedAmountY, + poolSqrtPrice, + 0n as Percentage + ) + } catch (e) { + console.log('Create position error', poolKey, e) + } + } + console.log('Successfully created positions') + + process.exit(0) +} + +main() diff --git a/scripts/src/setup.ts b/scripts/src/setup-testnet.ts similarity index 62% rename from scripts/src/setup.ts rename to scripts/src/setup-testnet.ts index c49319e..4406914 100644 --- a/scripts/src/setup.ts +++ b/scripts/src/setup-testnet.ts @@ -13,8 +13,9 @@ import { TokenAmount, ALPH_TOKEN_ID, Price, - Liquidity, - Percentage + Percentage, + getLiquidityByX, + SqrtPrice } from '@invariant-labs/alph-sdk' import dotenv from 'dotenv' @@ -36,7 +37,7 @@ const main = async () => { console.log('Successfully added fee tiers') const BTCTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Bitcoin', 'BTC', 8n) - const ETHTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Ether', 'ETH', 12n) + const ETHTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Ether', 'ETH', 18n) const USDCTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'USDC', 'USDC', 6n) const USDTTokenID = await FungibleToken.deploy( account, @@ -45,11 +46,10 @@ const main = async () => { 'USDT', 6n ) - const SOLTokenID = await FungibleToken.deploy(account, 0n as TokenAmount, 'Solana', 'SOL', 9n) const decimals = { [BTCTokenID]: 8n, - [ETHTokenID]: 12n, + [ETHTokenID]: 18n, [USDCTokenID]: 6n, [USDTTokenID]: 6n, [SOLTokenID]: 9n, @@ -75,24 +75,19 @@ const main = async () => { `BTC: ${prices[BTCTokenID]}, ETH: ${prices[ETHTokenID]}, USDC: ${prices[USDCTokenID]}, USDT: ${prices[USDTTokenID]}, SOL: ${prices[SOLTokenID]}, ALPH: ${prices[ALPH_TOKEN_ID]}` ) - const poolKeys: [PoolKey, bigint][] = [ - // [newPoolKey(ALPH_TOKEN_ID, BTCTokenID, FEE_TIERS[1]), 10804609546189987720n], - // [newPoolKey(ALPH_TOKEN_ID, ETHTokenID, FEE_TIERS[1]), 4711830510277394610468n], - // [newPoolKey(ALPH_TOKEN_ID, USDCTokenID, FEE_TIERS[1]), 272063075569508447756n], - // [newPoolKey(ALPH_TOKEN_ID, USDTTokenID, FEE_TIERS[1]), 272063075569508447756n], - // [newPoolKey(ALPH_TOKEN_ID, SOLTokenID, FEE_TIERS[1]), 37143700245489847211n], - [newPoolKey(BTCTokenID, ETHTokenID, FEE_TIERS[1]), 130559235944405760n], - [newPoolKey(BTCTokenID, USDCTokenID, FEE_TIERS[1]), 7865049221247086n], - [newPoolKey(BTCTokenID, USDTTokenID, FEE_TIERS[1]), 7865049221247086n], - [newPoolKey(BTCTokenID, SOLTokenID, FEE_TIERS[1]), 977937074251981n], - [newPoolKey(ETHTokenID, USDCTokenID, FEE_TIERS[1]), 3454809855596621497n], - [newPoolKey(ETHTokenID, USDTTokenID, FEE_TIERS[1]), 3454809855596621497n], - [newPoolKey(ETHTokenID, SOLTokenID, FEE_TIERS[1]), 423131631710393596n], - [newPoolKey(USDCTokenID, USDTTokenID, FEE_TIERS[1]), 9999818389598293n], - [newPoolKey(USDCTokenID, SOLTokenID, FEE_TIERS[1]), 24911294718392400n], - [newPoolKey(USDTTokenID, SOLTokenID, FEE_TIERS[1]), 24911294718392400n] + const poolKeys: PoolKey[] = [ + newPoolKey(BTCTokenID, ETHTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, USDCTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(BTCTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, USDCTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(ETHTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(USDCTokenID, USDTTokenID, FEE_TIERS[1]), + newPoolKey(USDCTokenID, SOLTokenID, FEE_TIERS[1]), + newPoolKey(USDTTokenID, SOLTokenID, FEE_TIERS[1]) ] - for (const [poolKey] of poolKeys) { + for (const poolKey of poolKeys) { const price = (1 / (prices[poolKey.tokenY] / prices[poolKey.tokenX])) * 10 ** (Number(decimals[poolKey.tokenY]) - Number(decimals[poolKey.tokenX])) * @@ -112,21 +107,7 @@ const main = async () => { await token.mint(account, (2n ** 96n - 1n) as TokenAmount, USDCTokenID) await token.mint(account, (2n ** 96n - 1n) as TokenAmount, USDTTokenID) await token.mint(account, (2n ** 96n - 1n) as TokenAmount, SOLTokenID) - - const BTCBefore = await token.getBalanceOf(account.address, BTCTokenID) - const ETHBefore = await token.getBalanceOf(account.address, ETHTokenID) - const USDCBefore = await token.getBalanceOf(account.address, USDCTokenID) - const USDTBefore = await token.getBalanceOf(account.address, USDTTokenID) - const SOLBefore = await token.getBalanceOf(account.address, SOLTokenID) - // const ALPHBefore = await token.getBalanceOf(account.address, ALPH_TOKEN_ID) - - console.log( - `BTC: ${BTCBefore}, ETH: ${ETHBefore}, USDC: ${ - USDCBefore - }, USDT: ${USDTBefore}, SOL: ${SOLBefore}` - ) - - for (const [poolKey, amount] of poolKeys) { + for (const poolKey of poolKeys) { const price = (1 / (prices[poolKey.tokenY] / prices[poolKey.tokenX])) * 10 ** (Number(decimals[poolKey.tokenY]) - Number(decimals[poolKey.tokenX])) * @@ -137,6 +118,16 @@ const main = async () => { try { const lowerTick = calculateTick(lowerSqrtPrice, FEE_TIERS[1].tickSpacing) const upperTick = calculateTick(upperSqrtPrice, FEE_TIERS[1].tickSpacing) + const tokenXAmount = BigInt( + Math.round((5000 / prices[poolKey.tokenX]) * 10 ** Number(decimals[poolKey.tokenX])) + ) + const { l: liquidity } = getLiquidityByX( + tokenXAmount as TokenAmount, + lowerTick, + upperTick, + poolSqrtPrice as SqrtPrice, + true + ) const approvedAmountX = await token.getBalanceOf(account.address, poolKey.tokenX) const approvedAmountY = await token.getBalanceOf(account.address, poolKey.tokenY) await invariant.createPosition( @@ -144,7 +135,7 @@ const main = async () => { poolKey, lowerTick, upperTick, - amount as Liquidity, + liquidity, approvedAmountX, approvedAmountY, poolSqrtPrice, @@ -154,17 +145,6 @@ const main = async () => { console.log('Create position error', poolKey, e) } } - const BTCAfter = await token.getBalanceOf(account.address, BTCTokenID) - const ETHAfter = await token.getBalanceOf(account.address, ETHTokenID) - const USDCAfter = await token.getBalanceOf(account.address, USDCTokenID) - const USDTAfter = await token.getBalanceOf(account.address, USDTTokenID) - const SOLAfter = await token.getBalanceOf(account.address, SOLTokenID) - // const ALPHAfter = await token.getBalanceOf(account.address, ALPH_TOKEN_ID) - console.log( - `BTC: ${BTCBefore - BTCAfter}, ETH: ${ETHBefore - ETHAfter}, USDC: ${ - USDCBefore - USDCAfter - }, USDT: ${USDTBefore - USDTAfter}, SOL: ${SOLBefore - SOLAfter}` - ) console.log('Successfully created positions') process.exit(0) diff --git a/src/consts.ts b/src/consts.ts index ca4cbd5..e7b4a19 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -63,31 +63,31 @@ export enum VMError { export const INVARIANT_ADDRESS = { [Network.Devnet]: '', - [Network.Testnet]: '2326FKQoEWtErAw85891kY1v2qHQJdVCpFArbnQDzrZxK', + [Network.Testnet]: '242VBmymDnYfBcy33Dz7x5McrgxuJ16YXhipm4cQYtHKd', [Network.Mainnet]: '' } export const BTC_ID = { [Network.Devnet]: '', - [Network.Testnet]: '7463907d430f8541526537af69e11db174d614ffa931bbf2c95ffe15d2cc6a00', + [Network.Testnet]: '5fcbb6c36160db6275900637cc842e1f0a5bd97f2a030153a4fae717260c2700', [Network.Mainnet]: '' } export const ETH_ID = { [Network.Devnet]: '', - [Network.Testnet]: '9c396d6bfb35ff87959801795ffcbb19078d8d04ad84a58af082c5763d070d00', + [Network.Testnet]: 'd92ea47be07234444f92ae84ef91bdcea7e5965097e4ac987a747cf073d15800', [Network.Mainnet]: '' } export const USDC_ID = { [Network.Devnet]: '', - [Network.Testnet]: 'bbff7962b2e210e8292e466f5a6a35c2ee24dfb55b1bbaabaa27a1cad1bec100', + [Network.Testnet]: 'ec3547bffc2e9841a26cb4511fe6339a8b7a41435fb4be3242a8a73c0629c200', [Network.Mainnet]: '' } export const USDT_ID = { [Network.Devnet]: '', - [Network.Testnet]: 'b795aab5d9d5288e1673a6ec7ffc600fc48a7ed9f716704123e60e2b77e7cb00', + [Network.Testnet]: '042843b9e853fca28f425f8d2d96e9cd089e4e76c755c60cf795b704ede4dc00', [Network.Mainnet]: '' } export const SOL_ID = { [Network.Devnet]: '', - [Network.Testnet]: '2505310840f04d696887aebc8ecc27e5d2e0a389d9e037e17d2ebe0550277200', + [Network.Testnet]: 'c925472266dbd7f2e01313ad787cfb12b7f4be6776e9a3b02daed9dde7706200', [Network.Mainnet]: '' } diff --git a/src/fungible-token.ts b/src/fungible-token.ts index 278fa1c..12aff8d 100644 --- a/src/fungible-token.ts +++ b/src/fungible-token.ts @@ -9,7 +9,7 @@ import { web3 } from '@alephium/web3' import { Network } from './network' -import { TokenFaucet, Withdraw } from '../artifacts/ts' +import { Airdrop, TokenFaucet, Withdraw } from '../artifacts/ts' import { balanceOf, signAndSend, waitTxConfirmed } from './utils' import { MAX_U256 } from './consts' import { TokenAmount } from './types' @@ -60,11 +60,9 @@ export class FungibleToken { } async mintTx(signer: SignerProvider, value: TokenAmount, tokenId: string) { - const tokenAddress = addressFromContractId(tokenId) - const tokenFaucet = TokenFaucet.at(tokenAddress) const builder = TransactionBuilder.from(web3.getCurrentNodeProvider()) const bytecode = Withdraw.script.buildByteCodeToDeploy({ - token: tokenFaucet.contractId, + token: tokenId, amount: value }) @@ -123,4 +121,53 @@ export class FungibleToken { const nodeProvider = web3.getCurrentNodeProvider() return BigInt((await nodeProvider.fetchFungibleTokenMetaData(tokenId)).decimals) } + + async airdropTx( + signer: SignerProvider, + valueOne: TokenAmount, + tokenOneId: string, + valueTwo: TokenAmount, + tokenTwoId: string, + valueThree: TokenAmount, + tokenThreeId: string + ) { + const builder = TransactionBuilder.from(web3.getCurrentNodeProvider()) + const bytecode = Airdrop.script.buildByteCodeToDeploy({ + tokenOne: tokenOneId, + amountOne: valueOne, + tokenTwo: tokenTwoId, + amountTwo: valueTwo, + tokenThree: tokenThreeId, + amountThree: valueThree + }) + + const { address, publicKey } = await signer.getSelectedAccount() + + const unsignedTxBuild = await builder.buildExecuteScriptTx( + { signerAddress: address, bytecode, attoAlphAmount: DUST_AMOUNT * 3n }, + publicKey + ) + return unsignedTxBuild + } + + async airdrop( + signer: SignerProvider, + valueOne: TokenAmount, + tokenOneId: string, + valueTwo: TokenAmount, + tokenTwoId: string, + valueThree: TokenAmount, + tokenThreeId: string + ) { + const tx = await this.airdropTx( + signer, + valueOne, + tokenOneId, + valueTwo, + tokenTwoId, + valueThree, + tokenThreeId + ) + return await signAndSend(signer, tx) + } } diff --git a/test/sdk/e2e/fungible-token.test.ts b/test/sdk/e2e/fungible-token.test.ts index 25d656f..133cd46 100644 --- a/test/sdk/e2e/fungible-token.test.ts +++ b/test/sdk/e2e/fungible-token.test.ts @@ -91,4 +91,16 @@ describe('fungible token tests', () => { decimals: 15n }) }) + + test('airdrop tokens', async () => { + let tokenOne = await FungibleToken.deploy(admin, 0n as TokenAmount, 'Coin', 'COIN', 12n) + let tokenTwo = await FungibleToken.deploy(admin, 0n as TokenAmount, 'Coin', 'COIN', 12n) + let tokenThree = await FungibleToken.deploy(admin, 0n as TokenAmount, 'Coin', 'COIN', 12n) + + const value = 500n as TokenAmount + await token.airdrop(admin, value, tokenOne, value, tokenTwo, value, tokenThree) + expect(await token.getBalanceOf(admin.address, tokenOne)).toBe(500n) + expect(await token.getBalanceOf(admin.address, tokenTwo)).toBe(500n) + expect(await token.getBalanceOf(admin.address, tokenThree)).toBe(500n) + }) })