diff --git a/src/TheCompact.sol b/src/TheCompact.sol index f0824ab..7944ee1 100644 --- a/src/TheCompact.sol +++ b/src/TheCompact.sol @@ -82,7 +82,7 @@ import { ExogenousQualifiedSplitBatchMultichainClaimWithWitness } from "./types/BatchMultichainClaims.sol"; -import { PERMIT2_WITNESS_FRAGMENT_HASH } from "./types/EIP712Types.sol"; +import { PERMIT2_DEPOSIT_WITNESS_FRAGMENT_HASH } from "./types/EIP712Types.sol"; import { SplitComponent, TransferComponent, SplitByIdComponent, BatchClaimComponent, SplitBatchClaimComponent } from "./types/Components.sol"; @@ -315,7 +315,7 @@ contract TheCompact is ITheCompact, ERC6909, Extsload, Tstorish { // NOTE: none of these arguments are sanitized; the assumption is that they have to // match the signed values anyway, so *should* be fine not to sanitize them but could // optionally check that there are no dirty upper bits on any of them. - mstore(m, PERMIT2_WITNESS_FRAGMENT_HASH) + mstore(m, PERMIT2_DEPOSIT_WITNESS_FRAGMENT_HASH) calldatacopy(add(m, 0x20), 0x84, 0xa0) // depositor, allocator, resetPeriod, scope, recipient let witness := keccak256(m, 0xc0) @@ -401,7 +401,16 @@ contract TheCompact is ITheCompact, ERC6909, Extsload, Tstorish { uint256 initialId = address(0).toIdIfRegistered(scope, resetPeriod, allocator); return _processBatchPermit2Deposits( - firstUnderlyingTokenIsNative, recipient, initialId, totalTokens, permitted, depositor, nonce, deadline, allocator.toPermit2WitnessHash(depositor, resetPeriod, scope, recipient), signature + firstUnderlyingTokenIsNative, + recipient, + initialId, + totalTokens, + permitted, + depositor, + nonce, + deadline, + allocator.toPermit2DepositWitnessHash(depositor, resetPeriod, scope, recipient), + signature ); } diff --git a/src/lib/HashLib.sol b/src/lib/HashLib.sol index 28af22f..776a80f 100644 --- a/src/lib/HashLib.sol +++ b/src/lib/HashLib.sol @@ -13,17 +13,16 @@ import { BATCH_COMPACT_TYPESTRING_FRAGMENT_TWO, BATCH_COMPACT_TYPESTRING_FRAGMENT_THREE, BATCH_COMPACT_TYPESTRING_FRAGMENT_FOUR, - Allocation, - ALLOCATION_TYPEHASH, - ALLOCATION_TYPESTRING_FRAGMENT_ONE, - ALLOCATION_TYPESTRING_FRAGMENT_TWO, - ALLOCATION_TYPESTRING_FRAGMENT_THREE, + Segment, + SEGMENT_TYPEHASH, MultichainCompact, MULTICHAIN_COMPACT_TYPEHASH, MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_ONE, MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_TWO, MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE, - PERMIT2_WITNESS_FRAGMENT_HASH + MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FOUR, + MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FIVE, + PERMIT2_DEPOSIT_WITNESS_FRAGMENT_HASH } from "../types/EIP712Types.sol"; import { @@ -506,7 +505,7 @@ library HashLib { mstore(add(m, 0x20), caller()) // arbiter mstore(add(m, 0x40), chainid()) - let hasWitness := iszero(eq(allocationTypehash, ALLOCATION_TYPEHASH)) + let hasWitness := iszero(eq(allocationTypehash, SEGMENT_TYPEHASH)) if hasWitness { mstore(add(m, 0x80), calldataload(add(claim, 0xa0))) } // witness mstore(m, keccak256(m, add(0x80, mul(0x20, hasWitness)))) // first allocation hash @@ -527,15 +526,15 @@ library HashLib { } function toMessageHash(MultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - messageHash = toMultichainClaimMessageHash(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash(claim, 0)); + messageHash = toMultichainClaimMessageHash(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash(claim, 0)); } function toMessageHash(BatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - messageHash = toMultichainClaimMessageHash.usingBatchMultichainClaim()(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); + messageHash = toMultichainClaimMessageHash.usingBatchMultichainClaim()(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); } function toMessageHash(QualifiedBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { - messageHash = toMultichainClaimMessageHash.usingQualifiedBatchMultichainClaim()(claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); + messageHash = toMultichainClaimMessageHash.usingQualifiedBatchMultichainClaim()(claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); qualificationMessageHash = toQualificationMessageHash.usingQualifiedBatchMultichainClaim()(claim, messageHash, 0); } @@ -552,11 +551,11 @@ library HashLib { } function toMessageHash(SplitBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - messageHash = toMultichainClaimMessageHash.usingSplitBatchMultichainClaim()(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); + messageHash = toMultichainClaimMessageHash.usingSplitBatchMultichainClaim()(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); } function toMessageHash(QualifiedSplitBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { - messageHash = toMultichainClaimMessageHash.usingQualifiedSplitBatchMultichainClaim()(claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); + messageHash = toMultichainClaimMessageHash.usingQualifiedSplitBatchMultichainClaim()(claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); qualificationMessageHash = toQualificationMessageHash.usingQualifiedSplitBatchMultichainClaim()(claim, messageHash, 0); } @@ -606,7 +605,7 @@ library HashLib { function toMessageHash(QualifiedSplitMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { messageHash = toMultichainClaimMessageHash.usingQualifiedSplitMultichainClaim()( - claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingQualifiedSplitMultichainClaim()(claim, 0x40) + claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingQualifiedSplitMultichainClaim()(claim, 0x40) ); qualificationMessageHash = toQualificationMessageHash.usingQualifiedSplitMultichainClaim()(claim, messageHash, 0); } @@ -629,7 +628,7 @@ library HashLib { function toMessageHash(QualifiedMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { messageHash = toMultichainClaimMessageHash.usingQualifiedMultichainClaim()( - claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingQualifiedMultichainClaim()(claim, 0x40) + claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingQualifiedMultichainClaim()(claim, 0x40) ); qualificationMessageHash = toQualificationMessageHash.usingQualifiedMultichainClaim()(claim, messageHash, 0); } @@ -638,22 +637,19 @@ library HashLib { assembly ("memory-safe") { let m := mload(0x40) // Grab the free memory pointer; memory will be left dirtied. - let allocationTypestringOffset := add(m, 0x59) - // prepare full typestring let witnessTypestringPtr := add(claim, calldataload(add(claim, 0xc0))) let witnessTypestringLength := calldataload(witnessTypestringPtr) mstore(m, MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_ONE) - mstore(add(m, 0x39), MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE) mstore(add(m, 0x20), MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_TWO) + mstore(add(m, 0x40), MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE) + mstore(add(m, 0x76), MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FIVE) + mstore(add(m, 0x60), MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FOUR) - mstore(allocationTypestringOffset, ALLOCATION_TYPESTRING_FRAGMENT_ONE) - mstore(add(allocationTypestringOffset, 0x26), ALLOCATION_TYPESTRING_FRAGMENT_THREE) - mstore(add(allocationTypestringOffset, 0x20), ALLOCATION_TYPESTRING_FRAGMENT_TWO) - calldatacopy(add(allocationTypestringOffset, 0x46), add(0x20, witnessTypestringPtr), witnessTypestringLength) - allocationTypehash := keccak256(allocationTypestringOffset, add(0x46, witnessTypestringLength)) - multichainCompactTypehash := keccak256(m, add(0x9f, witnessTypestringLength)) + calldatacopy(add(m, 0x96), add(0x20, witnessTypestringPtr), witnessTypestringLength) + allocationTypehash := keccak256(add(m, 0x53), add(0x43, witnessTypestringLength)) + multichainCompactTypehash := keccak256(m, add(0x96, witnessTypestringLength)) } } @@ -672,7 +668,7 @@ library HashLib { mstore(add(m, 0x20), caller()) // arbiter mstore(add(m, 0x40), chainid()) - let hasWitness := iszero(eq(allocationTypehash, ALLOCATION_TYPEHASH)) + let hasWitness := iszero(eq(allocationTypehash, SEGMENT_TYPEHASH)) if hasWitness { mstore(add(m, 0x80), calldataload(add(claim, 0xa0))) } // witness let allocationHash := keccak256(m, add(0x80, mul(0x20, hasWitness))) // allocation hash @@ -706,26 +702,26 @@ library HashLib { } function toMessageHash(ExogenousMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - return toExogenousMultichainClaimMessageHash(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousMultichainClaim()(claim, 0x40)); + return toExogenousMultichainClaimMessageHash(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousMultichainClaim()(claim, 0x40)); } function toMessageHash(ExogenousSplitMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { return toExogenousMultichainClaimMessageHash.usingExogenousSplitMultichainClaim()( - claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousSplitMultichainClaim()(claim, 0x40) + claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousSplitMultichainClaim()(claim, 0x40) ); } function toMessageHash(ExogenousBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - return toExogenousMultichainClaimMessageHash.usingExogenousBatchMultichainClaim()(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); + return toExogenousMultichainClaimMessageHash.usingExogenousBatchMultichainClaim()(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); } function toMessageHash(ExogenousSplitBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - return toExogenousMultichainClaimMessageHash.usingExogenousSplitBatchMultichainClaim()(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); + return toExogenousMultichainClaimMessageHash.usingExogenousSplitBatchMultichainClaim()(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); } function toMessageHash(ExogenousQualifiedMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { messageHash = toExogenousMultichainClaimMessageHash.usingExogenousQualifiedMultichainClaim()( - claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousQualifiedMultichainClaim()(claim, 0x80) + claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousQualifiedMultichainClaim()(claim, 0x80) ); qualificationMessageHash = toQualificationMessageHash.usingExogenousQualifiedMultichainClaim()(claim, messageHash, 0); } @@ -741,7 +737,7 @@ library HashLib { function toMessageHash(ExogenousQualifiedSplitMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { messageHash = toExogenousMultichainClaimMessageHash.usingExogenousQualifiedSplitMultichainClaim()( - claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousQualifiedSplitMultichainClaim()(claim, 0x80) + claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingExogenousQualifiedSplitMultichainClaim()(claim, 0x80) ); qualificationMessageHash = toQualificationMessageHash.usingExogenousQualifiedSplitMultichainClaim()(claim, messageHash, 0); } @@ -756,8 +752,7 @@ library HashLib { } function toMessageHash(ExogenousQualifiedBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { - messageHash = - toExogenousMultichainClaimMessageHash.usingExogenousQualifiedBatchMultichainClaim()(claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); + messageHash = toExogenousMultichainClaimMessageHash.usingExogenousQualifiedBatchMultichainClaim()(claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toIdsAndAmountsHash(claim.claims)); qualificationMessageHash = toQualificationMessageHash.usingExogenousQualifiedBatchMultichainClaim()(claim, messageHash, 0); } @@ -777,9 +772,8 @@ library HashLib { } function toMessageHash(ExogenousQualifiedSplitBatchMultichainClaim calldata claim) internal view returns (bytes32 messageHash, bytes32 qualificationMessageHash) { - messageHash = toExogenousMultichainClaimMessageHash.usingExogenousQualifiedSplitBatchMultichainClaim()( - claim, 0x40, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims) - ); + messageHash = + toExogenousMultichainClaimMessageHash.usingExogenousQualifiedSplitBatchMultichainClaim()(claim, 0x40, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, toSplitIdsAndAmountsHash(claim.claims)); qualificationMessageHash = toQualificationMessageHash.usingExogenousQualifiedSplitBatchMultichainClaim()(claim, messageHash, 0); } @@ -801,15 +795,14 @@ library HashLib { } function toMessageHash(SplitMultichainClaim calldata claim) internal view returns (bytes32 messageHash) { - messageHash = - toMultichainClaimMessageHash.usingSplitMultichainClaim()(claim, 0, ALLOCATION_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingSplitMultichainClaim()(claim, 0)); + messageHash = toMultichainClaimMessageHash.usingSplitMultichainClaim()(claim, 0, SEGMENT_TYPEHASH, MULTICHAIN_COMPACT_TYPEHASH, deriveIdsAndAmountsHash.usingSplitMultichainClaim()(claim, 0)); } - function toPermit2WitnessHash(address allocator, address depositor, ResetPeriod resetPeriod, Scope scope, address recipient) internal pure returns (bytes32 witnessHash) { + function toPermit2DepositWitnessHash(address allocator, address depositor, ResetPeriod resetPeriod, Scope scope, address recipient) internal pure returns (bytes32 witnessHash) { assembly ("memory-safe") { let m := mload(0x40) // Grab the free memory pointer; memory will be left dirtied. - mstore(m, PERMIT2_WITNESS_FRAGMENT_HASH) + mstore(m, PERMIT2_DEPOSIT_WITNESS_FRAGMENT_HASH) mstore(add(m, 0x20), depositor) mstore(add(m, 0x40), allocator) mstore(add(m, 0x60), resetPeriod) diff --git a/src/types/EIP712Types.sol b/src/types/EIP712Types.sol index 66ce092..f0b2b3f 100644 --- a/src/types/EIP712Types.sol +++ b/src/types/EIP712Types.sol @@ -45,40 +45,30 @@ bytes32 constant BATCH_COMPACT_TYPEHASH = 0x5a7fee8000a237929ef9be08f2933c4b4f32 // abi.decode(bytes("BatchCompact(address arbiter,add"), (bytes32)) bytes32 constant BATCH_COMPACT_TYPESTRING_FRAGMENT_ONE = 0x4261746368436f6d70616374286164647265737320617262697465722c616464; -//abi.decode(bytes("BatchCompact(address arbiter,add"), (bytes32)); // abi.decode(bytes("ress sponsor,uint256 nonce,uint2"), (bytes32)) bytes32 constant BATCH_COMPACT_TYPESTRING_FRAGMENT_TWO = 0x726573732073706f6e736f722c75696e74323536206e6f6e63652c75696e7432; -//abi.decode(bytes("ress sponsor,uint256 nonce,uint2"), (bytes32)); // abi.decode(bytes("56 expires,uint256[2][] idsAndAm"), (bytes32)) bytes32 constant BATCH_COMPACT_TYPESTRING_FRAGMENT_THREE = 0x353620657870697265732c75696e743235365b325d5b5d20696473416e64416d; -//abi.decode(bytes("56 expires,uint256[2][] idsAndAm"), (bytes32)); // uint48(abi.decode(bytes("ounts,"), (bytes6))) uint48 constant BATCH_COMPACT_TYPESTRING_FRAGMENT_FOUR = 0x6f756e74732c; // A multichain compact can declare tokens and amounts to allocate from multiple chains, -// each designated by their chainId. Any allocated tokens must designate the Multichain -// scope. Each allocation may designate a unique arbiter for the chain in question. -struct Allocation { +// each designated by their chainId. Any allocated tokens on an exogenous domain (e.g. all +// but the first segment) must designate the Multichain scope. Each segment may designate +// a unique arbiter for the chain in question. Note that the witness data is distinct for +// each segment, but all segments must share the same EIP-712 witness typestring. +struct Segment { address arbiter; // The account tasked with verifying and submitting the claim. - uint256 chainId; + uint256 chainId; // The chainId where the tokens are located. uint256[2][] idsAndAmounts; // The allocated token IDs and amounts. // Optional witness may follow. } -// keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)") -bytes32 constant ALLOCATION_TYPEHASH = 0x0f45f7853f78f307081d912de4b372d85725f696a9b9a4b5138a5a1d72b340e0; - -// abi.decode(bytes("Allocation(address arbiter,uint2"), (bytes32)) -bytes32 constant ALLOCATION_TYPESTRING_FRAGMENT_ONE = 0x416c6c6f636174696f6e286164647265737320617262697465722c75696e7432; - -// abi.decode(bytes("56 chainId,uint256[2][] idsAndAm"), (bytes32)) -bytes32 constant ALLOCATION_TYPESTRING_FRAGMENT_TWO = 0x353620636861696e49642c75696e743235365b325d5b5d20696473416e64416d; - -// uint48(abi.decode(bytes("ounts,"), (bytes6))) -uint48 constant ALLOCATION_TYPESTRING_FRAGMENT_THREE = 0x6f756e74732c; +// keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)") +bytes32 constant SEGMENT_TYPEHASH = 0x295feb095767cc67d7e74695da0adaddede54d7b7194a8a5426fe8f0351e0337; // Message signed by the sponsor that specifies the conditions under which a set of // tokens across a number of different chains can be claimed; the specified arbiter on @@ -88,11 +78,11 @@ struct MultichainCompact { address sponsor; // The account to source the tokens from. uint256 nonce; // A parameter to enforce replay protection, scoped to allocator. uint256 expires; // The time at which the claim expires. - Allocation[] allocations; + Segment[] segments; // Arbiter, chainId, ids & amounts, and witness for each chain. } -// keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)") -bytes32 constant MULTICHAIN_COMPACT_TYPEHASH = 0x99704ffe7f2b23b270b03ab25ea2e37b1694622eb999ddcbf45d32d9b1a38c9c; +// keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)") +bytes32 constant MULTICHAIN_COMPACT_TYPEHASH = 0x5ca9a66b8bbf0d2316e90dfa3df465f0790b277b25393a3ef4d67e1f50865057; // abi.decode(bytes("MultichainCompact(address sponso"), (bytes32)) bytes32 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_ONE = 0x4d756c7469636861696e436f6d7061637428616464726573732073706f6e736f; @@ -100,8 +90,14 @@ bytes32 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_ONE = 0x4d756c7469636861 // abi.decode(bytes("r,uint256 nonce,uint256 expires,"), (bytes32)) bytes32 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_TWO = 0x722c75696e74323536206e6f6e63652c75696e7432353620657870697265732c; -// uint200(abi.decode(bytes("Allocation[] allocations)"), (bytes25))) -uint200 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE = 0x416c6c6f636174696f6e5b5d20616c6c6f636174696f6e7329; +// abi.decode(bytes("Segment[] segments)Segment(addre"), (bytes32)) +bytes32 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE = 0x5365676d656e745b5d207365676d656e7473295365676d656e74286164647265; + +// abi.decode(bytes("ss arbiter,uint256 chainId,uint2"), (bytes32)) +bytes32 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FOUR = 0x737320617262697465722c75696e7432353620636861696e49642c75696e7432; + +// uint152(abi.decode(bytes("56[2][] idsAndAmounts,"), (uint176))) +uint176 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_FIVE = 0x35365b325d5b5d20696473416e64416d6f756e74732c; // The allocator can optionally attest to arbitrary parameters. Any EIP-712 data // type can be utilized as long as the first argument is the message hash of the @@ -110,4 +106,97 @@ uint200 constant MULTICHAIN_COMPACT_TYPESTRING_FRAGMENT_THREE = 0x416c6c6f636174 // payload as the sponsor. /// @dev `keccak256(bytes("CompactDeposit(address depositor,address allocator,uint8 resetPeriod,uint8 scope,address recipient)"))`. -bytes32 constant PERMIT2_WITNESS_FRAGMENT_HASH = 0x0091bfc8f1539e204529602051ae82f3e6c6f0f86d0227c9ea890616cedbe646; +bytes32 constant PERMIT2_DEPOSIT_WITNESS_FRAGMENT_HASH = 0x0091bfc8f1539e204529602051ae82f3e6c6f0f86d0227c9ea890616cedbe646; + +/// @dev `keccak256(bytes("PermitWitnessTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline,Activation witness)Activation(uint256 id,Compact compact)Compact(address arbiter,address sponsor,uint256 nonce,uint256 expires,uint256 id,uint256 amount)TokenPermissions(address token,uint256 amount)"))`. +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPEHASH = 0xf653f659d3a9d0c2d3b3e901b5f71b67ad949a927c0c27b41dcdf4ecddd9b489; + +// abi.decode(bytes("PermitWitnessTransferFrom(TokenP"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_ONE = 0x5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e50; + +// abi.decode(bytes("ermissions permitted,address spe"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_TWO = 0x65726d697373696f6e73207065726d69747465642c6164647265737320737065; + +// abi.decode(bytes("nder,uint256 nonce,uint256 deadl"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_THREE = 0x6e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c; + +// abi.decode(bytes("ine,Activation witness)Activatio"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FOUR = 0x696e652c41637469766174696f6e207769746e6573732941637469766174696f; + +// abi.decode(bytes("n(uint256 id,Compact compact)Com"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FIVE = 0x6e2875696e743235362069642c436f6d7061637420636f6d7061637429436f6d; + +// abi.decode(bytes("pact(address arbiter,address spo"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SIX = 0x70616374286164647265737320617262697465722c616464726573732073706f; + +// abi.decode(bytes("nsor,uint256 nonce,uint256 expir"), (bytes32)) +bytes32 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SEVEN = 0x6e736f722c75696e74323536206e6f6e63652c75696e74323536206578706972; + +// abi.decode(bytes("es,uint256 id,uint256 amount,"), (uint232)) +uint232 constant PERMIT2_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_EIGHT = 0x65732c75696e743235362069642c75696e7432353620616d6f756e742c; + +/// @dev `keccak256(bytes("PermitBatchWitnessTransferFrom(TokenPermissions[] permitted,address spender,uint256 nonce,uint256 deadline,BatchActivation witness)BatchActivation(uint256[] ids,BatchCompact compact)BatchCompact(address arbiter,address sponsor,uint256 nonce,uint256 expires,uint256[2][] idsAndAmounts)TokenPermissions(address token,uint256 amount)"))`. +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPEHASH = 0x95e426a66b0811209294f67c0bf2ae0aab045490466d04cd6bf18cb70295c0ad; + +// abi.decode(bytes("PermitBatchWitnessTransferFrom(T"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_ONE = 0x5065726d697442617463685769746e6573735472616e7366657246726f6d2854; + +// abi.decode(bytes("okenPermissions[] permitted,addr"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_TWO = 0x6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472; + +// abi.decode(bytes("ess spender,uint256 nonce,uint25"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_THREE = 0x657373207370656e6465722c75696e74323536206e6f6e63652c75696e743235; + +// abi.decode(bytes("6 deadline,BatchActivation witne"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FOUR = 0x3620646561646c696e652c426174636841637469766174696f6e207769746e65; + +// abi.decode(bytes("ss)BatchActivation(uint256[] ids"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FIVE = 0x737329426174636841637469766174696f6e2875696e743235365b5d20696473; + +// abi.decode(bytes(",BatchCompact compact)BatchCompa"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SIX = 0x2c4261746368436f6d7061637420636f6d70616374294261746368436f6d7061; + +// abi.decode(bytes("ct(address arbiter,address spons"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SEVEN = 0x6374286164647265737320617262697465722c616464726573732073706f6e73; + +// abi.decode(bytes("or,uint256 nonce,uint256 expires"), (bytes32)) +bytes32 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_EIGHT = 0x6f722c75696e74323536206e6f6e63652c75696e743235362065787069726573; + +// abi.decode(bytes(",uint256[2][] idsAndAmounts,"), (uint224)) +uint224 constant PERMIT2_BATCH_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_NINE = 0x2c75696e743235365b325d5b5d20696473416e64416d6f756e74732c; + +/// @dev `keccak256(bytes("PermitBatchWitnessTransferFrom(TokenPermissions[] permitted,address spender,uint256 nonce,uint256 deadline,MultichainActivation witness)MultichainActivation(uint256[] ids,MultichainCompact compact)MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)TokenPermissions(address token,uint256 amount)"))`. +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPEHASH = 0xf90692f1da409b7329958cb54b2cd161e836e166b68c456b279b086ca53d43e1; + +// abi.decode(bytes("PermitBatchWitnessTransferFrom(T"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_ONE = 0x5065726d697442617463685769746e6573735472616e7366657246726f6d2854; + +// abi.decode(bytes("okenPermissions[] permitted,addr"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_TWO = 0x6f6b656e5065726d697373696f6e735b5d207065726d69747465642c61646472; + +// abi.decode(bytes("ess spender,uint256 nonce,uint25"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_THREE = 0x657373207370656e6465722c75696e74323536206e6f6e63652c75696e743235; + +// abi.decode(bytes("6 deadline,MultichainActivation "), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FOUR = 0x3620646561646c696e652c4d756c7469636861696e41637469766174696f6e20; + +// abi.decode(bytes("witness)MultichainActivation(uin"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_FIVE = 0x7769746e657373294d756c7469636861696e41637469766174696f6e2875696e; + +// abi.decode(bytes("t256[] ids,MultichainCompact com"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SIX = 0x743235365b5d206964732c4d756c7469636861696e436f6d7061637420636f6d; + +// abi.decode(bytes("pact)MultichainCompact(address s"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_SEVEN = 0x70616374294d756c7469636861696e436f6d7061637428616464726573732073; + +// abi.decode(bytes("ponsor,uint256 nonce,uint256 exp"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_EIGHT = 0x706f6e736f722c75696e74323536206e6f6e63652c75696e7432353620657870; + +// abi.decode(bytes("ires,Segment[] segments)Segment("), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_NINE = 0x697265732c5365676d656e745b5d207365676d656e7473295365676d656e7428; + +// abi.decode(bytes("address arbiter,uint256 chainId,"), (bytes32)) +bytes32 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_TEN = 0x6164647265737320617262697465722c75696e7432353620636861696e49642c; + +// abi.decode(bytes("uint256[2][] idsAndAmounts,"), (uint216)) +uint216 constant PERMIT2_MULTICHAIN_DEPOSIT_WITH_ACTIVATION_TYPESTRING_FRAGMENT_ELEVEN = 0x75696e743235365b325d5b5d20696473416e64416d6f756e74732c; diff --git a/test/TheCompact.t.sol b/test/TheCompact.t.sol index a6a1806..982d87d 100644 --- a/test/TheCompact.t.sol +++ b/test/TheCompact.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.13; import { Test, console } from "forge-std/Test.sol"; import { TheCompact } from "../src/TheCompact.sol"; import { MockERC20 } from "../lib/solady/test/utils/mocks/MockERC20.sol"; -import { Compact, BatchCompact, Allocation } from "../src/types/EIP712Types.sol"; +import { Compact, BatchCompact, Segment } from "../src/types/EIP712Types.sol"; import { ResetPeriod } from "../src/types/ResetPeriod.sol"; import { Scope } from "../src/types/Scope.sol"; import { ISignatureTransfer } from "permit2/src/interfaces/ISignatureTransfer.sol"; @@ -2051,14 +2051,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[0] = [anotherId, anotherAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -2156,14 +2156,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[0] = [anotherId, anotherAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -2289,7 +2289,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -2299,7 +2299,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -2310,7 +2310,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -2428,7 +2428,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -2438,7 +2438,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -2449,7 +2449,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -2578,14 +2578,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[0] = [anotherId, anotherAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -2696,14 +2696,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[0] = [anotherId, anotherAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -2842,7 +2842,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -2852,7 +2852,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -2863,7 +2863,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -2982,7 +2982,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -2992,7 +2992,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -3003,7 +3003,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -3150,14 +3150,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[1] = [aThirdId, aThirdAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -3275,14 +3275,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[1] = [aThirdId, aThirdAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -3416,7 +3416,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -3426,7 +3426,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -3437,7 +3437,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -3563,7 +3563,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -3573,7 +3573,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -3584,7 +3584,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, nonce, @@ -3732,14 +3732,14 @@ contract TheCompactTest is Test { idsAndAmountsTwo[1] = [aThirdId, aThirdAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, nonce, expires, @@ -3878,17 +3878,17 @@ contract TheCompactTest is Test { idsAndAmountsTwo[1] = [aThirdId, aThirdAmount]; bytes32 allocationHashOne = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)))); bytes32 allocationHashTwo = - keccak256(abi.encode(keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); + keccak256(abi.encode(keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)))); bytes32[] memory additionalChains = new bytes32[](1); additionalChains[0] = allocationHashTwo; bytes32 claimHash = keccak256( abi.encode( - keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), + keccak256("MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts)"), swapper, 0, expires, @@ -4065,7 +4065,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -4075,7 +4075,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -4089,7 +4089,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, 0, @@ -4258,7 +4258,7 @@ contract TheCompactTest is Test { bytes32 allocationHashOne = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, block.chainid, keccak256(abi.encodePacked(idsAndAmountsOne)), @@ -4268,7 +4268,7 @@ contract TheCompactTest is Test { bytes32 allocationHashTwo = keccak256( abi.encode( - keccak256("Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), + keccak256("Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)"), arbiter, anotherChainId, keccak256(abi.encodePacked(idsAndAmountsTwo)), @@ -4282,7 +4282,7 @@ contract TheCompactTest is Test { bytes32 claimHash = keccak256( abi.encode( keccak256( - "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Allocation[] allocations)Allocation(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" + "MultichainCompact(address sponsor,uint256 nonce,uint256 expires,Segment[] segments)Segment(address arbiter,uint256 chainId,uint256[2][] idsAndAmounts,Witness witness)Witness(uint256 witnessArgument)" ), swapper, 0,