diff --git a/README.md b/README.md index 59599c9..bb8b96b 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ adrift/ ### Risa (Sequencing Chain) | Contract Name | Address | | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| AdriftBundler | [0x5e384926c2146004e45E474909a11136f5cAb561](https://risa-testnet.explorer.alchemy.com/address/0x5e384926c2146004e45E474909a11136f5cAb561) | +| AdriftBundler | [0xC9d942f8706A94B0A0c0bDC0b6e09E1D66bb18E8](https://risa-testnet.explorer.alchemy.com/address/0xC9d942f8706A94B0A0c0bDC0b6e09E1D66bb18E8) | | Decompressor | [0x5d3f5fc4129290b11ac6ed9bbc99cf11a79a5ef0](https://risa-testnet.explorer.alchemy.com/address/0x5d3f5fc4129290b11ac6ed9bbc99cf11a79a5ef0) | ## License diff --git a/apps/indexer/abis/AdriftBundlerAbi.ts b/apps/indexer/abis/AdriftBundlerAbi.ts index 53e0a3e..ebec697 100644 --- a/apps/indexer/abis/AdriftBundlerAbi.ts +++ b/apps/indexer/abis/AdriftBundlerAbi.ts @@ -7,11 +7,6 @@ export const AdriftBundlerAbi = [ type: "address", internalType: "address" }, - { - name: "decompressorAddress_", - type: "address", - internalType: "address" - }, { name: "randomnessRole_", type: "address", @@ -77,19 +72,6 @@ export const AdriftBundlerAbi = [ outputs: [], stateMutability: "nonpayable" }, - { - type: "function", - name: "decompressor", - inputs: [], - outputs: [ - { - name: "", - type: "address", - internalType: "contract IDecompressor" - } - ], - stateMutability: "view" - }, { type: "function", name: "getMempoolLength", @@ -185,20 +167,31 @@ export const AdriftBundlerAbi = [ }, { type: "function", - name: "processTransaction", + name: "playerContractCheckinNonces", inputs: [ { - name: "txn", - type: "bytes", - internalType: "bytes" + name: "contractAddress", + type: "address", + internalType: "address" + }, + { + name: "playerAddress", + type: "address", + internalType: "address" } ], - outputs: [], - stateMutability: "nonpayable" + outputs: [ + { + name: "checkinNonce", + type: "uint256", + internalType: "uint256" + } + ], + stateMutability: "view" }, { type: "function", - name: "processTransactionUncompressed", + name: "processTransaction", inputs: [ { name: "txn", diff --git a/contracts/foundry/script/Deploy.s.sol b/contracts/foundry/script/Deploy.s.sol index 9ff2ab3..430a11e 100644 --- a/contracts/foundry/script/Deploy.s.sol +++ b/contracts/foundry/script/Deploy.s.sol @@ -98,16 +98,13 @@ contract DeployAdriftBundler is Script { address sequencingAddress = vm.envAddress("SEQUENCING_ADDRESS"); address randomAdmin = vm.envAddress("RANDOM_ADMIN"); address sequencerAdmin = vm.envAddress("SEQUENCER_ADMIN"); - address decompressorAddress = vm.envAddress("DECOMPRESSOR_ADDRESS"); vm.startBroadcast(privateKey); console.log("Creating AdriftBundler"); console.log("Sequencing address", sequencingAddress); console.log("Randomness admin", randomAdmin); console.log("Sequencer admin", sequencerAdmin); - console.log("Decompressor address", decompressorAddress); - AdriftBundler adriftBundler = - new AdriftBundler(sequencingAddress, decompressorAddress, randomAdmin, sequencerAdmin); + AdriftBundler adriftBundler = new AdriftBundler(sequencingAddress, randomAdmin, sequencerAdmin); console.log("AdriftBundler", address(adriftBundler)); vm.stopBroadcast(); @@ -115,9 +112,8 @@ contract DeployAdriftBundler is Script { // addresses to write to the contract. We must allowlist the AdriftBundler so it can process transactions. vm.startBroadcast(vm.envUint("ALLOWLIST_SEQUENCING_MODULE_OWNER_PRIVATE_KEY")); console.log("Allowlisting AdriftBundler on SyndicateSequencingChain"); - IAllowlistSequencingModule(vm.envAddress("ALLOWLIST_SEQUENCING_MODULE_ADDRESS")).addToAllowlist( - address(adriftBundler) - ); + IAllowlistSequencingModule(vm.envAddress("ALLOWLIST_SEQUENCING_MODULE_ADDRESS")) + .addToAllowlist(address(adriftBundler)); vm.stopBroadcast(); } } diff --git a/contracts/foundry/src/sequencing/AdriftBundler.sol b/contracts/foundry/src/sequencing/AdriftBundler.sol index b0437ec..3879246 100644 --- a/contracts/foundry/src/sequencing/AdriftBundler.sol +++ b/contracts/foundry/src/sequencing/AdriftBundler.sol @@ -3,11 +3,9 @@ pragma solidity ^0.8.25; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import {RLPTxBreakdown} from "./RLPTxBreakdown.sol"; -import {IDecompressor} from "../interfaces/IDecompressor.sol"; interface ISequencingChain { function processTransaction(bytes calldata data) external; - function processTransactionUncompressed(bytes calldata data) external; function processTransactionsBulk(bytes[] calldata data) external; } @@ -15,7 +13,6 @@ contract AdriftBundler is AccessControl, ISequencingChain { bytes32 public constant RANDOMNESS_ROLE = keccak256("RANDOMNESS_ROLE"); bytes32 public constant SEQUENCER_ROLE = keccak256("SEQUENCER_ROLE"); - IDecompressor public decompressor; ISequencingChain public sequencingAddress; bytes[] public mempool; @@ -25,14 +22,8 @@ contract AdriftBundler is AccessControl, ISequencingChain { event MempoolUpdated(uint256 mempoolSize, bytes txn); event MempoolCleared(); - constructor( - address sequencingAddress_, - address decompressorAddress_, - address randomnessRole_, - address sequencerRole_ - ) { + constructor(address sequencingAddress_, address randomnessRole_, address sequencerRole_) { sequencingAddress = ISequencingChain(sequencingAddress_); - decompressor = IDecompressor(decompressorAddress_); _grantRole(RANDOMNESS_ROLE, randomnessRole_); _grantRole(SEQUENCER_ROLE, sequencerRole_); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); @@ -47,7 +38,7 @@ contract AdriftBundler is AccessControl, ISequencingChain { } function addRandomness(bytes calldata randomnessTx) external onlyRole(RANDOMNESS_ROLE) { - sequencingAddress.processTransactionUncompressed(randomnessTx); + sequencingAddress.processTransaction(randomnessTx); if (mempool.length != 0) { sequencingAddress.processTransactionsBulk(mempool); @@ -70,15 +61,15 @@ contract AdriftBundler is AccessControl, ISequencingChain { function _processTransactionsBulk(bytes[] memory txns) internal { for (uint256 i = 0; i < txns.length; i++) { - _processTransactionUncompressed(txns[i]); + _processTransaction(txns[i]); } } - function processTransactionUncompressed(bytes calldata txn) public override onlyRole(SEQUENCER_ROLE) { - _processTransactionUncompressed(txn); + function processTransaction(bytes calldata txn) public override onlyRole(SEQUENCER_ROLE) { + _processTransaction(txn); } - function _processTransactionUncompressed(bytes memory txn) internal { + function _processTransaction(bytes memory txn) internal { RLPTxBreakdown.DecodedTransaction memory decodedTx = RLPTxBreakdown.decodeTx(txn); if (decodedTx.data.length > 0 && !decodedTx.isContractDeployment) { // 183ff085 = checkIn() @@ -89,18 +80,7 @@ contract AdriftBundler is AccessControl, ISequencingChain { return; } } - sequencingAddress.processTransactionUncompressed(txn); - } - - function processTransaction(bytes calldata txn) public override onlyRole(SEQUENCER_ROLE) { - _processTransaction(txn); - } - - function _processTransaction(bytes memory txn) internal { - bytes[] memory decompressedTxs = decompressor.decompress(txn); - for (uint256 i = 0; i < decompressedTxs.length; i++) { - _processTransactionUncompressed(decompressedTxs[i]); - } + sequencingAddress.processTransaction(txn); } function getMempoolLength() external view returns (uint256) { diff --git a/contracts/foundry/test/AdriftBundler.t.sol b/contracts/foundry/test/AdriftBundler.t.sol index 71a9d73..e14c2ca 100644 --- a/contracts/foundry/test/AdriftBundler.t.sol +++ b/contracts/foundry/test/AdriftBundler.t.sol @@ -13,32 +13,21 @@ contract MockSequencingChain is ISequencingChain { } } - function processTransactionUncompressed(bytes calldata data) external { - emit ProcessTransaction(data); - } - function processTransaction(bytes calldata data) external { emit ProcessTransaction(data); } } -contract MockDecompressor is IDecompressor { - function decompress(bytes calldata) external pure returns (bytes[] memory) { - return new bytes[](1); - } -} - contract AdriftBundlerTest is Test { AdriftBundler bundler; MockSequencingChain sequencingChain; address randomnessRole = makeAddr("randomnessRole"); address sequencerRole = makeAddr("sequencerRole"); - IDecompressor decompressor = new MockDecompressor(); function setUp() public { sequencingChain = new MockSequencingChain(); - bundler = new AdriftBundler(address(sequencingChain), address(decompressor), randomnessRole, sequencerRole); + bundler = new AdriftBundler(address(sequencingChain), randomnessRole, sequencerRole); } function testBundle() public { @@ -98,7 +87,7 @@ contract AdriftBundlerTest is Test { vm.prank(sequencerRole); vm.expectEmit(true, true, true, true); emit MockSequencingChain.ProcessTransaction(valueTransferTx); - bundler.processTransactionUncompressed(valueTransferTx); + bundler.processTransaction(valueTransferTx); } function testProcessTransactionBulkValueTransfer() public { @@ -113,14 +102,14 @@ contract AdriftBundlerTest is Test { bundler.processTransactionsBulk(txns); } - function testProcessTransactionUncompressedContractDeployment() public { + function testProcessTransactionContractDeployment() public { bytes memory contractDeploymentTx = hex"02f90d4782f9546201840bebc201830d96368080b90cf0608060405234801561000f575f80fd5b50604051610cd0380380610cd083398181016040528101906100319190610238565b6100435f801b8261007b60201b60201c565b506100747fa7900ef85cbbf9e26e9a89d09bdc86e6fb491e1fc5904c1420a245e4c21b0bd98261007b60201b60201c565b5050610263565b5f61008c838361017060201b60201c565b6101665760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101036101d360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061016a565b5f90505b92915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610207826101de565b9050919050565b610217816101fd565b8114610221575f80fd5b50565b5f815190506102328161020e565b92915050565b5f6020828403121561024d5761024c6101da565b5b5f61025a84828501610224565b91505092915050565b610a60806102705f395ff3fe608060405234801561000f575f80fd5b506004361061009c575f3560e01c8063729e7cf611610064578063729e7cf61461015657806378acaefe1461017257806391d1485414610190578063a217fddf146101c0578063d547741f146101de5761009c565b806301ffc9a7146100a0578063248a9ca3146100d05780632f2ff15d1461010057806336568abe1461011c5780635ec01e4d14610138575b5f80fd5b6100ba60048036038101906100b59190610754565b6101fa565b6040516100c79190610799565b60405180910390f35b6100ea60048036038101906100e591906107e5565b610273565b6040516100f7919061081f565b60405180910390f35b61011a60048036038101906101159190610892565b61028f565b005b61013660048036038101906101319190610892565b6102b1565b005b61014061032c565b60405161014d91906108e8565b60405180910390f35b610170600480360381019061016b919061092b565b610332565b005b61017a6103a5565b604051610187919061081f565b60405180910390f35b6101aa60048036038101906101a59190610892565b6103c9565b6040516101b79190610799565b60405180910390f35b6101c861042c565b6040516101d5919061081f565b60405180910390f35b6101f860048036038101906101f39190610892565b610432565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061026c575061026b82610454565b5b9050919050565b5f805f8381526020019081526020015f20600101549050919050565b61029882610273565b6102a1816104bd565b6102ab83836104d1565b50505050565b6102b96105ba565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461031d576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61032782826105c1565b505050565b60015481565b61035c7fa7900ef85cbbf9e26e9a89d09bdc86e6fb491e1fc5904c1420a245e4c21b0bd9336103c9565b61039b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610392906109d6565b60405180910390fd5b8060018190555050565b7fa7900ef85cbbf9e26e9a89d09bdc86e6fb491e1fc5904c1420a245e4c21b0bd981565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b61043b82610273565b610444816104bd565b61044e83836105c1565b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6104ce816104c96105ba565b6106aa565b50565b5f6104dc83836103c9565b6105b05760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061054d6105ba565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600190506105b4565b5f90505b92915050565b5f33905090565b5f6105cc83836103c9565b156106a0575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061063d6105ba565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600190506106a4565b5f90505b92915050565b6106b482826103c9565b6106f75780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016106ee929190610a03565b60405180910390fd5b5050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610733816106ff565b811461073d575f80fd5b50565b5f8135905061074e8161072a565b92915050565b5f60208284031215610769576107686106fb565b5b5f61077684828501610740565b91505092915050565b5f8115159050919050565b6107938161077f565b82525050565b5f6020820190506107ac5f83018461078a565b92915050565b5f819050919050565b6107c4816107b2565b81146107ce575f80fd5b50565b5f813590506107df816107bb565b92915050565b5f602082840312156107fa576107f96106fb565b5b5f610807848285016107d1565b91505092915050565b610819816107b2565b82525050565b5f6020820190506108325f830184610810565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61086182610838565b9050919050565b61087181610857565b811461087b575f80fd5b50565b5f8135905061088c81610868565b92915050565b5f80604083850312156108a8576108a76106fb565b5b5f6108b5858286016107d1565b92505060206108c68582860161087e565b9150509250929050565b5f819050919050565b6108e2816108d0565b82525050565b5f6020820190506108fb5f8301846108d9565b92915050565b61090a816108d0565b8114610914575f80fd5b50565b5f8135905061092581610901565b92915050565b5f602082840312156109405761093f6106fb565b5b5f61094d84828501610917565b91505092915050565b5f82825260208201905092915050565b7f43616c6c6572206973206e6f74207468652072616e646f6d6e6573732061646d5f8201527f696e000000000000000000000000000000000000000000000000000000000000602082015250565b5f6109c0602283610956565b91506109cb82610966565b604082019050919050565b5f6020820190508181035f8301526109ed816109b4565b9050919050565b6109fd81610857565b82525050565b5f604082019050610a165f8301856109f4565b610a236020830184610810565b939250505056fea2646970667358221220290c315476581380f91834eba479c1e1f4edf064d8458912189338f5224b067364736f6c634300081900330000000000000000000000009a37e57d177c5ff8817b55da36f2a2b3532cde3fc001a0734efadc8e93c9eb44a94b74d434b930cd0f91f7f275fb2ec3ab1b97713e6f2ba00de943c042ceb304c0b66002a1c427af93778b8816bd7604ecf1043f6011aa6e"; vm.prank(sequencerRole); vm.expectEmit(true, true, true, true); emit MockSequencingChain.ProcessTransaction(contractDeploymentTx); - bundler.processTransactionUncompressed(contractDeploymentTx); + bundler.processTransaction(contractDeploymentTx); } function testProcessTransactionBulkContractDeployment() public { @@ -154,7 +143,7 @@ contract AdriftBundlerTest is Test { address attacker = makeAddr("attacker"); vm.prank(attacker); vm.expectRevert(); - bundler.processTransactionUncompressed(data); + bundler.processTransaction(data); } function testProcessTransactionsBulk_RevertIfNotSequencerRole() public {