scale-it / algo-builder

Framework to automate development of Algorand Assets and Smart Contracts.
https://algobuilder.dev
Apache License 2.0
133 stars 42 forks source link

Pooled transaction fees #418

Closed gidonkatten closed 3 years ago

gidonkatten commented 3 years ago

Describe the bug

Fees have been updated in algorand where there is now pooled transaction fees https://developer.algorand.org/articles/introducing-algorand-virtual-machine-avm-09-release/. This applies to all TEAL versions - not just TEAL4.

Expected Behavior

If for example you want to buy an asset from an escrow; you group together a payment to the escrow (tx0) and the asset transfer from the escrow (tx1). You should be able to have tx0 fee 2000 and tx1 fee 0.

Current Behavior

When you try and use a fee less than 1000 then it is automically switched to 1000.

robert-zaremba commented 3 years ago

@gidonkatten - our test environment (@algo-builder/runtime) doesn't support yet TEALv4.

Are you sure in TEALv3, a one tx can pay a fee for another one in the group?

robert-zaremba commented 3 years ago

We will try to test in in the Alogrand node (older version, which doesn't support TEALv4).

Anyway, we will need to update the TEALv4 soon.

gidonkatten commented 3 years ago

From Fabrice on discord general dev It's available since the consensus upgrade of TEAL v4, but you don't need your application to be in TEAL v4 to support it.

amityadav0 commented 3 years ago

Hi I tried this on algod version

8590393345
2.7.1.stable [rel/stable] (commit #5e00bcd6)
go-algorand is licensed with AGPLv3.0
source code available at https://github.com/algorand/go-algorand

this is the script i tried

async function run (runtimeEnv, deployer) {
  // we start with extracting acocunt objects from the config.
  const masterAccount = deployer.accountsByName.get('master-account');
  const goldOwner = deployer.accountsByName.get('alice');
  const john = deployer.accountsByName.get('john');
  const bob = deployer.accountsByName.get('bob');

  // Accounts can only be active if they poses minimum amont of ALGOs.
  // Here we fund the accounts with 5e6, 5e6 and 1e6 micro AlGOs.
  const message = 'funding account';
  const promises = [
    executeTransaction(deployer, mkParam(masterAccount, goldOwner.addr, 5e6, { note: message })),
    executeTransaction(deployer, mkParam(masterAccount, john.addr, 1e5, { note: message })),
    executeTransaction(deployer, mkParam(masterAccount, bob.addr, 1e6, { note: message }))];
  await Promise.all(promises);

  // group with fee distribution
  const groupTx = [
    {
      type: types.TransactionType.TransferAlgo,
      sign: types.SignType.SecretKey,
      fromAccount: goldOwner,
      toAccountAddr: john.addr,
      amountMicroAlgos: 58,
      payFlags: { totalFee: 2000 }
    },
    {
      type: types.TransactionType.TransferAlgo,
      sign: types.SignType.SecretKey,
      fromAccount: john,
      toAccountAddr: bob.addr,
      amountMicroAlgos: 58,
      payFlags: { totalFee: 0 }
    }
  ];
  console.log("Checking fee transaction!!");
  await executeTransaction(deployer, groupTx);
  console.log("Completed!");
}

Group transaction, here john has only minimum balance i.e 1e5 microAlgos. this transaction was not passed on this version ndoe

network tried to deduct fee from john, although fee from goldowner is set to 2000.

gidonkatten commented 3 years ago

@amityadav0 are you sure that algob is not changing the txn from john to have fee 1000? I would suggest trying to use goal or one of the sdks

amityadav0 commented 3 years ago

asf

yes, i checked, there could be another problem. i will check with sdk and goal now.

amityadav0 commented 3 years ago

@gidonkatten you are right, the problem is with the flatFee variable, It needs to be updated according to atomic transaction update. Updating it, thanks

gidonkatten commented 3 years ago

@amityadav0 When till this be merged into master? Thanks

amityadav0 commented 3 years ago

@gidonkatten Hi, probably this week we will make a release with this feature.