# Kala Contracts Web Interface ## 1. Trade ### 1.1 获取所有Asset列表(webAssets.json) ```json= { "exchange": { "comments": "用于交易页面,流动性页面", "pairs": { "KALA-BUSD": { "pair": "0x64330C8AcCd74E8EB30894F341eF45c743B875b5", "symbol1": "KALA", "address1": "0x32299c93960bB583A43c2220Dc89152391A610c5", "png1": "https://app.kalata.io/media/assets/KALA.png", "svg1": "https://app.kalata.io/media/assets/KALA.svg", "symbol2": "BUSD", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg" }, "kCOIN-BUSD": { "pair": "0x2F5b3Ab702b48B448D510200676AF63630C6DAa2", "symbol1": "kCOIN", "address1": "0xAC637B0f9030436f21E2FfBDf104B45c7e4156CA", "png1": "https://app.kalata.io/media/assets/COIN.png", "svg1": "https://app.kalata.io/media/assets/COIN.svg", "symbol2": "BUSD", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg" } } }, "mint": { "comments": "用户铸造页面", "pairs": { "kCOIN-BUSD": { "comments": "抵押BUSD获得kCOIN", "symbol1": "kCOIN", "address1": "0xAC637B0f9030436f21E2FfBDf104B45c7e4156CA", "png1": "https://app.kalata.io/media/assets/COIN.png", "svg1": "https://app.kalata.io/media/assets/COIN.svg", "symbol2": "BUSD", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg" } } }, "staking": { "comments": "用户挖矿页面", "assets": { "KALA": { "comments": "KALA单币池,获取KALA奖励,必须质押一定数量的KALA-BUSD用于解锁获取的的奖励", "asset": "0x32299c93960bB583A43c2220Dc89152391A610c5", "address1": "0x32299c93960bB583A43c2220Dc89152391A610c5", "symbol1": "KALA", "png1": "https://app.kalata.io/media/assets/KALA.png", "svg1": "https://app.kalata.io/media/assets/KALA.svg", "rewardLockable": true, "enable": true }, "BUSD": { "comments": "BUSD单币池,获取KALA奖励,必须质押一定数量的KALA-BUSD用于解锁获取的的奖励", "asset": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "address1": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "symbol1": "BUSD", "png1": "https://app.kalata.io/media/assets/BUSD.png", "svg1": "https://app.kalata.io/media/assets/BUSD.svg", "rewardLockable": true, "enable": true }, "KALA-BUSD": { "comments": "KALA-BUSD双币池,asset字段是kala-busd pair的地址", "asset": "0x64330C8AcCd74E8EB30894F341eF45c743B875b5", "address1": "0x32299c93960bB583A43c2220Dc89152391A610c5", "symbol1": "KALA", "png1": "https://app.kalata.io/media/assets/KALA.png", "svg1": "https://app.kalata.io/media/assets/KALA.svg", "symbol2": "BUSD", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "claimTimeLimit": true, "enable": true }, "kCOIN-BUSD": { "comments": "kCOIN-BUSD双币池, asset 字段是 kCOIN-busd pair的地址", "asset": "0x2F5b3Ab702b48B448D510200676AF63630C6DAa2", "address1": "0xAC637B0f9030436f21E2FfBDf104B45c7e4156CA", "symbol1": "kCOIN", "png1": "https://app.kalata.io/media/assets/COIN.png", "svg1": "https://app.kalata.io/media/assets/COIN.svg", "symbol2": "BUSD", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56", "rewardLockable": false, "enable": false } } }, "liqudity": { "comments": "流动性", "assets": { "KALA-BUSD": { "comments": "KALA-BUSD双币池,asset字段是kala-busd pair的地址", "asset": "0x64330C8AcCd74E8EB30894F341eF45c743B875b5", "symbol1": "KALA", "address1": "0x32299c93960bB583A43c2220Dc89152391A610c5", "png1": "https://app.kalata.io/media/assets/KALA.png", "svg1": "https://app.kalata.io/media/assets/KALA.svg", "symbol2": "BUSD", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56" }, "kCOIN-BUSD": { "comments": "kCOIN-BUSD双币池, asset 字段是 kCOIN-busd pair的地址", "asset": "0x2F5b3Ab702b48B448D510200676AF63630C6DAa2", "address1": "0xAC637B0f9030436f21E2FfBDf104B45c7e4156CA", "symbol1": "kCOIN", "png1": "https://app.kalata.io/media/assets/COIN.png", "svg1": "https://app.kalata.io/media/assets/COIN.svg", "symbol2": "BUSD", "png2": "https://app.kalata.io/media/assets/BUSD.png", "svg2": "https://app.kalata.io/media/assets/BUSD.svg", "address2": "0xe9e7cea3dedca5984780bafc599bd69add087d56" } } } } ``` - 返回数据说明: - name: token name - symbol: token symbol - address: token地址 - pair: 对应的busd-token pair地址, 如果pair为空,表示单币挖 - stakable: 是否可以Staking - tradable: 是否可以交易, 如果值为false, token不要出现在trade列表中 - minable: 是否可以Mint - claimTimeLimit: 对于可以Staking的token,claim的时候是否有时间限制, 目前只有KALA-BUSD有72小时时间限制 - rewardLockable: Staking获得的奖励是否是被锁定的. 目前只有BUSD Staking是被锁定的, 需要质押KALA-BUSD解锁 ### 1.2 获取资金池中所有Asset的价格 ```solidity= //合约: Router function queryAssetPricesFromPool() external view returns ( address[] memory assets, //asset address uint[] memory prices //asset price ); ``` ### 1.3 购买(Buy) > #### 步骤如下: - 1.3.1先检测busd是否授权足够的数量 ```solidity= //合约: IBEP20 function allowance( address owner, //Account地址 address spender //UniswapV2Router02 ) returns (uint256); //返回已经授权的数量 ``` - 1.3.2 如果没有足够的数量,就需要申请授权,否则下一步 ```solidity= //合约: IBEP20 function approve(address spender, uint256 amount) external returns (bool); ``` - 1.3.3 根据输入的Token数量,获取需要多少BUSD ```solidity= //合约: Pair Token //说明: 两个token的地址按字母顺序排序, 来判断哪一个地址是第一个,哪一个地址是第二个. function getReserves() returns ( uint112 _reserve0, //第一个asset的reserve, uint112 _reserve1, //第二个asset的reserve uint32 _blockTimestampLast // block时间,可以忽略 ) //合约: UniswapV2Router02 //参考: https://uniswap.org/docs/v2/smart-contracts/router02/ //根据要购买asset的数据,获取需要busd的数量 function getAmountIn( uint amountOut, // 需要购买的Asset的数量 uint reserveIn, // BUSD 在池子中的reserve uint reserveOut // Asset在池子中的reserve ) internal pure returns ( uint amountIn // 需要的BUSD的数量 ) //根据BUSD的数据,获取可以购买到的asset的数量 function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) returns (uint amountOut) ``` - 1.3.4 Buy ```solidity= //合约: UniswapV2Router02 //参考 https://uniswap.org/docs/v2/smart-contracts/router02/ function swapTokensForExactTokens( uint amountOut,// 需要购买的Asset数量 uint amountInMax, // 保护参数, 限制最多花费多少BUSD,防止滑点太大. address[] calldata path, //[busd,asset] address to, // asset的接受者. //最迟交易时间,这也是保护参数, //(await web3.eth.getBlock("latest")).timestamp + 160 uint deadline ) returns ( uint[] memory amounts //数组里面只有一个数据, 购买到的Asset数量 ) ``` ### 1.4 出售(Sell) > #### 步骤如下: - 1.4.1先检测待出售TOKen是否授权足够的数量 ```solidity= //合约: IBEP20 function allowance( address owner, //Account地址 address spender //asset-busd pair,参考 1.1 ) returns ( uint256 //返回已经授权的数量 ); ``` - 1.4.2 如果没有足够的数量,就需要申请授权,否则下一步 ```solidity= //合约: IBEP20 function approve( address spender, //asset-busd pair uint256 amount // 需要授权的数量 ) external returns (bool); ``` - 1.4.3 根据输入的Token数量,获取需要多少BUSD ```solidity= //合约: asset-busd pair token //参考 1.3.3 function getReserves() returns ( uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast ) //合约: UniswapV2Router02 function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) returns (uint amountOut) ``` - 1.4.4 Sell ```solidity= //合约: UniswapV2Router02 function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, //(await web3.eth.getBlock("latest")).timestamp + 160 uint deadline ) returns (uint[] memory amounts) ``` ### 1.5 获取Asset价格变动(数据只能用户展示价格变动,不要用在其他模块里面) - 获取方式: HTTP GET - URL: https://api.kalata.io/api/finance/symbol/price/changes?symbols=kBIDU,kTSLA,kARKK,kSPCE,kPACB - 参数: symbols: 股票代码,用逗号分割 - 返回数据: ```json= { "code": 200, "message": "Success", "data": [ { "symbol": "kBIDU", "marketPrice": 196.27, //(marketPrice-previousClose)/previousClose, 即为价格变动 "previousClose": 196.27 }, ] } ``` ### 1.6 获取股票K线数据 - 获取方式: HTTP GET - URL: https://api.kalata.io/api/finance/symbol/price/chart?symbol=kBIDU&interval=1mo - 参数: - symbol: 股票代码 - interval: 间隔(1d:天, 1wk:周, 1mo:月) - 返回数据: ```javascript= { "code": 200, "message": "Success", "data": { "timestamps": [ "2021-05-01", "2021-06-01" ], "closes": [ 196.27, 196.27 ] } } ``` ### 1.7 获取当年KALA发行数量 ```solidity= //合约: Factory function queryDistributeAmount() external view returns (uint); ``` ## 2. 添加流动性 ### 2.1 获取所有Asset列表 ```solidity= // Refer to 1.1 ``` ### 2.2 获取所有Asset的价格 ```solidity= // Refer to 1.2 ``` ### 2.3 添加流动性 ```solidity= // 1. targetAsset.approve() // 2. busdToken.approve() function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, //(await web3.eth.getBlock("latest")).timestamp + 160 uint deadline ) returns (uint amountA, uint amountB, uint liquidity) ``` ### 2.4 赎回 ```solidity= // 1. pairAsset.approve() function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, //(await web3.eth.getBlock("latest")).timestamp + 160 uint deadline ) returns (uint amountA, uint amountB) ``` ### 2.5 根据liquidiy计算需要多少KALA和BUSD ```javascript= //根据liquidiy计算需要多少KALA和BUSD async function calculateAmountsIn(pairToken,kalaAddress,busdAddress,liquidity) { let [reserve0, reserve1] = await pairToken.getReserves(); reserve0 = humanBN(reserve0) reserve1 = humanBN(reserve1) let kalaReserve = kalaAddress < busdAddress ? reserve0 : reserve1; let busdReserve = kalaAddress < busdAddress ? reserve1 : reserve0; let totalSupply = humanBN(await pairToken.totalSupply()); let busdAmount = liquidity * busdReserve / totalSupply; let kalaAmount = liquidity * kalaReserve / totalSupply; console.log("liquidity:", liquidity, "busdAmount", busdAmount, "kalaAmount", kalaAmount) } ``` ## 3. Earn ### 3.1 获取所有Asset列表 ```solidity= // Refer to 1.1 ``` ### 3.2 获取当前用户已经质押的数量和待领取奖励列表 ```solidity= //合约: Staking // function queryRewards(address staker) external view returns ( address[] assets, //asset array uint[] stakingAmounts, //staking amounts for each asset uint pendingRewards //pending rewards for each asset ); ``` ### 3.3 获取Asset的质押数据 > #### 说明:用于展示Asset列表里面的价格 ```solidity= //合约: Staking function queryStakes() external view returns ( address[] memory assets, //asset array uint[] memory pendingRewards, //asset对应的待领取奖励 uint[] memory stakingAmounts // asset对应的质押数量 ); ``` ### 3.4 获取Asset的权重 ```solidity= //合约: Factory //参数asset: Token地址, 注意这里是Token地址,不是LP Pair地址 //参数amount: 质押数量 function queryAllAssetWeights() returns ( address[] memory assets, //asset address list uint[] memory weights //asset weight list ) ``` ### 3.5 质押(Stake LP) ```solidity= //合约: Staking //参数asset: Token地址, 注意这里是Token地址,不是LP Pair地址 //参数amount: 质押数量 //参数stakingPeriod: 质押周期, 单位秒. 当数值为0时表示没有选择质押周期 function stake(address asset, uint amount,uint stakingPeriod) override external ``` ### 3.6 赎回(UnStake LP) ```solidity= //合约: Staking //参数asset: Token地址, 注意这里是Token地址,不是LP Pair地址 //参数amount: 赎回数量 function unStake(address asset, uint amount) override external ``` ### 3.7 领取奖励(Harvest) ```solidity= //合约: Staking //参数asset: Token地址, 注意这里是Token地址,不是LP Pair地址 function claim(address asset) external; ``` ### 3.8 获取领取奖励的剩余时间 > #### 说明: 新的需求,KALA-BUSD获取的收益只能每隔72小时领取一次 ```solidity= //合约: Staking //参数asset: Token地址, 注意这里是Token地址,不是LP Pair地址 function queryRemaingClaimTimes( address staker ) external view returns ( address[] memory assets, // asset address uint[] memory remaingClaimTimes //剩余claim的时间,单位秒, 0表示可以立即领取 ); ``` ### 3.9 获取最近一次KALA的释放时间 > #### 根据此接口,显示还有多少时间有新的奖励 ```solidity= //合约: Factory function queryLastDistributed() returns (uint); ``` > #### 计算方法 ```javascript= //半小时释放一次 const distributeInterval = 60 * 30; let lastDistributed = await factoryInstance.queryLastDistributed(); let now = (await hre.web3.eth.getBlock("latest")).timestamp //剩余时间 let timeRemaining = distributeInterval - (now - lastDistributed) //秒 console.log(timeRemaining) ``` ### 3.10 获取KALA的释放开始时间 > #### 根据此接口,计算APR ```solidity= //合约: Factory function queryDistributeStartTime() returns (uint); ``` > #### 计算方法 ```javascript= async function calculateApr() { const [signer] = await hre.ethers.getSigners(); let kalaInfo = readKala(hre); let busdInfo = readBUSD(hre); let pairToken = await loadPair(hre, kalaInfo.pair, signer) let {_reserve0, _reserve1} = await pairToken.getReserves(); //池子里BUSD的数量 let busdReserve = busdInfo.address < kalaInfo.address ? _reserve0 : _reserve1; //池子里KALA的数量 let kalaReserve = busdInfo.address > kalaInfo.address ? _reserve0 : _reserve1; console.log('busdReserve', fromUnit(busdReserve)) console.log('kalaReserve', fromUnit(kalaReserve)) //根据数量获得KALA价格 let kalaPrice = fromUnit(busdReserve) / fromUnit(kalaReserve) console.log('kalaPrice', kalaPrice) //获得池子里LP的数量 let totalSupply = await pairToken.totalSupply(); console.log('totalSupply', fromUnit(totalSupply)) async function getStakingAmount() { let {assets, stakingAmounts} = await stakingInstance.queryStakes(); for (let i = 0; i < assets.length; i++) { if (assets[i] === kalaInfo.address) { return stakingAmounts[i] } } } //抵押的LP数量 let stakingAmount = await getStakingAmount(); console.log('stakingAmount', fromUnit(stakingAmount)) //TVL, total value locked let tvl = fromUnit(busdReserve) * 2 * (fromUnit(stakingAmount) / fromUnit(totalSupply)) console.log('tvl', tvl) async function getRewardAmount() { let distributeAmountPerDay = await getDistributeAmountPerDay(); console.log('distributeAmountPerDay', distributeAmountPerDay) let assetWeights = await getAssetWeights(); console.log('assetWeights', assetWeights) let assetDistributeAmountPerDay = distributeAmountPerDay * assetWeights[kalaInfo.address]; console.log('assetDistributeAmountPerDay', assetDistributeAmountPerDay); return assetDistributeAmountPerDay; } let rewardAmount = await getRewardAmount(); // 当日奖励的KALA数量*当前币价*365 / TVL*100% let apr = rewardAmount * kalaPrice * 365 / tvl * 100; console.log('apr', `${apr.toFixed(2)}%`); } //获取每一个Asset的权重比例 async function getAssetWeights() { let map = {}; let {assets, weights} = await factoryInstance.queryAllAssetWeights(); weights = weights.map(item => fromUnit(item)) let totalWeights = weights.reduce((total, item) => total + parseFloat(item), 0) for (let i = 0; i < assets.length; i++) { map[assets[i]] = weights[i] / totalWeights } return map; } //获取每天释放的KALA数量 async function getDistributeAmountPerDay() { let {startTimes, endTimes, amounts} = await factoryInstance.queryDistributionSchedules(); let now = (await hre.web3.eth.getBlock("latest")).timestamp; let distributeStartTime = await factoryInstance.queryDistributeStartTime(); let passedTime = now - distributeStartTime; for (let i = 0; i < startTimes.length; i++) { if (startTimes[i] <= passedTime && endTimes[i] >= passedTime) { return fromUnit(amounts[i]) / (endTimes[i] - startTimes[i]) * 3600 * 24; } } return 0; } ``` ## 4. Mint ### 4.1 获取所有Asset列表 ```solidity= // Refer to 1.1, KALA是不支持Mint的,请过滤掉 ``` ### 4.2 获取Asset的价格 ```solidity= // 合约: Oracle //获取所有Asset的市场价格 function queryAllPrices() external view returns ( address[] memory assets, uint[] memory prices, uint[] memory lastUpdatedTimes ); //获取单一Asset的市场价格 function queryPrice(address asset) external view returns ( uint price, uint lastUpdatedTime ); ``` ### 4.1 Query Asset Config ```solidity= // 合约: Mint function queryAssetConfig( address assetToken // target asset token address ) returns ( uint auctionDiscount, // auction discount uint minCollateralRatio, // minimum collateral ratio uint endPrice // 最终价格,不需要关注这个参数 ) ``` ### 4.3 Query Asset Config ```solidity= // 合约: Mint function queryAssetConfig( address assetToken // target asset token address ) returns ( uint auctionDiscount, // auction discount uint minCollateralRatio, // minimum collateral ratio uint endPrice // 最终价格,不需要关注这个参数 ) ``` ### 4.4 Open Position ```solidity= // 合约: Mint // 先调用IERC20(BUSD token).approve 授权Mint合约collateralAmount数量的BUSD function openPosition( address collateralToken, // BUSD Token Address uint collateralAmount, //BUSD amount address assetToken, //target asset token address uint collateralRatio // collateral ratio, greater than minCollateralRatio ) external returns (uint); ``` ### 4.5 查询 Position Index ```solidity= // 合约: Mint function queryPositionIndex( address postionOwner, // wallet address address collateralToken, // busd token address address assetToken // target asset token address ) override external view returns ( uint positionIndex // postion index ) ``` ### 4.6 deposit ```solidity= // 合约: Mint // 先调用IERC20(BUSD token).approve,来授权Mint合约collateralAmount数量的BUSD function deposit( uint positionIndex, //position index, refer to 4.3 address collateralToken, //busd token address uint collateralAmount //busd amount ) override external ``` ### 4.7 withdraw ```solidity= // 合约: Mint function withdraw( uint positionIndex, // position index, refer to 4.3 address collateralToken, // busd token address uint withdrawAmount // withdraw busd amount ) override external ``` ### 4.8 close position ```solidity= // 合约: Mint function closePosition( uint positionIndex, // position index, refer to 4.3 ) override external ``` ### 4.9 query position ```solidity= // 合约: Mint function queryAllPositions(address owner) external view returns ( uint[] memory idxes, //postionIndex address[] memory positionOwners, // postion owner address[] memory collateralTokens, //busd token uint[] memory collateralAmounts, //busd amount address[] memory assetTokens, //asset uint[] memory assetAmounts //asset amount ); ``` ### 4.10 query config ```solidity= // 合约: Mint function queryConfig() external view returns ( address factory, address oracle, address collector, address baseToken, uint protocolFeeRate //手续费,只有在withdraw时有手续费 ); ``` ### 4.11 更新仓位 ```solidity= // 合约: Mint //ABI: { "inputs": [ { "internalType": "uint256", "name": "positionIndex", "type": "uint256" }, { "internalType": "uint256", "name": "newCollateralAmount", "type": "uint256" }, { "internalType": "uint256", "name": "newAssetAmount", "type": "uint256" } ], "name": "updatePosition", "outputs": [], "stateMutability": "nonpayable", "type": "function" } function updatePosition( uint256 positionIndex, //更新后仓位中质押物的数量 uint256 newCollateralAmount, //更新后仓位中铸造物的数量 //如果铸造物数量减少,会按比例收取一定数量的抵押物手续费, //需要事先调用抵押物Token的approve方法 uint256 newAssetAmount ) external ``` ## 5. 我的页面 ### 5.1 Holdings ```solidity= // 1. 获取所有Asset列表,参考 1.1 // 2. 对于每一个asset列表做for循环: //合约: IERC20(assetAddress) function balanceOf( address account //钱包地址 ) external view returns (uint256); ``` ### 5.2 Pool ```solidity= // 1. 获取所有Asset列表,参考 1.1 // 2. 对于每一个asset列表做for循环 //合约: IERC20(assetPairAddress) function balanceOf( address account //钱包地址 ) external view returns (uint256); ``` ### 5.3 Stake ```solidity= //参考3.2 ``` ## 6. 交易记录 - 获取方式: HTTP GET - URL: https://api.kalata.io/api/finance/transaction/logs/query?network=testnet&sender=0x1784Ea977728b61a4E2A73F8b2a3183D6cBb342c&pageSize=2&pageNumber=1 - 请求参数: - network: 主网:mainnet,测试网:testnet - sender: 钱包地址 - pageSize: 分页每页条数,1<=pageSize<=50 - pageNumber: 分页页码, 从1开始 - 返回数据: ```javascript= { { "status": 200, "data": { "totalElements": 81, "pageSize": 2, "pageNumber": 1, "content": [ { //Trade->Buy/Sell, contract是busd-asset pair合约地址 "contract": "0xFf44679911238aCcfeBED71eDB9e57bAa57665ba", "event": "Swap", "parameters": "{\"amount0In\":\"618517217820076892344\",\"amount1In\":\"0\",\"amount0Out\":\"0\",\"amount1Out\":\"1000000000000000000\",\"to\":\"0x1283845f526E7A18277f4821966538D40CbCD05a\"}", "hash": "0xd3b65020ff1e0c872693955d124384c9ccaad3e2622ebdcac188e239b0b06c62", "timestamp": 1624997214 }, { //Mint->Add Liquidity, contract是busd-asset pair合约地址 "contract": "0XC32F5E3D4BA915B6968D203A6B14FC8EC1594F91", "event": "Mint", "parameters": "{\"amount0\":\"200704528774013250738\",\"amount1\":\"1000000000000000000\"}", "hash": "0x514b2e1a106490f992009d063d4cbf309c1eb3ec808dc78a22a7a363f699c5a8", "timestamp": 1625203215 }, { //Mint->Reduce Liquidity, contract是busd-asset pair合约地址 "contract": "0X1F265319577E24413C665F8FCB08AE4CFFD97FE9", "event": "Burn", "parameters": "{\"amount0\":\"465768700057721028\",\"amount1\":\"2148382379179662007\",\"to\":\"0x28D89B837BFDb5DD386988F06C87BEB3ab5DC8C0\"}", "hash": "0x67ae41b7ac80c2940f15f96180b9a9ed5142ea8f7c4bb325c824814280daa5e0", "timestamp": 1625203284 }, { //Earn -> stake "contract": "0X4D3DA4A41D8DF7F88893ED0FC3B32697B3ED5907", "event": "Stake", "parameters": "{\"asset\":\"0x09ab7C2867cdcc163feC2C8a9BDE1584a5eD178F\",\"amount\":\"111000000000000000000\"}", "hash": "0x617e018b2ca09d2d3e6bfe9a8fe6aafd2e8d943d14452cd518c152534e822ccc", "timestamp": 1625203095 }, { //Earn -> unstake "contract": "0X4D3DA4A41D8DF7F88893ED0FC3B32697B3ED5907", "event": "UnStake", "parameters": "{\"asset\":\"0x09ab7C2867cdcc163feC2C8a9BDE1584a5eD178F\",\"amount\":\"1000000000000000000\"}", "hash": "0xe46593c6b84a6e06ffefaa694985452fa7a2e78e2773f9ac6d5d4be8745eb0b6", "timestamp": 1625203161 }, { //Mint -> open position "contract": "0X22B7B0E258A6E54565DB97044B18B0738F793777", "event": "OpenPosition", "parameters": "{\"collateralToken\":\"0x04e192DcCcF0DF2AE637CA89a51017eEcdF91Bd2\",\"collateralAmount\":\"22000000000000000000\",\"assetToken\":\"0x09ab7C2867cdcc163feC2C8a9BDE1584a5eD178F\",\"collateralRatio\":\"2000000000000000000\",\"positionIndex\":\"14\",\"mintAmount\":\"54283458349782860\"}", "hash": "0x2d2be38f793e998f2e69f02892907b91c396d70e66dfbecb5a3566b708721c21", "timestamp": 1624765816 }, { //My Page->Mint->Deposit "contract": "0X22B7B0E258A6E54565DB97044B18B0738F793777", "event": "Deposit", "parameters": "{\"positionIndex\":\"14\",\"collateralToken\":\"0x04e192DcCcF0DF2AE637CA89a51017eEcdF91Bd2\",\"collateralAmount\":\"11000000000000000000\"}", "hash": "0x8fb877e914707c2f0ded1aa0b233f566094a935bf16a7414308cfe8e359d1b67", "timestamp": 1625204352 }, { //My Page -> Mint -> close Position "contract": "0X22B7B0E258A6E54565DB97044B18B0738F793777", "event": "Burn", "parameters": "{\"positionIndex\":\"14\",\"assetToken\":\"0x09ab7C2867cdcc163feC2C8a9BDE1584a5eD178F\",\"assetAmount\":\"54283458349782860\"}", "hash": "0xfbeb05b56b6e504c7d466f9d3c2c2f6aa3ba2777644de67677120aca8022350d", "timestamp": 1625478576 }, { // Auction, contract是Mint合约地址 // parameter, assetToken: 清算的Asset地址 // parameter, amount: 清算asset的数量 "contract": "0x22b7B0E258a6e54565db97044b18b0738f793777", "event": "Auction", "parameters": "{\"positionIndex\":\"14\",\"assetToken\":\"0xa7E248a673Fc22abf49fED4F699D2e1f85cEB437\",\"amount\":\"456000000000000000000\"}", "hash": "0x3e2cd67cc8627cf9beb1666da0752ddd074b6663f6d537730b255560867604a5", "timestamp": 1625199450 } ] } } } ``` - 返回数据说明: - status: 当值为200时表示成功,其它值表示失败 - message: 错误提示, 当status不等于200时,有值 - totalElements: 一共多少条数据 - pageSize: 分页每页条数,1<=pageSize<=50 - pageNumber: 分页页码, 从1开始 - contract: 合约地址,用来判断是哪一个合约 - event: 合约的事件,用来判断用户执行的哪一个操作 - parameters: 事件的参数, 用户执行合约时的参数, 用JSON.parse来解析成一个object - hash: Transaction hash - timestamp: 交易时间戳, 单位秒 ## 7. 质押KALA-BUSD,无收益,用于解锁Staking收益 > #### 新的需求,增减BUSD挖矿KALA单币池, 随存随取. 收益锁定. 锁定的奖励,通过质押KALA-BUSD来解锁. ### 7.1 质押 ```solidity= //合约: Collateral //需要提前IERC20(kala-busd pair).approve() function deposit( address asset, //asset地址, 此处填 Kala-BUSD pair uint amount // 数量 ) ; ``` ### 7.2 取出 ```solidity= //合约: Collateral function withdraw( address asset, //asset地址, 此处填 Kala-BUSD pair uint amount // 数量 ) ; ``` ### 7.3 查询 ```solidity= //合约: Collateral function queryDeposit( address depositor, //钱包地址 address asset // asset地址,此处填 Kala-BUSD pair ) returns ( uint amount, //质押的数量 uint blockNumber //最新一次质押的block number ); ``` ### 7.4 获取可解锁数量 ```solidity= //合约: Collateral function queryUnlockedAmount( address depositor, //钱包地址 address asset // asset地址,此处填 Kala-BUSD pair ) returns ( uint //可解锁数量 ); ``` ### 7.5 获取解锁速度 ```solidity= //合约: Collateral function queryConfig() returns ( address stakingContract, //staking合约地址, 不用处理 address[] memory assets, //asset,此处是 Kala-BUSD pair uint[] memory unlockSpeeds //asset对应的解锁速度 ) ``` ### 7.6 获取无收益质押的LP数量 ```solidity= //合约: Collateral ERC20(lpAddress).balanceOf(collateralAddress) ```