Skip to content

Commit 14fd019

Browse files
committed
feat(tokenizer): add in the local deployment script a script to attach an existing ERC20 as an IPT
1 parent df3dcf3 commit 14fd019

File tree

4 files changed

+64
-8
lines changed

4 files changed

+64
-8
lines changed

foundry.lock

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"lib/ERC721B": {
3+
"branch": {
4+
"name": "0.2.1",
5+
"rev": "254530019373cfb2aa3cb6e975768857f829823d"
6+
}
7+
},
8+
"lib/forge-std": {
9+
"rev": "87a2a0afc5fafd6297538a45a52ac19e71a84562"
10+
},
11+
"lib/openzeppelin-contracts": {
12+
"branch": {
13+
"name": "release-v4.8",
14+
"rev": "281550b71c3df9a83e6b80ceefc700852c287570"
15+
}
16+
},
17+
"lib/openzeppelin-contracts-upgradeable": {
18+
"rev": "43b82754979c35abcd3ccad7b795754146c62ade"
19+
},
20+
"lib/safe-contracts": {
21+
"branch": {
22+
"name": "v1.4.0",
23+
"rev": "e870f514ad34cd9654c72174d6d4a839e3c6639f"
24+
}
25+
},
26+
"lib/solidity-base64": {
27+
"rev": "537095980643f59e9e00b7b76d341bb9da438eaf"
28+
},
29+
"lib/solmate": {
30+
"branch": {
31+
"name": "v7",
32+
"rev": "ed67feda67b24fdeff8ad1032360f0ee6047ba0a"
33+
}
34+
},
35+
"lib/token-vesting-contract": {
36+
"rev": "b1f3e05bb6f07bec70d2b7b588d622c06f70ae39"
37+
}
38+
}

foundry.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ out = 'out'
44
libs = ['lib']
55
test = 'test'
66
solc_version = "0.8.18"
7+
optimizer = true
8+
optimizer_runs = 200
9+
via_ir = true
710
gas_reports = [
811
"IPNFT",
912
"IPNFTV2",

script/dev/Ipnft.s.sol

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ contract FixtureIpnft is CommonScript {
8585
function run() public {
8686
prepareAddresses();
8787

88-
uint256 tokenId = mintIpnft(bob, bob);
88+
uint256 token1Id = mintIpnft(bob, bob);
89+
uint256 token2Id = mintIpnft(bob, bob);
8990

9091
dealERC20(bob, 1000 ether, usdc);
9192
dealERC20(alice, 1000 ether, usdc);
9293

93-
uint256 listingId = createListing(bob, tokenId, 1 ether, usdc);
94+
uint256 listingId = createListing(bob, token1Id, 1 ether, usdc);
9495
//we're *NOT* accepting the listing here because of inconsistent listing ids on anvil
9596
//execute ApproveAndBuy.s.sol if you want to do that.
9697
console.log("listing id %s", listingId);

script/dev/Tokenizer.s.sol

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import "forge-std/Script.sol";
55
import "forge-std/console.sol";
66
import { IPNFT } from "../../src/IPNFT.sol";
77
import { Tokenizer } from "../../src/Tokenizer.sol";
8+
import { IIPToken } from "../../src/IIPToken.sol";
89
import { Metadata } from "../../src/IIPToken.sol";
910
import { IPToken } from "../../src/IPToken.sol";
1011
import { WrappedIPToken } from "../../src/WrappedIPToken.sol";
12+
import { FakeERC20 } from "../../src/helpers/FakeERC20.sol";
1113

1214
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
1315
import { IPermissioner, TermsAcceptedPermissioner } from "../../src/Permissioner.sol";
@@ -52,18 +54,30 @@ contract FixtureTokenizer is CommonScript {
5254
permissioner = TermsAcceptedPermissioner(vm.envAddress("TERMS_ACCEPTED_PERMISSIONER_ADDRESS"));
5355
}
5456

57+
function prepareAndSignTerms(uint256 tokenId) internal returns (bytes memory) {
58+
string memory terms = permissioner.specificTermsV1(Metadata(tokenId, bob, "bafkreigk5dvqblnkdniges6ft5kmuly47ebw4vho6siikzmkaovq6sjstq"));
59+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(bobPk, ECDSA.toEthSignedMessageHash(abi.encodePacked(terms)));
60+
return abi.encodePacked(r, s, v);
61+
}
62+
5563
function run() public {
5664
prepareAddresses();
5765

58-
string memory terms = permissioner.specificTermsV1(Metadata(1, bob, "bafkreigk5dvqblnkdniges6ft5kmuly47ebw4vho6siikzmkaovq6sjstq"));
5966

6067
vm.startBroadcast(bob);
61-
(uint8 v, bytes32 r, bytes32 s) = vm.sign(bobPk, ECDSA.toEthSignedMessageHash(abi.encodePacked(terms)));
62-
bytes memory signedTerms = abi.encodePacked(r, s, v);
63-
IPToken tokenContract =
64-
tokenizer.tokenizeIpnft(1, 1_000_000 ether, "MOLE", "bafkreigk5dvqblnkdniges6ft5kmuly47ebw4vho6siikzmkaovq6sjstq", signedTerms);
68+
bytes memory signedToken1Terms = prepareAndSignTerms(1);
69+
FakeERC20 usdc = FakeERC20(vm.envAddress("USDC_ADDRESS"));
70+
// Attach an already existing token as an IPT
71+
IIPToken token1Contract = tokenizer.attachIpt(1, "bafkreigk5dvqblnkdniges6ft5kmuly47ebw4vho6siikzmkaovq6sjstq", signedToken1Terms, usdc);
72+
73+
bytes memory signedToken2Terms = prepareAndSignTerms(2);
74+
75+
// Mmint a new IPT
76+
IPToken token2Contract =
77+
tokenizer.tokenizeIpnft(2, 1_000_000 ether, "MOLE", "bafkreigk5dvqblnkdniges6ft5kmuly47ebw4vho6siikzmkaovq6sjstq", signedToken2Terms);
6578
vm.stopBroadcast();
6679

67-
console.log("IPTS_ADDRESS=%s", address(tokenContract));
80+
console.log("ATTACHED_IPT_ADDRESS=%s", address(token1Contract));
81+
console.log("IPT_ADDRESS=%s", address(token2Contract));
6882
}
6983
}

0 commit comments

Comments
 (0)