diff --git a/contracts/built-in/Extension.sol b/contracts/built-in/Extension.sol index e5f3d1d..5fd2a84 100644 --- a/contracts/built-in/Extension.sol +++ b/contracts/built-in/Extension.sol @@ -28,4 +28,8 @@ interface Extension { /// @notice Get the account that pays the TX fee at runtime. function txGasPayer() external view returns (address); + + // extension v3 methods + function txClauseIndex() external view returns (uint256); + function txClauseCount() external view returns (uint256); } diff --git a/network/config/genesis.json b/network/config/genesis.json index 950e1b8..615ab2c 100644 --- a/network/config/genesis.json +++ b/network/config/genesis.json @@ -9,7 +9,7 @@ "ETH_IST": 0, "VIP214": 0, "FINALITY": 0, - "GALACTICA": 0 + "GALACTICA": 1 }, "accounts": [ { diff --git a/test/evm/builtins/extension.test.js b/test/evm/builtins/extension.test.js new file mode 100644 index 0000000..246ef57 --- /dev/null +++ b/test/evm/builtins/extension.test.js @@ -0,0 +1,64 @@ +import { ThorWallet } from '../../../src/wallet' +import { Client } from '../../../src/thor-client' +import { contractAddresses } from '../../../src/contracts/addresses' +import { Extension__factory } from '../../../typechain-types' +import { addUintPadding } from '../../../src/utils/padding-utils' + +describe('Builtin :: Extension', () => { + const wallet = ThorWallet.withFunds() + const extension = Client.sdk.contracts.load( + contractAddresses.extension, + Extension__factory.abi, + ) + + it.e2eTest('should be able to get the clause count', 'all', async () => { + const count = 100 + const contractCall = await extension.clause.txClauseCount() + const clause = { + to: extension.address, + value: '0x0', + data: contractCall.clause.data, + } + const best = await Client.raw.getBlock('best') + const clauses = Array.from({ length: count }).map(() => clause) + const batchCall = await Client.raw.executeAccountBatch( + { + gas: 10_000_000, + caller: wallet.address, + clauses, + }, + best.body.id, + ) + + for (let i = 0; i < count; i++) { + expect(batchCall.body[i].data).toEqual('0x' + addUintPadding(count)) + } + }) + + it.e2eTest('should be able to get the clause index', 'all', async () => { + const amount = 50 + + const contractCall = await extension.clause.txClauseIndex() + const clause = { + to: extension.address, + value: '0x0', + data: contractCall.clause.data, + } + + const clauses = Array.from({ length: amount }).map(() => clause) + + const best = await Client.raw.getBlock('best') + const batchCall = await Client.raw.executeAccountBatch( + { + gas: 10_000_000, + caller: wallet.address, + clauses, + }, + best.body.id, + ) + + for (let i = 0; i < amount; i++) { + expect(batchCall.body[i].data).toEqual('0x' + addUintPadding(i)) + } + }) +})