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
14 changes: 8 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
export DEPLOYER_PRIVATE_KEY="YOUR_PRIVATE_KEY"
export MNEMONIC="YOUR_MNEMONIC"
export API_KEY_ALCHEMY="YOUR_ALCHEMY_API_KEY"
export API_KEY_INFURA="YOUR_INFURA_API_KEY"
export DEPLOYER_PRIVATE_KEY="your api key"
export API_KEY_ALCHEMY="your api key"
export API_KEY_INFURA="your api key"

export API_KEY_ETHERSCAN="YOUR_ETHERSCAN_API_KEY"
export API_KEY_OPTIMISTIC_ETHERSCAN="YOUR_OPTIMISTIC_ETHERSCAN_API_KEY"
export API_KEY_ARBISCAN="your api key"
export API_KEY_BASESCAN="your api key"
export API_KEY_ETHERSCAN="your api key"
export API_KEY_OPTIMISTIC_ETHERSCAN="your api key"
export API_KEY_CELOSCAN="your api key"
export NEMONIC="test test test test test test test test test test test test"
3 changes: 3 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ env:
API_KEY_OPTIMISTIC_ETHERSCAN: ${{secrets.API_KEY_OPTIMISTIC_ETHERSCAN}}
API_KEY_ETHERSCAN: ${{secrets.API_KEY_ETHERSCAN}}
API_KEY_ALCHEMY: ${{secrets.API_KEY_ALCHEMY}}
API_KEY_ARBISCAN: ${{${{secrets.API_KEY_ARBISCAN}}
API_KEY_BASESCAN: ${{secrets.API_KEY_BASESCAN}}
API_KEY_CELOSCAN: ${{secrets.API_KEY_CELOSCAN}}

jobs:
build:
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/hypercerts-protocol"]
path = lib/hypercerts-protocol
url = https://github.com/hypercerts-org/hypercerts-protocol
21 changes: 19 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
## Implementation

### BatchTransferFraction

```mermaid
sequenceDiagram
actor o as Owner
Expand All @@ -23,6 +24,7 @@ b ->> r: safeTransferFrom()
end

```

```solidity
/// @dev msg.sender must be the owner of all the fraction IDs being transferred
/// @dev msg.sender must have approved the contract to transfer the fractions
Expand All @@ -32,7 +34,6 @@ end
require(data.length > 0, INVALID_DATA());
TransferData memory transferData = abi.decode(data, (TransferData));
require(transferData.recipients.length == transferData.fractionIds.length, INVALID_LENGTHS());

_batchTransfer(transferData.recipients, transferData.fractionIds);
}

Expand All @@ -42,12 +43,28 @@ end
/// @param recipients The addresses of the recipients
/// @param fractionIds The IDs of the fractions to be transferred
function _batchTransfer(address[] memory recipients, uint256[] memory fractionIds) internal {
for (uint256 i = 0; i < recipients.length; i++) {
uint256 length = recipients.length;
for (uint256 i = 0; i < length; i++) {
address recipient = recipients[i];
uint256 fractionId = fractionIds[i];
require(hypercertToken.ownerOf(fractionId) == msg.sender, INVALID_CALLER(msg.sender));

hypercertToken.safeTransferFrom(msg.sender, recipient, fractionId, 1, "");
}
emit BatchFractionTransfer(msg.sender, recipients, fractionIds);
}
```

## Deployments

### BatchTransferFraction

| chain | chainId | address |
| ---------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
| Sepolia | 11155111 | [0x59e07f1cc8eb8eca2703179a7217673318a0fe47](https://sepolia.etherscan.io/address/0x59e07f1cc8eb8eca2703179a7217673318a0fe47) |
| Base Sepolia | 84532 | [0x3C0FaAA04078d715BB05Af82Ca99c41623AeC5Ae](https://sepolia.basescan.org/address/0x3C0FaAA04078d715BB05Af82Ca99c41623AeC5Ae) |
| Arbitrum Sepolia | 421614 | [0x0fCCa2bAd3103934304874E782450688B7a044B0](https://sepolia.arbiscan.io/address/0x0fCCa2bAd3103934304874E782450688B7a044B0) |
| Optimism | 10 | [0xf77e452ec289da0616574aae371800ca4d6315b1](https://optimistic.etherscan.io/address/0xf77e452ec289da0616574aae371800ca4d6315b1) |
| Base | 8453 | [0xc4aEB039BC432343bf4dB57Be203E0540d385a18](https://basescan.org/address/0xc4aEB039BC432343bf4dB57Be203E0540d385a18) |
| Arbitrum | 42161 | [0x8b973c408c2748588b3ECFfDA06D670819FbEb1D](https://arbiscan.io/address/0x8b973c408c2748588b3ECFfDA06D670819FbEb1D) |
| Celo | 42220 | [0xB64B7e4793D72958e028B1D5D556888b115c4c3E](https://celoscan.io/address/0xB64B7e4793D72958e028B1D5D556888b115c4c3E) |
54 changes: 54 additions & 0 deletions broadcast/DeployBatchTransferScript.s.sol/10/run-1745832438.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"transactions": [
{
"hash": "0x731098a5ade3bfca43aee36be56e4d0395f16186a508c69da5869fffe0259c50",
"transactionType": "CREATE",
"contractName": "BatchTransferFraction",
"contractAddress": "0xf77e452ec289da0616574aae371800ca4d6315b1",
"function": null,
"arguments": [
"0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07"
],
"transaction": {
"from": "0xc3593524e2744e547f013e17e6b0776bc27fc614",
"gas": "0x84ba9",
"value": "0x0",
"input": "0x60a060405234801561000f575f5ffd5b5060405161075738038061075783398101604081905261002e91610078565b806001600160a01b03811661006657604051637f4c3a8160e11b81526001600160a01b03909116600482015260240160405180910390fd5b506001600160a01b03166080526100a5565b5f60208284031215610088575f5ffd5b81516001600160a01b038116811461009e575f5ffd5b9392505050565b60805161068d6100ca5f395f8181605201528181610157015261025c015261068d5ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806310a890af14610038578063f49bdbea1461004d575b5f5ffd5b61004b61004636600461038a565b610090565b005b6100747f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b5f8151116100b157604051630e34c5ef60e11b815260040160405180910390fd5b5f818060200190518101906100c691906104c6565b602081015151815151919250146100f05760405163194374f160e11b815260040160405180910390fd5b610101815f01518260200151610105565b5050565b81515f5b818110156102c1575f848281518110610124576101246105bb565b602002602001015190505f848381518110610141576101416105bb565b60200260200101519050336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016101a391815260200190565b602060405180830381865afa1580156101be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e291906105cf565b6001600160a01b031614339061021b5760405163eb804abb60e01b81526001600160a01b03909116600482015260240160405180910390fd5b50604051637921219560e11b81523360048201526001600160a01b038381166024830152604482018390526001606483015260a060848301525f60a48301527f0000000000000000000000000000000000000000000000000000000000000000169063f242432a9060c4015f604051808303815f87803b15801561029d575f5ffd5b505af11580156102af573d5f5f3e3d5ffd5b50506001909401935061010992505050565b50816040516102d091906105ef565b6040518091039020836040516102e69190610624565b6040519081900381209033907f3f3c2c4ea143a2e27fbc736ce3268927ae97ed1db155207ffe0adfaff84cc3cb905f90a4505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156103535761035361031c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156103825761038261031c565b604052919050565b5f6020828403121561039a575f5ffd5b813567ffffffffffffffff8111156103b0575f5ffd5b8201601f810184136103c0575f5ffd5b803567ffffffffffffffff8111156103da576103da61031c565b6103ed601f8201601f1916602001610359565b818152856020838501011115610401575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f67ffffffffffffffff8211156104375761043761031c565b5060051b60200190565b80516001600160a01b0381168114610457575f5ffd5b919050565b5f82601f83011261046b575f5ffd5b815161047e6104798261041e565b610359565b8082825260208201915060208360051b86010192508583111561049f575f5ffd5b602085015b838110156104bc5780518352602092830192016104a4565b5095945050505050565b5f602082840312156104d6575f5ffd5b815167ffffffffffffffff8111156104ec575f5ffd5b8201604081850312156104fd575f5ffd5b610505610330565b815167ffffffffffffffff81111561051b575f5ffd5b8201601f8101861361052b575f5ffd5b80516105396104798261041e565b8082825260208201915060208360051b85010192508883111561055a575f5ffd5b6020840193505b828410156105835761057284610441565b825260209384019390910190610561565b8452505050602082015167ffffffffffffffff8111156105a1575f5ffd5b6105ad8682850161045c565b602083015250949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156105df575f5ffd5b6105e882610441565b9392505050565b81515f90829060208501835b828110156106195781518452602093840193909101906001016105fb565b509195945050505050565b81515f90829060208501835b828110156106195781516001600160a01b031684526020938401939091019060010161063056fea264697066735822122003733715a5bbed9d5d35546e5acca39a8821fadeb212ae4b1651b4978a7a79f964736f6c634300081c0033000000000000000000000000822f17a9a5eecfd66dbaff7946a8071c265d1d07",
"nonce": "0x3b",
"chainId": "0xa"
},
"additionalContracts": [],
"isFixedGasLimit": false
}
],
"receipts": [
{
"status": "0x1",
"cumulativeGasUsed": "0x5eca0e",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"type": "0x2",
"transactionHash": "0x731098a5ade3bfca43aee36be56e4d0395f16186a508c69da5869fffe0259c50",
"transactionIndex": "0x14",
"blockHash": "0xb33570f608b9fb11ccfa5681bc1de1077f0b4404e8fb279f8e97979dbd8ffb3a",
"blockNumber": "0x80db81b",
"gasUsed": "0x66196",
"effectiveGasPrice": "0x30f",
"from": "0xc3593524e2744e547f013e17e6b0776bc27fc614",
"to": null,
"contractAddress": "0xf77e452ec289da0616574aae371800ca4d6315b1",
"l1BaseFeeScalar": "0x146b",
"l1BlobBaseFee": "0x16d24cb01",
"l1BlobBaseFeeScalar": "0xf79c5",
"l1Fee": "0x6c50946dce5",
"l1GasPrice": "0x1c30c8d7",
"l1GasUsed": "0x4a66"
}
],
"libraries": [],
"pending": [],
"returns": {},
"timestamp": 1745832438,
"chain": 10,
"commit": "4ee5d8e"
}
54 changes: 54 additions & 0 deletions broadcast/DeployBatchTransferScript.s.sol/10/run-latest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"transactions": [
{
"hash": "0x731098a5ade3bfca43aee36be56e4d0395f16186a508c69da5869fffe0259c50",
"transactionType": "CREATE",
"contractName": "BatchTransferFraction",
"contractAddress": "0xf77e452ec289da0616574aae371800ca4d6315b1",
"function": null,
"arguments": [
"0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07"
],
"transaction": {
"from": "0xc3593524e2744e547f013e17e6b0776bc27fc614",
"gas": "0x84ba9",
"value": "0x0",
"input": "0x60a060405234801561000f575f5ffd5b5060405161075738038061075783398101604081905261002e91610078565b806001600160a01b03811661006657604051637f4c3a8160e11b81526001600160a01b03909116600482015260240160405180910390fd5b506001600160a01b03166080526100a5565b5f60208284031215610088575f5ffd5b81516001600160a01b038116811461009e575f5ffd5b9392505050565b60805161068d6100ca5f395f8181605201528181610157015261025c015261068d5ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c806310a890af14610038578063f49bdbea1461004d575b5f5ffd5b61004b61004636600461038a565b610090565b005b6100747f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b5f8151116100b157604051630e34c5ef60e11b815260040160405180910390fd5b5f818060200190518101906100c691906104c6565b602081015151815151919250146100f05760405163194374f160e11b815260040160405180910390fd5b610101815f01518260200151610105565b5050565b81515f5b818110156102c1575f848281518110610124576101246105bb565b602002602001015190505f848381518110610141576101416105bb565b60200260200101519050336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016101a391815260200190565b602060405180830381865afa1580156101be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e291906105cf565b6001600160a01b031614339061021b5760405163eb804abb60e01b81526001600160a01b03909116600482015260240160405180910390fd5b50604051637921219560e11b81523360048201526001600160a01b038381166024830152604482018390526001606483015260a060848301525f60a48301527f0000000000000000000000000000000000000000000000000000000000000000169063f242432a9060c4015f604051808303815f87803b15801561029d575f5ffd5b505af11580156102af573d5f5f3e3d5ffd5b50506001909401935061010992505050565b50816040516102d091906105ef565b6040518091039020836040516102e69190610624565b6040519081900381209033907f3f3c2c4ea143a2e27fbc736ce3268927ae97ed1db155207ffe0adfaff84cc3cb905f90a4505050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156103535761035361031c565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156103825761038261031c565b604052919050565b5f6020828403121561039a575f5ffd5b813567ffffffffffffffff8111156103b0575f5ffd5b8201601f810184136103c0575f5ffd5b803567ffffffffffffffff8111156103da576103da61031c565b6103ed601f8201601f1916602001610359565b818152856020838501011115610401575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f67ffffffffffffffff8211156104375761043761031c565b5060051b60200190565b80516001600160a01b0381168114610457575f5ffd5b919050565b5f82601f83011261046b575f5ffd5b815161047e6104798261041e565b610359565b8082825260208201915060208360051b86010192508583111561049f575f5ffd5b602085015b838110156104bc5780518352602092830192016104a4565b5095945050505050565b5f602082840312156104d6575f5ffd5b815167ffffffffffffffff8111156104ec575f5ffd5b8201604081850312156104fd575f5ffd5b610505610330565b815167ffffffffffffffff81111561051b575f5ffd5b8201601f8101861361052b575f5ffd5b80516105396104798261041e565b8082825260208201915060208360051b85010192508883111561055a575f5ffd5b6020840193505b828410156105835761057284610441565b825260209384019390910190610561565b8452505050602082015167ffffffffffffffff8111156105a1575f5ffd5b6105ad8682850161045c565b602083015250949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156105df575f5ffd5b6105e882610441565b9392505050565b81515f90829060208501835b828110156106195781518452602093840193909101906001016105fb565b509195945050505050565b81515f90829060208501835b828110156106195781516001600160a01b031684526020938401939091019060010161063056fea264697066735822122003733715a5bbed9d5d35546e5acca39a8821fadeb212ae4b1651b4978a7a79f964736f6c634300081c0033000000000000000000000000822f17a9a5eecfd66dbaff7946a8071c265d1d07",
"nonce": "0x3b",
"chainId": "0xa"
},
"additionalContracts": [],
"isFixedGasLimit": false
}
],
"receipts": [
{
"status": "0x1",
"cumulativeGasUsed": "0x5eca0e",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"type": "0x2",
"transactionHash": "0x731098a5ade3bfca43aee36be56e4d0395f16186a508c69da5869fffe0259c50",
"transactionIndex": "0x14",
"blockHash": "0xb33570f608b9fb11ccfa5681bc1de1077f0b4404e8fb279f8e97979dbd8ffb3a",
"blockNumber": "0x80db81b",
"gasUsed": "0x66196",
"effectiveGasPrice": "0x30f",
"from": "0xc3593524e2744e547f013e17e6b0776bc27fc614",
"to": null,
"contractAddress": "0xf77e452ec289da0616574aae371800ca4d6315b1",
"l1BaseFeeScalar": "0x146b",
"l1BlobBaseFee": "0x16d24cb01",
"l1BlobBaseFeeScalar": "0xf79c5",
"l1Fee": "0x6c50946dce5",
"l1GasPrice": "0x1c30c8d7",
"l1GasUsed": "0x4a66"
}
],
"libraries": [],
"pending": [],
"returns": {},
"timestamp": 1745832438,
"chain": 10,
"commit": "4ee5d8e"
}
Loading