# 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)
```