Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
92beb7c
cross chain lp functionalities and unit test
sagars Oct 2, 2024
0bb8010
integration test and fixes - crosschain lp feature
sagars Oct 8, 2024
6fb1c65
integration test issues fixed
sagars Oct 23, 2024
8483ccb
Token transfer utility implementation, crossTransfer commented out
sagars Oct 26, 2024
28fb906
test: all test pass including router update
sagars Oct 28, 2024
ad6dfa7
Fixes: review fixes
sagars Oct 29, 2024
1791527
Fix: review additional fixes, cleanups, formats
sagars Oct 30, 2024
e289450
to param optional on xTokenFallback deposit, xWithdraw replaced with …
sagars Nov 6, 2024
37fb55a
unit tests for optional to in xTokenFallback and xWithdraw on xAdd
sagars Nov 7, 2024
233472b
fix: Address type changed to String type on xcall annotated methods
sagars Nov 15, 2024
bc932a1
crosschain lp feature implementation guidance doc
sagars Nov 15, 2024
6a24adf
fallback method added to rewards and stakedLp, router tested
sagars Nov 18, 2024
6f58acc
fallback method removed from stakedLp contract
sagars Nov 19, 2024
ad0d9a9
unused variables, imports and commented codes removed
sagars Nov 20, 2024
d051473
unused variables, imports and commented codes removed
sagars Nov 20, 2024
8075e59
addressManagerMock static mock issue on TokenTransfer test is fixed
sagars Nov 21, 2024
7c963a1
test updates on xcall, transfer method merged in token class,exceptio…
sagars Nov 21, 2024
60e539c
onIRC31Received ib lp transfer method, depositOfUser removed..
sagars Nov 22, 2024
ba47eec
getDeposit method params position updated in dex inttest
sagars Nov 22, 2024
e223cc7
optional data on route methods - Router
sagars Nov 22, 2024
cdb562f
NetworkAddress Improvements
sagars Nov 22, 2024
3155575
NetworkAddress missed - fixed
sagars Nov 22, 2024
1aa2624
feat: Add option for governance to borrow from dex
AntonAndell Nov 18, 2024
74f8b0f
Merge pull request #464 from balancednetwork/feat/dex-borrowing
AntonAndell Nov 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import foundation.icon.xcall.NetworkAddress;
import network.balanced.score.lib.interfaces.AssetManager;
import network.balanced.score.lib.interfaces.AssetManagerMessages;
import network.balanced.score.lib.interfaces.AssetManagerXCall;
import network.balanced.score.lib.interfaces.SpokeAssetManagerMessages;
import network.balanced.score.lib.utils.*;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,5 +277,9 @@
checkStatus();
}

@External
public void onXIRC31Received(String _operator, String _from, BigInteger _id, BigInteger _value, byte[] _data) {
checkStatus();
}

Check warning on line 283 in core-contracts/DAOfund/src/main/java/network/balanced/score/core/daofund/DAOfundImpl.java

View check run for this annotation

Codecov / codecov/patch

core-contracts/DAOfund/src/main/java/network/balanced/score/core/daofund/DAOfundImpl.java#L282-L283

Added lines #L282 - L283 were not covered by tests

}
1 change: 1 addition & 0 deletions core-contracts/Dex/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dependencies {
implementation Dependencies.javaeeScorex
implementation Dependencies.minimalJson
implementation project(':score-lib')
implementation 'xyz.venture23:xcall-lib:2.1.0'

testImplementation Dependencies.javaeeUnitTest
testImplementation Dependencies.mockitoCore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,21 @@

package network.balanced.score.core.dex;

import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonArray;
import foundation.icon.icx.Wallet;
import foundation.icon.jsonrpc.Address;
import foundation.icon.score.client.DefaultScoreClient;
import foundation.icon.xcall.NetworkAddress;
import network.balanced.score.lib.interfaces.*;
import network.balanced.score.lib.interfaces.dex.DexTestScoreClient;
import network.balanced.score.lib.test.integration.Balanced;
import network.balanced.score.lib.test.integration.BalancedClient;
import network.balanced.score.lib.test.integration.Env;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import score.ByteArrayObjectWriter;
import score.Context;

import java.io.File;
import java.math.BigInteger;
Expand Down Expand Up @@ -58,6 +63,7 @@ class DexIntegrationTest {
private static DefaultScoreClient tokenCClient;
private static DefaultScoreClient tokenDClient;
private static DefaultScoreClient daoFundScoreClient;
private static BalancedClient owner;

private static final File jarfile = new File("src/intTest/java/network/balanced/score/core/dex/testtokens" +
"/DexIntTestToken.jar");
Expand Down Expand Up @@ -87,6 +93,7 @@ class DexIntegrationTest {
balnScoreClient = balanced.baln;
rewardsScoreClient = balanced.rewards;
daoFundScoreClient = balanced.daofund;
owner = balanced.ownerClient;

Rewards rewards = new RewardsScoreClient(balanced.rewards);
Loans loans = new LoansScoreClient(balanced.loans);
Expand Down Expand Up @@ -209,47 +216,18 @@ void testICXTransferSwapEarningAndCancelOrder() {
dexUserScoreClient.cancelSicxicxOrder();
}

/*@Test
@Order(4)
void testBalnPoolTokenTransferableOnContinuousRewards(){

if(dexUserScoreClient.getContinuousRewardsDay()==null) {
governanceDexScoreClient.setContinuousRewardsDay(dexUserScoreClient.getDay().add(BigInteger.ONE));
}
waitForADay();
balanced.syncDistributions();
//continuous starts
byte[] tokenDeposit = "{\"method\":\"_deposit\",\"params\":{\"none\":\"none\"}}".getBytes();
mintAndTransferTestTokens(tokenDeposit);
dexUserScoreClient.add(Address.fromString(dexTestBaseScoreAddress), Address.fromString
(dexTestFourthScoreClient._address().toString()), BigInteger.valueOf(50).multiply(EXA), BigInteger.valueOf
(50).multiply(EXA), false);
BigInteger poolId = dexUserScoreClient.getPoolId(Address.fromString(dexTestBaseScoreAddress), Address
.fromString(dexTestFourthScoreAddress));
//assert pool id is less than 5
assert poolId.compareTo(BigInteger.valueOf(6)) < 0;
BigInteger liquidity = (BigInteger.valueOf(50).multiply(EXA).multiply(BigInteger.valueOf(50).multiply(EXA)))
.sqrt();
BigInteger balance = dexUserScoreClient.balanceOf(userAddress, poolId);
BigInteger tUsersPrevBalance = dexUserScoreClient.balanceOf(tUserAddress, poolId);

assertEquals(balance, liquidity);
dexUserScoreClient.transfer(tUserAddress, BigInteger.valueOf(5).multiply(EXA), poolId, new byte[0]);
BigInteger tUsersBalance = dexUserScoreClient.balanceOf(tUserAddress, poolId);
assertEquals(tUsersPrevBalance.add(BigInteger.valueOf(5).multiply(EXA)), tUsersBalance);
}*/

@Test
@Order(6)
void testWithdraw() {
byte[] tokenDeposit = "{\"method\":\"_deposit\",\"params\":{\"none\":\"none\"}}".getBytes();
this.mintAndTransferTestTokens(tokenDeposit);
BigInteger withdrawAMount = BigInteger.valueOf(50);
BigInteger balanceBeforeWithdraw = dexUserScoreClient.depositOfUser(userAddress, tokenAAddress);
BigInteger balanceBeforeWithdraw = dexUserScoreClient.getDeposit(tokenAAddress, userAddress);
//withdraw test token
dexUserScoreClient.withdraw(tokenAAddress, withdrawAMount);

BigInteger balanceAfterWithdraw = dexUserScoreClient.depositOfUser(userAddress, tokenAAddress);
BigInteger balanceAfterWithdraw = dexUserScoreClient.getDeposit(tokenAAddress, userAddress);

assert balanceBeforeWithdraw.equals(balanceAfterWithdraw.add(withdrawAMount));
}
Expand Down Expand Up @@ -317,12 +295,192 @@ void testNonContinuousAndContinuousReward() {
BigInteger nextUpdatedBalnHolding = userRewardScoreClient.getBalnHolding(tUserAddress.toString());
assertEquals(beforeSleepDay, dexUserScoreClient.getDay());

System.out.println("updated baln holding: " + updatedBalnHolding);
System.out.println("next updated baln holding: " + nextUpdatedBalnHolding);

assert updatedBalnHolding.compareTo(nextUpdatedBalnHolding) < 0;

}

@Test
@Order(9)
void crossChainDepositViaAssetManagerDirect() {
//Arrange
NetworkAddress ethAccount = new NetworkAddress(balanced.ETH_NID, "0x123");
BigInteger amount = BigInteger.valueOf(100).multiply(EXA);
NetworkAddress ethAssetAddress = new NetworkAddress(balanced.ETH_NID, balanced.ETH_TOKEN_ADDRESS);
String toNetworkAddress = new NetworkAddress(balanced.ICON_NID, dexScoreClient._address()).toString();
score.Address assetAddress = owner.assetManager.getAssetAddress(ethAssetAddress.toString());

// Act
byte[] depositData = tokenData("_deposit",
new JsonObject().set( "address", ethAccount.toString()));
byte[] deposit = AssetManagerMessages.deposit(balanced.ETH_TOKEN_ADDRESS, ethAccount.account(), toNetworkAddress, amount, depositData);
owner.xcall.recvCall(owner.assetManager._address(), new NetworkAddress(balanced.ETH_NID, balanced.ETH_ASSET_MANAGER).toString(), deposit);

// Verify
BigInteger retrievedValue = dexUserScoreClient.getDepositV2(assetAddress, ethAccount.toString());
assertEquals(amount, retrievedValue);
}

@Test
@Order(10)
void crossChainDeposit() {
//Arrange
NetworkAddress ethAccount = new NetworkAddress(balanced.ETH_NID, "0x123");
BigInteger amount = BigInteger.valueOf(100).multiply(EXA);
NetworkAddress ethAssetAddress = new NetworkAddress(balanced.ETH_NID, balanced.ETH_TOKEN_ADDRESS);
String toNetworkAddress = new NetworkAddress(balanced.ICON_NID, dexScoreClient._address()).toString();
score.Address assetAddress = owner.assetManager.getAssetAddress(ethAssetAddress.toString());

// Arrange - Initial deposit
byte[] deposit = AssetManagerMessages.deposit(balanced.ETH_TOKEN_ADDRESS, ethAccount.account(), "", amount, new byte[0]);
owner.xcall.recvCall(owner.assetManager._address(), new NetworkAddress(balanced.ETH_NID, balanced.ETH_ASSET_MANAGER).toString(), deposit);

// Act
byte[] message = depositMsg(ethAccount.toString(), toNetworkAddress, amount, tokenData("_deposit",
new JsonObject().set( "address", ethAccount.toString())));
owner.xcall.recvCall(assetAddress, ethAccount.toString(), message);

// Verify
BigInteger retrievedValue = dexUserScoreClient.getDepositV2(assetAddress, ethAccount.toString());
assertEquals(amount.add(amount), retrievedValue);
}

@Test
@Order(11)
void crossChainLP() {
// Arrange
NetworkAddress ethBaseAssetAddress = new NetworkAddress(balanced.ETH_NID, balanced.ETH_TOKEN_ADDRESS);
NetworkAddress ethQuoteAssetAddress = new NetworkAddress(balanced.ETH_NID, "ox100");
NetworkAddress ethAccount = new NetworkAddress(balanced.ETH_NID, "0x123");
BigInteger amount = BigInteger.valueOf(100).multiply(EXA);
String toNetworkAddress = new NetworkAddress(balanced.ICON_NID, dexScoreClient._address()).toString();

// Arrange - deploy a new token
JsonArray addAssetParams = new JsonArray()
.add(createParameter(ethQuoteAssetAddress.toString()))
.add(createParameter("ETHZ"))
.add(createParameter("ETHZ"))
.add(createParameter(BigInteger.valueOf(18)));
JsonObject addAsset = createTransaction(balanced.assetManager._address(), "deployAsset", addAssetParams);
JsonArray transactions = new JsonArray()
.add(addAsset);
balanced.governanceClient.execute(transactions.toString());

score.Address baseAssetAddress = owner.assetManager.getAssetAddress(ethBaseAssetAddress.toString());
score.Address quoteAssetAddress = owner.assetManager.getAssetAddress(ethQuoteAssetAddress.toString());

// Arrange - deposits
byte[] deposit1 = AssetManagerMessages.deposit(balanced.ETH_TOKEN_ADDRESS, ethAccount.account(), toNetworkAddress, amount, tokenData("_deposit",
new JsonObject().set( "address", ethAccount.toString())));
owner.xcall.recvCall(owner.assetManager._address(), new NetworkAddress(balanced.ETH_NID, balanced.ETH_ASSET_MANAGER).toString(), deposit1);

byte[] deposit2 = AssetManagerMessages.deposit("ox100", ethAccount.account(), toNetworkAddress, amount, tokenData("_deposit",
new JsonObject().set( "address", ethAccount.toString())));
owner.xcall.recvCall(owner.assetManager._address(), new NetworkAddress(balanced.ETH_NID, balanced.ETH_ASSET_MANAGER).toString(), deposit2);

// Arrange add quote token
dexAddQuoteCoin((Address) quoteAssetAddress);

// Act
byte[] xaddMessage = getAddLPData(baseAssetAddress.toString(), quoteAssetAddress.toString(), amount, amount, false, BigInteger.valueOf(5) );
owner.xcall.recvCall(dexScoreClient._address(), ethAccount.toString(), xaddMessage);

// Verify
BigInteger poolId = dexUserScoreClient.getPoolId(baseAssetAddress,
quoteAssetAddress);
assert poolId.compareTo(BigInteger.valueOf(6)) < 0;
BigInteger liquidity =
(amount.multiply(amount)).sqrt();
BigInteger balance = dexUserScoreClient.xBalanceOf(ethAccount.toString(), poolId);

assertEquals(balance, liquidity);
}

//depends on crossChainLP test
@Test
@Order(12)
void xRemove(){
// Arrange
NetworkAddress ethAccount = new NetworkAddress(balanced.ETH_NID, "0x123");
NetworkAddress ethBaseAssetAddress = new NetworkAddress(balanced.ETH_NID, balanced.ETH_TOKEN_ADDRESS);
NetworkAddress ethQuoteAssetAddress = new NetworkAddress(balanced.ETH_NID, "ox100");

score.Address baseAssetAddress = owner.assetManager.getAssetAddress(ethBaseAssetAddress.toString());
score.Address quoteAssetAddress = owner.assetManager.getAssetAddress(ethQuoteAssetAddress.toString());

BigInteger poolId = dexUserScoreClient.getPoolId(baseAssetAddress,
quoteAssetAddress);
BigInteger balance = dexUserScoreClient.xBalanceOf(ethAccount.toString(), poolId);
BigInteger withdrawAmount = balance.divide(BigInteger.TWO);
JsonArray setXCallFeePermissionParameters = new JsonArray()
.add(createParameter(balanced.dex._address())).add(createParameter(balanced.ETH_NID)).add(createParameter(true));
JsonArray actions = new JsonArray()
.add(createTransaction(balanced.daofund._address(), "setXCallFeePermission", setXCallFeePermissionParameters));
owner.governance.execute(actions.toString());

// Act
byte[] removeLPMsg = getXRemoveData(poolId, withdrawAmount, true);
owner.xcall.recvCall(dexScoreClient._address(), ethAccount.toString(), removeLPMsg);

// Verify
BigInteger updatedBalance = dexUserScoreClient.xBalanceOf(ethAccount.toString(), poolId);
assertEquals(withdrawAmount, updatedBalance);
}

public static byte[] tokenData(String method, JsonObject params) {
JsonObject data = new JsonObject();
data.set("method", method);
data.set("params", params);
return data.toString().getBytes();
}

static byte[] depositMsg(String from, String to, BigInteger amount, byte[] data) {
ByteArrayObjectWriter writer = Context.newByteArrayObjectWriter("RLPn");
writer.beginList(4);
writer.write("xhubtransfer");
writer.write(to);
writer.write(amount);
writer.write(data);
writer.end();
return writer.toByteArray();
}
static byte[] getXRemoveData(BigInteger poolId, BigInteger lpTokenBalance, Boolean withdraw) {
ByteArrayObjectWriter writer = Context.newByteArrayObjectWriter("RLPn");
writer.beginList(4);
writer.write("xremove");
writer.write(poolId);
writer.write(lpTokenBalance);
writer.write(withdraw);
writer.end();
return writer.toByteArray();
}

static byte[] getStakeData(BigInteger poolId, BigInteger amount, String to, byte[] data) {
ByteArrayObjectWriter writer = Context.newByteArrayObjectWriter("RLPn");
writer.beginList(4);
writer.write("xhubtransfer");
writer.write(to);
writer.write(amount);
writer.write(poolId);
writer.write(data);
writer.end();
return writer.toByteArray();
}

static byte[] getAddLPData(String baseToken, String quoteToken, BigInteger baseValue, BigInteger quoteValue, Boolean withdraw_unused, BigInteger slippagePercentage) {
ByteArrayObjectWriter writer = Context.newByteArrayObjectWriter("RLPn");
writer.beginList(7);
writer.write("xadd");
writer.write(baseToken);
writer.write(quoteToken);
writer.write(baseValue);
writer.write(quoteValue);
writer.write(withdraw_unused);
writer.write(slippagePercentage);
writer.end();
return writer.toByteArray();
}

void transferSicxToken() {
byte[] data = "testData".getBytes();
((StakingScoreClient) userStakeScoreClient).stakeICX(BigInteger.valueOf(80).multiply(EXA), userAddress, data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import foundation.icon.jsonrpc.Address;
import foundation.icon.jsonrpc.model.TransactionResult;
import foundation.icon.score.client.DefaultScoreClient;
import foundation.icon.xcall.NetworkAddress;
import network.balanced.score.lib.interfaces.*;
import network.balanced.score.lib.test.integration.Balanced;
import network.balanced.score.lib.test.integration.Env;
Expand Down Expand Up @@ -151,7 +152,8 @@ void testNonStakedLpRewards() {
assertEquals(BigInteger.ZERO, rewards.getBalnHolding(userAddress.toString()));

byte[] stakeLp = "{\"method\":\"_stake\"}".getBytes();
dexUserScoreClient.transfer(balanced.stakedLp._address(), BigInteger.valueOf(90), BigInteger.valueOf(4),
BigInteger poolId = dexUserScoreClient.getPoolId(balanced.baln._address(), balanced.sicx._address());
dexUserScoreClient.transfer(balanced.stakedLp._address(), BigInteger.valueOf(90), poolId,
stakeLp);

// user gets rewards after lp token is staked
Expand Down
Loading