{"id":20195663,"url":"https://github.com/bokkypoobah/umswap","last_synced_at":"2025-07-17T18:04:53.021Z","repository":{"id":45508822,"uuid":"513684288","full_name":"bokkypoobah/umswap","owner":"bokkypoobah","description":"umswap - \"Like WETH, but for ERC-721s\"","archived":false,"fork":false,"pushed_at":"2023-02-16T23:37:52.000Z","size":15775,"stargazers_count":15,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T09:05:28.304Z","etag":null,"topics":["erc20","erc721","pool","smart-contract","solidity","swap"],"latest_commit_sha":null,"homepage":"","language":"Solidity","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bokkypoobah.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-07-13T22:07:11.000Z","updated_at":"2023-07-03T11:57:18.000Z","dependencies_parsed_at":"2023-01-19T14:32:59.481Z","dependency_job_id":null,"html_url":"https://github.com/bokkypoobah/umswap","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bokkypoobah%2Fumswap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bokkypoobah%2Fumswap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bokkypoobah%2Fumswap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bokkypoobah%2Fumswap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bokkypoobah","download_url":"https://codeload.github.com/bokkypoobah/umswap/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248198893,"owners_count":21063628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erc20","erc721","pool","smart-contract","solidity","swap"],"created_at":"2024-11-14T04:18:39.481Z","updated_at":"2025-04-10T10:13:56.643Z","avatar_url":"https://github.com/bokkypoobah.png","language":"Solidity","funding_links":[],"categories":[],"sub_categories":[],"readme":"# umswap - \"Like WETH, but for ERC-721s\"\n\nUmswaps are subsets of ERC-721 NFT collections pooled into ERC-20 tokens.\n\nUmswaps are created by UmswapFactory.\n\nUI being built at [https://bokkypoobah.github.io/umswap/](https://bokkypoobah.github.io/umswap/).\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003chr /\u003e\n\n\n## History\n\n* 2022-07-16 [UmswapFactory 0.8.5 testing](deployed/UmswapFactory_0.8.5_0x9D6856A4CCef088dA9B6E8a7c476aE05BC7caA2E.sol) deployed to [0x9d6856a4ccef088da9b6e8a7c476ae05bc7caa2e](https://etherscan.io/address/0x9d6856a4ccef088da9b6e8a7c476ae05bc7caa2e#code)\n\n* 2022-07-30 [UmswapFactory 0.8.6 testing](deployed/UmswapFactory_0.8.6_0x39D61eDC9E951C93A0A714c008006c5093992db3.sol) deployed to [0x39D61eDC9E951C93A0A714c008006c5093992db3](https://etherscan.io/address/0x39D61eDC9E951C93A0A714c008006c5093992db3#code)\n\n* 2022-07-31 [UmswapFactory 0.8.7 testing](deployed/UmswapFactory_0.8.7_0xb9969521413D036eAb5Ff2095cDc31BF4600AF9e.sol) deployed to [0xb9969521413D036eAb5Ff2095cDc31BF4600AF9e](https://etherscan.io/address/0xb9969521413D036eAb5Ff2095cDc31BF4600AF9e#code)\n\n* 2022-08-01 [UmswapFactory 0.8.8 testing](deployed/UmswapFactory_0.8.8_0x06cD34744eb3bE01808790Df7D1AeB63355b27Ea.sol) deployed to [0x06cD34744eb3bE01808790Df7D1AeB63355b27Ea](https://etherscan.io/address/0x06cD34744eb3bE01808790Df7D1AeB63355b27Ea#code)\n  * [Bug bounty](https://twitter.com/BokkyPooBah/status/1553875661248270337) offer on this contract\n    * Cancelled 2022-08-15 - new version\n\n* 2022-08-15 [UmswapFactory 0.8.9 testing](deployed/UmswapFactory_0.8.9_0x0AE45D0a938f4F07F236e5f43ffB05E79ceE8268.sol]) deployed to [0x0AE45D0a938f4F07F236e5f43ffB05E79ceE8268](https://etherscan.io/address/0x0AE45D0a938f4F07F236e5f43ffB05E79ceE8268#code)\n  * [Bug bounty](https://twitter.com/BokkyPooBah/status/1553875661248270337) now on offer on this contract\n    * Cancelled 2022-09-28 - new version\n\n* 2022-09-28 [UmswapFactory 0.9.0 testing](deployed/UmswapFactory_0.9.0_0x8f093895cD4C54eaB897C6377e1Bf85Fe5B4E948.sol]) deployed to [0x8f093895cD4C54eaB897C6377e1Bf85Fe5B4E948](https://etherscan.io/address/0x8f093895cD4C54eaB897C6377e1Bf85Fe5B4E948#code)\n  * [Bug bounty](https://twitter.com/BokkyPooBah/status/1553875661248270337) now on offer on this contract\n\n\u003cbr /\u003e\n\n\u003chr /\u003e\n\n## Umswap Functions\n\n### Umswap Read Functions\n\n#### allowance(tokenOwner, spender)\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction allowance(address tokenOwner, address spender) override external view returns (uint remaining)\n```\n\n\u003cbr /\u003e\n\n#### balanceOf(tokenOwner)\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction balanceOf(address tokenOwner) override external view returns (uint balance)\n```\n\n\u003cbr /\u003e\n\n#### decimals()\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function. Set to 18 decimals.\n\n```javascript\nfunction decimals() override external view returns (uint8)\n```\n\n\u003cbr /\u003e\n\n#### getInfo()\n\n```javascript\nfunction getInfo() public view returns (address _creator, string memory __symbol, string memory __name, uint[] memory _tokenIds, uint _swappedIn, uint _swappedOut, uint __totalSupply)\n```\n\n\u003cbr /\u003e\n\n#### isValidTokenId(tokenId)\n\n```javascript\nfunction isValidTokenId(uint _tokenId) public view returns (bool)\n```\n\n\u003cbr /\u003e\n\n#### name()\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction name() override external view returns (string memory)\n```\n\n\u003cbr /\u003e\n\n#### symbol()\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction symbol() override external view returns (string memory)\n```\n\n\u003cbr /\u003e\n\n#### totalSupply()\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction totalSupply() override external view returns (uint)\n```\n\n\u003cbr /\u003e\n\n### Umswap Write Functions\n\n#### approve(spender, tokens)\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction approve(address spender, uint tokens) override external returns (bool success)\n```\n\n\u003cbr /\u003e\n\n#### receive()\n\nReceive any tips in ETH.\n\n```receive\nreceive() external payable\n```\n\n\u003cbr /\u003e\n\n#### swap(inTokenIds, outTokenIds, integrator)\n\n```javascript\nfunction swap(uint[] calldata _inTokenIds, uint[] calldata _outTokenIds, address integrator) public payable reentrancyGuard\n```\n\n\u003cbr /\u003e\n\n#### transfer(to, tokens)\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction transfer(address to, uint tokens) override external returns (bool success)\n```\n\n\u003cbr /\u003e\n\n#### transferFrom(from, to, tokens)\n\nStandard [ERC-20](https://eips.ethereum.org/EIPS/eip-20) function.\n\n```javascript\nfunction transferFrom(address from, address to, uint tokens) override external returns (bool success)\n```\n\n\u003cbr /\u003e\n\n\u003chr /\u003e\n\n## UmswapFactory Functions\n\n### UmswapFactory Read Functions\n\n#### isValidName\n\nIs name valid? Name cannot start or end with spaces, or contain repeating spaces. Name must be between 1 and 48 characters in length. Valid characters are 0-9, A-Z, a-z, space, +, -, : .\n\n```javascript\nfunction isValidName(string memory str) public pure returns (bool)\n```\n\n\u003cbr /\u003e\n\n#### getUmswapsLength\n\n```javascript\nfunction getUmswapsLength() public view returns (uint _length)\n```\n\n\u003cbr /\u003e\n\n#### getUmswaps\n\n```javascript\nfunction getUmswaps(uint[] memory indices) public view returns (\n    Umswap[] memory _umswaps,\n    address[] memory _creators,\n    string[] memory _symbols,\n    string[] memory _names,\n    uint[][] memory _tokenIds,\n    uint[] memory _swappedIns,\n    uint[] memory _swappedOuts,\n    uint[] memory _totalSupplies\n)\n```\n\n\u003cbr /\u003e\n\n#### owner\n\nOwner of UmswapFactory\n\n```javascript\naddress public owner\n```\n\n\u003cbr /\u003e\n\n#### umswaps\n\nArray of child Umswap addresses\n\n```javascript\nUmswap[] public umswaps\n```\n\n\u003cbr /\u003e\n\n### UmswapFactory Write Functions\n\n#### newUmswap\n\n```javascript\nfunction newUmswap(IERC721Partial _collection, string calldata _name, uint[] calldata _tokenIds, address integrator)\n```\n\n\u003cbr /\u003e\n\n#### receive\n\n```javascript\nreceive() external payable\n```\n\n\u003cbr /\u003e\n\n#### transferOwnership\n\n```javascript\nfunction transferOwnership(address _newOwner) public onlyOwner\n```\n\n\u003cbr /\u003e\n\n#### withdraw\n\n```javascript\nfunction withdraw(address token, uint tokens, uint tokenId) public onlyOwner\n```\n\n\n\n\u003chr /\u003e\n\n## Testing\n\nSee [test/00_test_0.js](test/00_test_0.js) for the testing scripts and [testIt.out](testIt.out) for the results.\n\n\u003cbr /\u003e\n\n### UmswapFactory\n* [ ] Owned\n  * [ ] Can only initialise once `AlreadyInitialised()`\n  * [ ] Transfer ownership\n    * [ ] Valid ownership transfer\n    * [ ] Invalid ownership transfer `NotOwner()`\n* [ ] TipHandler\n  * [ ] Zero tips\n  * [ ] Non-zero tips\n    * [ ] `integrator` set to `address(0)`\n    * [ ] `integrator` set to `address(this)`\n    * [ ] `integrator` set to EOA/contract address/contract that rejects ETH payment\n* [ ] CloneFactory\n  * [ ] Check\n* [ ] UmswapFactory\n  * [ ] `newUmswap(...)`\n    * [ ] Collection set to EOA `NotERC721()`\n    * [ ] Collection set to non ERC-721 contract `NotERC721()`\n    * [ ] Invalid name `InvalidName()`\n    * [ ] TokenIds not sorted ascending `TokenIdsMustBeSortedWithNoDuplicates()`\n    * [ ] Duplicate set `DuplicateSet()`\n  * [ ] Receive ETH transfers\n  * [ ] Reject ERC-721 `safeTransferFrom(msg.sender, UmswapFactory, tokenId)` transfers\n  * [ ] Withdraw\n    * [ ] ETH\n    * [ ] ERC-20\n    * [ ] ERC-721\n    * [ ] Not owner `NotOwner()`\n\n### Umswap\n* [ ]\n* [ ]\n  * [ ]\n\n\n## Notes\n\nnpm install --save-dev hardhat\nOpenZeppelin v4.7.0\nnpm install --save-dev @openzeppelin/test-helpers\nnpm install --save-dev @nomicfoundation/hardhat-toolbox\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbokkypoobah%2Fumswap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbokkypoobah%2Fumswap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbokkypoobah%2Fumswap/lists"}