Skip to content

Commit

Permalink
Merge pull request #80 from uniworld-io/PosBridge
Browse files Browse the repository at this point in the history
Update urc721 fee policy, limit futureDeal transfer amout
  • Loading branch information
elonkusk authored Jun 17, 2022
2 parents 1159a9c + d9f4ba4 commit 74c9605
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 27 deletions.
4 changes: 3 additions & 1 deletion src/main/java/org/unichain/common/utils/ActuatorUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ public static void cutFutureDeal(final Manager dbManager, byte[] fromAddr, byte[
return;
}

//other deals exist
var headKey = summary.getLowerTick().toByteArray();
if (Arrays.equals(headKey, dealKey)) {
/**
Expand Down Expand Up @@ -245,13 +246,14 @@ public static void cutFutureDeal(final Manager dbManager, byte[] fromAddr, byte[
/**
* if this deal is tail, so....
*/
//update summary
//update prev deal
var tail = futureStore.get(tailKey);
var prevTickKey = tail.getPrevTick().toByteArray();
var prevTick = futureStore.get(prevTickKey);
prevTick.clearNextTick();
futureStore.put(prevTickKey, prevTick);

//update summary
summary = summary.toBuilder()
.setUpperTick(tail.getPrevTick())
.setUpperTime(prevTick.getExpireTime())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ public boolean execute(TransactionResultCapsule ret) throws ContractExeException
}

//real amount
var dealKey = Util.makeFutureTransferIndexKey(ownerAddr, Util.makeDayTick(dealId));
var futureDeal = futureStore.get(dealKey);
var ownerDealKey = Util.makeFutureTransferIndexKey(ownerAddr, Util.makeDayTick(dealId));
var futureDeal = futureStore.get(ownerDealKey);
var amt = ctx.hasField(TRANSFER_FUTURE_DEAL_FIELD_AMT) ? ctx.getAmount() : futureDeal.getBalance();

ActuatorUtil.cutFutureDeal(dbManager, ownerAddr, dealKey, amt);
ActuatorUtil.cutFutureDeal(dbManager, ownerAddr, ownerDealKey, amt);
ActuatorUtil.addFutureDeal(dbManager, toAddr, amt, dealId);

chargeFee(ownerAddr, fee);
Expand Down Expand Up @@ -92,7 +92,7 @@ public boolean validate() throws ContractValidateException {
fee = Math.addExact(fee, dbManager.getDynamicPropertiesStore().getCreateNewAccountFeeInSystemContract());
}
else {
Assert.isTrue(toAccount.getType() != Protocol.AccountType.Contract, "Allow transfer to normal account only!");
Assert.isTrue(toAccount.getType() != Protocol.AccountType.Contract, "Can not transfer to contract account");
}

/**
Expand All @@ -103,7 +103,10 @@ public boolean validate() throws ContractValidateException {
Assert.isTrue(futureStore.has(dealId) && futureStore.get(dealId).getBalance() > 0, "No future deal or not enough future balance for dealId: " + ctx.getDealId());

if(ctx.hasField(TRANSFER_FUTURE_DEAL_FIELD_AMT)){
Assert.isTrue(ctx.getAmount() > 0 && ctx.getAmount() <= futureStore.get(dealId).getBalance(), "Invalid amount");
Assert.isTrue(ctx.getAmount() > 0
&& ctx.getAmount() >= 2 * 1000000L, "Invalid amount: at least 2 UNW required");
Assert.isTrue(ctx.getAmount() <= futureStore.get(dealId).getBalance()
, "Invalid amount: not enough future balance");
}

Assert.isTrue(accountStore.get(ownerAddr).getBalance() > fee, "Validate TransferContract error, balance is not sufficient");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
import java.math.BigInteger;
import java.util.Arrays;

//@todo dont charge unw fee, just charge token fee
@Slf4j(topic = "actuator")
public class Urc20BurnActuator extends AbstractActuator {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,23 @@ public boolean execute(TransactionResultCapsule ret) throws ContractExeException
var ctx = contract.unpack(Urc721CreateContract.class);
var owner = ctx.getOwnerAddress().toByteArray();
var tokenAddr = ctx.getAddress().toByteArray();
var accountStore = dbManager.getAccountStore();

//save contract
dbManager.saveUrc721Contract(new Urc721ContractCapsule(ctx, dbManager.getHeadBlockTimeStamp(), 0));

//create account
//create contract account
dbManager.createDefaultAccount(tokenAddr, Protocol.AccountType.Contract);

//create minter account
if (ctx.hasField(URC721_CREATE_CONTRACT_FIELD_MINTER)){
var minterAddr = ctx.getMinter().toByteArray();
if(!accountStore.has(minterAddr)){
dbManager.createDefaultAccount(minterAddr, Protocol.AccountType.Normal);
fee = Math.addExact(fee, dbManager.getDynamicPropertiesStore().getCreateNewAccountFeeInSystemContract());
}
}

chargeFee(owner, fee);
dbManager.burnFee(fee);
ret.setStatus(fee, code.SUCESS);
Expand Down Expand Up @@ -122,11 +132,17 @@ public boolean validate() throws ContractValidateException {
if (ctx.hasField(URC721_CREATE_CONTRACT_FIELD_MINTER)){
var minterAddr = ctx.getMinter().toByteArray();
Assert.isTrue(Wallet.addressValid(minterAddr)
&& accountStore.has(minterAddr)
&& !Arrays.equals(dbManager.getBurnAddress(), minterAddr)
&& (accountStore.get(minterAddr).getType() != Protocol.AccountType.Contract)
&& !Arrays.equals(minterAddr, ownerAddr)
, "Unrecognized minter address: must exist, not burn address, normal address and not owner address");
&& !Arrays.equals(minterAddr, ownerAddr),
"Bad minter address: must be valid address, not burn address, not owner address");

if(accountStore.has(minterAddr)){
Assert.isTrue(accountStore.get(minterAddr).getType() != Protocol.AccountType.Contract, "Minter can not be contract address");
}
else {
//more fee
fee = Math.addExact(fee, dbManager.getDynamicPropertiesStore().getCreateNewAccountFeeInSystemContract());
}
}

Assert.isTrue(ctx.getTotalSupply() > 0, "TotalSupply must greater than 0");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
@Slf4j(topic = "actuator")
public class Urc721TransferFromActuator extends AbstractActuator {

private static Descriptors.FieldDescriptor URC721_TRANSFER_FROM_FIELD_TOKEN_ID = Urc721TransferFromContract.getDescriptor().findFieldByNumber(Urc721TransferFromContract.TOKEN_ID_FIELD_NUMBER);

public Urc721TransferFromActuator(Any contract, Manager dbManager) {
super(contract, dbManager);
}
Expand Down Expand Up @@ -85,9 +87,6 @@ public boolean execute(TransactionResultCapsule ret) throws ContractExeException
}
}

public static Descriptors.FieldDescriptor URC721_TRANSFER_FROM_FIELD_TOKEN_ID = Urc721TransferFromContract.getDescriptor().findFieldByNumber(Urc721TransferFromContract.TOKEN_ID_FIELD_NUMBER);


@Override
public boolean validate() throws ContractValidateException {
try {
Expand Down
71 changes: 59 additions & 12 deletions src/main/java/org/unichain/core/db/BandwidthProcessorV2.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

import java.util.List;
import java.util.Map;

import static org.unichain.core.capsule.urc721.Urc721ContractCapsule.URC721_CREATE_CONTRACT_FIELD_MINTER;

/**
* Charge bandwidth directly from account balance:
* - don't use global net
Expand Down Expand Up @@ -85,10 +88,11 @@ public void consume(TransactionCapsule tx, TransactionTrace trace) throws Contra
}

/*
@note:
- create new account fee split to 2 part: getCreateAccountFe(default 1000Ginza), getCreateNewAccountFeeInSystemContract default 0Ginza
this part is getCreateAccountFe only.
- if create new account, ignore bandwidth fee
- create new account fee include 2 parts:
- getCreateAccountFee: default 1000 Gas
- getCreateNewAccountFeeInSystemContract: default 0 Gas
- this part is getCreateAccountFe only!
- if charged getCreateAccountFe, ignore bandwidth fee
*/
try {
if (isContractCreateNewAccount(contract)) {
Expand All @@ -114,18 +118,32 @@ public void consume(TransactionCapsule tx, TransactionTrace trace) throws Contra
throw new AccountResourceInsufficientException("Insufficient balance to create new account");
}

/*
/**
or else charge bw fee
*/
try{
switch (contract.getType()) {
/**
* urc30
*/
case TransferTokenContract:
{
var tokenKey = Util.stringAsBytesUppercase(contract.getParameter().unpack(TransferTokenContract.class).getTokenName());
if (useTransactionFee4Urc30Pool(tokenKey, bytesSize, trace))
continue;
break;
}
case WithdrawFutureTokenContract:
{
var tokenKey = Util.stringAsBytesUppercase(contract.getParameter().unpack(WithdrawFutureTokenContract.class).getTokenName());
if (useTransactionFee4Urc30Pool(tokenKey, bytesSize, trace))
continue;
break;
}

/**
* Urc20
*/
case Urc20TransferFromContract:
{
var contractAddr = contract.getParameter().unpack(Urc20TransferFromContract.class).getAddress().toByteArray();
Expand All @@ -140,13 +158,6 @@ public void consume(TransactionCapsule tx, TransactionTrace trace) throws Contra
continue;
break;
}
case WithdrawFutureTokenContract:
{
var tokenKey = Util.stringAsBytesUppercase(contract.getParameter().unpack(WithdrawFutureTokenContract.class).getTokenName());
if (useTransactionFee4Urc30Pool(tokenKey, bytesSize, trace))
continue;
break;
}
case Urc20WithdrawFutureContract:
{
var tokenKey = contract.getParameter().unpack(Urc20WithdrawFutureContract.class).getAddress().toByteArray();
Expand All @@ -168,6 +179,8 @@ public void consume(TransactionCapsule tx, TransactionTrace trace) throws Contra
continue;
break;
}

//other contract
default:
{
if (useTransactionFee(ownerAccountCap, bytesSize, trace))
Expand Down Expand Up @@ -313,6 +326,40 @@ public boolean isContractCreateNewAccount(Contract contract) throws ContractVali
var ctx= contract.getParameter().unpack(Urc20ApproveContract.class);
return !dbManager.getAccountStore().has(ctx.getSpender().toByteArray());
}

/**
* urc721
*/
case Urc721TransferFromContract:
{
var ctx= contract.getParameter().unpack(Urc721TransferFromContract.class);
return !dbManager.getAccountStore().has(ctx.getTo().toByteArray());
}
case Urc721AddMinterContract:
{
var ctx= contract.getParameter().unpack(Urc721AddMinterContract.class);
return !dbManager.getAccountStore().has(ctx.getMinter().toByteArray());
}
case Urc721ApproveContract:
{
var ctx= contract.getParameter().unpack(Urc721ApproveContract.class);
return !dbManager.getAccountStore().has(ctx.getTo().toByteArray()) && ctx.getApprove();
}
case Urc721CreateContract:
{
var ctx= contract.getParameter().unpack(Urc721CreateContract.class);
return ctx.hasField(URC721_CREATE_CONTRACT_FIELD_MINTER) && !dbManager.getAccountStore().has(ctx.getMinter().toByteArray());
}
case Urc721MintContract:
{
var ctx= contract.getParameter().unpack(Urc721MintContract.class);
return !dbManager.getAccountStore().has(ctx.getToAddress().toByteArray());
}
case Urc721SetApprovalForAllContract:
{
var ctx= contract.getParameter().unpack(Urc721SetApprovalForAllContract.class);
return ctx.getApprove() && !dbManager.getAccountStore().has(ctx.getToAddress().toByteArray());
}
default:
return false;
}
Expand Down

0 comments on commit 74c9605

Please sign in to comment.