Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
43 changes: 18 additions & 25 deletions apps/indexer/abis/AdriftBundlerAbi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ export const AdriftBundlerAbi = [
type: "address",
internalType: "address"
},
{
name: "decompressorAddress_",
type: "address",
internalType: "address"
},
{
name: "randomnessRole_",
type: "address",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
10 changes: 3 additions & 7 deletions contracts/foundry/script/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -98,26 +98,22 @@ 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();

// Currently Pacifica is configured with an AllowlistSequencingModule that only allows allowlisted
// 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();
}
}
34 changes: 7 additions & 27 deletions contracts/foundry/src/sequencing/AdriftBundler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,16 @@ 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;
}

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;
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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()
Expand All @@ -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) {
Expand Down
21 changes: 5 additions & 16 deletions contracts/foundry/test/AdriftBundler.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down