import { NetworkProvider } from '@ton/blueprint';
import { beginCell, toNano, Address, Cell } from '@ton/core';
export async function run(provider: NetworkProvider) {
const asset1: Asset = AssetNative.INSTANCE // or AssetJetton or AssetExtra
const asset1Amount = 100n
const asset2: Asset = new AssetExtra(1n) // or AssetNative or AssetJetton
const asset2Amount = 100n
const factoryAddress = Address.parse('EQAsf2sDPfoo-0IjnRA7l_gJBB9jyo4zqfCG_1IFCCI_Qbef')
const factory = provider.provider(factoryAddress)
let resp = await factory.get('get_vault_address', [{ type: 'slice', cell: asset1.toCell() }])
const vault1Address = resp.stack.readAddress()
resp = await factory.get('get_vault_address', [{ type: 'slice', cell: asset2.toCell() }])
const vault2Address = resp.stack.readAddress()
if (!provider.sender().address) {
throw new Error('Sender address must be present')
}
const poolParams = beginCell()
asset1.write(poolParams)
asset2.write(poolParams)
poolParams.storeUint(0, 3) // constant_product AMM
poolParams.storeMaybeRef(null) // no AMM settings
const poolParamsCell = poolParams.endCell()
const depositLiquidityParamsCell = beginCell()
.storeAddress(provider.sender().address) // recipient of LP tokens
.storeBit(false) // send funds to the address specified above instead of sender in case of failures
.storeAddress(null) // no referral
.storeUint(Math.floor(Date.now() / 1000) + 900, 32) // deadline
.storeUint(0, 2) // using no condition
.storeMaybeRef(null) // no extra settings
.storeMaybeRef(null) // no notifications
.endCell()
await sendProvideLiquidity(provider, poolParamsCell, depositLiquidityParamsCell, vault1Address, asset1, asset1Amount)
await sendProvideLiquidity(provider, poolParamsCell, depositLiquidityParamsCell, vault2Address, asset2, asset2Amount)
}
async function sendProvideLiquidity(
provider: NetworkProvider,
poolParams: Cell,
depositLiquidityParams: Cell,
vaultAddress: Address,
asset: Asset,
amount: bigint
) {
const sender = provider.sender()
if (asset instanceof AssetNative) {
await sender.send({
to: vaultAddress,
value: amount + toNano(.1),
body: beginCell()
.storeUint(0xc0ffee04, 32) // deposit_liquidity_native opcode
.storeUint(0, 64)
.storeCoins(amount)
.storeRef(depositLiquidityParams)
.storeRef(poolParams)
.endCell()
})
} else if (asset instanceof AssetJetton) {
const jettonMaster = provider.provider(asset.getAddress())
let resp = await jettonMaster.get('get_wallet_address', [{
type: 'slice',
cell: beginCell().storeAddress(sender.address).endCell()
}])
const jettonWalletAddress = resp.stack.readAddress()
await sender.send({
to: jettonWalletAddress,
value: toNano(.15),
body: beginCell()
.storeUint(0xf8a7ea5, 32) // jetton_transfer opcode
.storeUint(0, 64)
.storeAddress(vaultAddress)
.storeAddress(sender.address)
.storeMaybeRef(null) // no custom_payload
.storeCoins(toNano(.1)) // fwd_gas
.storeMaybeRef(
beginCell()
.storeUint(0xc0ffee12, 32) // deposit_liquidity_jetton opcode
.storeRef(depositLiquidityParams)
.storeRef(poolParams)
.endCell()
).endCell()
})
} else if (asset instanceof AssetExtra) {
await sender.send({
to: vaultAddress,
value: toNano(.1),
extracurrency: {
[Number(asset.id)]: amount
},
body: beginCell()
.storeUint(0xc0ffee05, 32) // deposit_liquidity_extra opcode
.storeUint(0, 64)
.storeRef(depositLiquidityParams)
.storeRef(poolParams)
.endCell()
})
}
}