From 24aea228e7b4eabf52a4fb9ab96a54b4122db35c Mon Sep 17 00:00:00 2001 From: Andrew Richardson Date: Mon, 9 Jan 2023 12:15:59 -0500 Subject: [PATCH] Change ERC721 samples to use auto-indexing mint by default Signed-off-by: Andrew Richardson --- samples/solidity/contracts/ERC721NoData.sol | 9 +- samples/solidity/contracts/ERC721WithData.sol | 16 +- .../solidity/contracts/IERC721WithData.sol | 2 - samples/solidity/test/ERC721NoData.ts | 179 +++--- samples/solidity/test/ERC721WithData.ts | 170 +++--- ...0NoDataOld.json => ERC20NoDataLegacy.json} | 0 src/abi/ERC721NoData.json | 9 +- ...NoDataOld.json => ERC721NoDataLegacy.json} | 0 ...ithDataOld.json => ERC721WithDataV1a.json} | 0 ...21WithData.json => ERC721WithDataV1b.json} | 0 src/abi/ERC721WithDataV2.json | 565 ++++++++++++++++++ src/abi/IERC721WithData.json | 10 - src/abi/InterfaceCheck.json | 4 +- src/abi/TokenFactory.json | 4 +- src/tokens/abimapper.service.ts | 108 ++-- src/tokens/erc721.ts | 60 +- src/tokens/tokens.interfaces.ts | 1 + src/tokens/tokens.listener.ts | 3 +- src/tokens/tokens.service.spec.ts | 148 ++--- src/tokens/tokens.service.ts | 35 +- test/suites/erc20.ts | 25 +- test/suites/erc721.ts | 43 +- 22 files changed, 956 insertions(+), 435 deletions(-) rename src/abi/{ERC20NoDataOld.json => ERC20NoDataLegacy.json} (100%) rename src/abi/{ERC721NoDataOld.json => ERC721NoDataLegacy.json} (100%) rename src/abi/{ERC721WithDataOld.json => ERC721WithDataV1a.json} (100%) rename src/abi/{ERC721WithData.json => ERC721WithDataV1b.json} (100%) create mode 100644 src/abi/ERC721WithDataV2.json diff --git a/samples/solidity/contracts/ERC721NoData.sol b/samples/solidity/contracts/ERC721NoData.sol index 23992c7..0f43062 100644 --- a/samples/solidity/contracts/ERC721NoData.sol +++ b/samples/solidity/contracts/ERC721NoData.sol @@ -6,6 +6,7 @@ import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; +import '@openzeppelin/contracts/utils/Counters.sol'; /** * Example ERC721 token with mint and burn. @@ -18,9 +19,15 @@ import '@openzeppelin/contracts/access/Ownable.sol'; * This is a sample only and NOT a reference implementation. */ contract ERC721NoData is Context, Ownable, ERC721, ERC721Burnable { + using Counters for Counters.Counter; + + Counters.Counter private _tokenIdCounter; + constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - function safeMint(address to, uint256 tokenId) public onlyOwner { + function safeMint(address to) public onlyOwner { + uint256 tokenId = _tokenIdCounter.current(); + _tokenIdCounter.increment(); _safeMint(to, tokenId); } diff --git a/samples/solidity/contracts/ERC721WithData.sol b/samples/solidity/contracts/ERC721WithData.sol index 6fb3e45..1f53da0 100644 --- a/samples/solidity/contracts/ERC721WithData.sol +++ b/samples/solidity/contracts/ERC721WithData.sol @@ -5,6 +5,7 @@ pragma solidity ^0.8.0; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; +import '@openzeppelin/contracts/utils/Counters.sol'; import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; import './IERC721WithData.sol'; @@ -24,7 +25,11 @@ import './IERC721WithData.sol'; * This is a sample only and NOT a reference implementation. */ contract ERC721WithData is Context, Ownable, ERC721, IERC721WithData { + using Counters for Counters.Counter; + + Counters.Counter private _tokenIdCounter; string private _baseTokenURI; + // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; @@ -44,21 +49,20 @@ contract ERC721WithData is Context, Ownable, ERC721, IERC721WithData { super.supportsInterface(interfaceId); } - function mintWithData( - address to, - uint256 tokenId, - bytes calldata data - ) external override onlyOwner { + function mintWithData(address to, bytes calldata data) external override onlyOwner { + uint256 tokenId = _tokenIdCounter.current(); + _tokenIdCounter.increment(); _safeMint(to, tokenId, data); _setTokenURI(tokenId, string(abi.encodePacked(_baseURI(), Strings.toString(tokenId)))); } function mintWithURI( address to, - uint256 tokenId, bytes calldata data, string memory tokenURI_ ) external override onlyOwner { + uint256 tokenId = _tokenIdCounter.current(); + _tokenIdCounter.increment(); _safeMint(to, tokenId, data); // If there is no tokenURI passed, concatenate the tokenID to the base URI diff --git a/samples/solidity/contracts/IERC721WithData.sol b/samples/solidity/contracts/IERC721WithData.sol index 96f5400..e885f7c 100644 --- a/samples/solidity/contracts/IERC721WithData.sol +++ b/samples/solidity/contracts/IERC721WithData.sol @@ -14,13 +14,11 @@ import '@openzeppelin/contracts/utils/introspection/IERC165.sol'; interface IERC721WithData is IERC165 { function mintWithData( address to, - uint256 tokenId, bytes calldata data ) external; function mintWithURI( address to, - uint256 tokenId, bytes calldata data, string memory tokenURI_ ) external; diff --git a/samples/solidity/test/ERC721NoData.ts b/samples/solidity/test/ERC721NoData.ts index f4a80b7..0cf4f70 100644 --- a/samples/solidity/test/ERC721NoData.ts +++ b/samples/solidity/test/ERC721NoData.ts @@ -36,7 +36,7 @@ describe('ERC721NoData - Unit Tests', function () { // Signer B mint to Signer B (Not allowed) await expect( - deployedERC721NoData.connect(signerB).safeMint(signerB.address, 721), + deployedERC721NoData.connect(signerB).safeMint(signerB.address), ).to.be.revertedWith('Ownable: caller is not the owner'); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); @@ -44,21 +44,19 @@ describe('ERC721NoData - Unit Tests', function () { it('Mint - Deployer should mint tokens to itself successfully', async function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); - // Signer A mint token 721 to Signer A (Allowed) - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 721), - ) + // Signer A mint token to Signer A (Allowed) + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(1); }); it('Mint - Non-deployer of contract should not be able to mint tokens', async function () { expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); - // Signer B mint token 721 to Signer B (Not allowed) + // Signer B mint token to Signer B (Not allowed) await expect( - deployedERC721NoData.connect(signerB).safeMint(signerB.address, 721), + deployedERC721NoData.connect(signerB).safeMint(signerB.address), ).to.be.revertedWith('Ownable: caller is not the owner'); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); @@ -66,9 +64,8 @@ describe('ERC721NoData - Unit Tests', function () { it('Mint - Non-signing address should not be able to mint tokens', async function () { expect(await deployedERC721NoData.balanceOf(ONE_ADDRESS)).to.equal(0); - // Non-signer mint token 721 to non-signer (Not allowed) - await expect(deployedERC721NoData.connect(ONE_ADDRESS).safeMint(ONE_ADDRESS, 721)).to.be - .reverted; + // Non-signer mint token to non-signer (Not allowed) + await expect(deployedERC721NoData.connect(ONE_ADDRESS).safeMint(ONE_ADDRESS)).to.be.reverted; expect(await deployedERC721NoData.balanceOf(ONE_ADDRESS)).to.equal(0); }); @@ -77,35 +74,29 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); - // Signer A mint token 721 to Signer A - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 721), - ) + // Signer A mint token to Signer A + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(1); - expect(await deployedERC721NoData.tokenURI(721)).to.equal('firefly://token/721'); + expect(await deployedERC721NoData.tokenURI(0)).to.equal('firefly://token/0'); - // Signer A transfer token 721 to Signer B + // Signer A transfer token to Signer B await expect( deployedERC721NoData .connect(deployerSignerA) - ['safeTransferFrom(address,address,uint256)']( - deployerSignerA.address, - signerB.address, - 721, - ), + ['safeTransferFrom(address,address,uint256)'](deployerSignerA.address, signerB.address, 0), ) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(deployerSignerA.address, signerB.address, 721); + .withArgs(deployerSignerA.address, signerB.address, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(1); // Signer B burn - await expect(deployedERC721NoData.connect(signerB).burn(721)) + await expect(deployedERC721NoData.connect(signerB).burn(0)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(signerB.address, ZERO_ADDRESS, 721); + .withArgs(signerB.address, ZERO_ADDRESS, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); @@ -115,20 +106,20 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerC.address)).to.equal(0); - // Signer A mint token 721 to Signer B - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 721)) + // Signer A mint token to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer B approves signer A for token 721 - deployedERC721NoData.connect(signerB).approve(deployerSignerA.address, 721); - // Signer A transfers token 721 from signer B to Signer C + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Signer B approves signer A for token + deployedERC721NoData.connect(signerB).approve(deployerSignerA.address, 0); + // Signer A transfers token from signer B to Signer C await expect( deployedERC721NoData .connect(deployerSignerA) - ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 721), + ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 0), ) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(signerB.address, signerC.address, 721); + .withArgs(signerB.address, signerC.address, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); @@ -139,21 +130,21 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerC.address)).to.equal(0); - // Signer A mint to Signer B - tokenId: 720 - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 720)) + // Signer A mint to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 720); - // Signer A mint to Signer B - tokenId: 721 - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 721)) + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Signer A mint to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer B approves signer A for token 721 - deployedERC721NoData.connect(signerB).approve(deployerSignerA.address, 721); - // Signer A transfers token 720 from signer B to Signer C (Not Allowed) + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer B approves signer A for token + deployedERC721NoData.connect(signerB).approve(deployerSignerA.address, 1); + // Signer A transfers token from signer B to Signer C (Not Allowed) await expect( deployedERC721NoData .connect(deployerSignerA) - ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 720), + ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 0), ).to.be.revertedWith('ERC721: caller is not token owner nor approved'); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); @@ -165,25 +156,25 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerC.address)).to.equal(0); - // Mint token token 720 to Signer B - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 720)) + // Mint token token to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 720); - // Mint token 721 to Signer C - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address, 721)) + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Mint token to Signer C + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 721); - // Signer B attempts to transfer token 721 from Signer A to Signer B (Not allowed) + .withArgs(ZERO_ADDRESS, signerC.address, 1); + // Signer B attempts to transfer token from Signer A to Signer B (Not allowed) await expect( deployedERC721NoData .connect(signerB) - ['safeTransferFrom(address,address,uint256)'](signerC.address, signerB.address, 721), + ['safeTransferFrom(address,address,uint256)'](signerC.address, signerB.address, 1), ).to.be.reverted; - // Signer C attempts to transfer token 720 from Signer B to Signer C (Not allowed) + // Signer C attempts to transfer token from Signer B to Signer C (Not allowed) await expect( deployedERC721NoData .connect(signerC) - ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 720), + ['safeTransferFrom(address,address,uint256)'](signerB.address, signerC.address, 0), ).to.be.reverted; expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); @@ -193,27 +184,23 @@ describe('ERC721NoData - Unit Tests', function () { it('Burn - Signer should burn their own tokens successfully', async function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); - // Mint tokens 720 and 721 to Signer A - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 720), - ) + // Mint tokens to Signer A + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 721), - ) + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 1); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(2); - // Signer A burns token 720 - await expect(deployedERC721NoData.connect(deployerSignerA).burn(720)) + // Signer A burns token + await expect(deployedERC721NoData.connect(deployerSignerA).burn(0)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(deployerSignerA.address, ZERO_ADDRESS, 720); + .withArgs(deployerSignerA.address, ZERO_ADDRESS, 0); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(1); - // Signer A burns token 721 - await expect(deployedERC721NoData.connect(deployerSignerA).burn(721)) + // Signer A burns token + await expect(deployedERC721NoData.connect(deployerSignerA).burn(1)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(deployerSignerA.address, ZERO_ADDRESS, 721); + .withArgs(deployerSignerA.address, ZERO_ADDRESS, 1); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); }); @@ -222,26 +209,24 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerC.address)).to.equal(0); - // Signer A mints token 720 to itself - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 720), - ) + // Signer A mints token to itself + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); - // Signer A mints token 721 to Signer B - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 721)) + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); + // Signer A mints token to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer A mints token 722 to Signer C - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address, 722)) + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer A mints token to Signer C + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 722); - // Signer B attempts to burn token 720 from Signer A wallet (not allowed) - await expect(deployedERC721NoData.connect(signerB).burn(720)).to.be.revertedWith( + .withArgs(ZERO_ADDRESS, signerC.address, 2); + // Signer B attempts to burn token from Signer A wallet (not allowed) + await expect(deployedERC721NoData.connect(signerB).burn(0)).to.be.revertedWith( 'ERC721: caller is not token owner nor approved', ); - // Signer C attempts to burn token 721 from Signer B wallet (not allowed) - await expect(deployedERC721NoData.connect(signerC).burn(721)).to.be.revertedWith( + // Signer C attempts to burn token from Signer B wallet (not allowed) + await expect(deployedERC721NoData.connect(signerC).burn(1)).to.be.revertedWith( 'ERC721: caller is not token owner nor approved', ); @@ -254,24 +239,22 @@ describe('ERC721NoData - Unit Tests', function () { expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721NoData.balanceOf(signerC.address)).to.equal(0); - // Signer A mints token 720 to itself - await expect( - deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address, 720), - ) + // Signer A mints token to itself + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(deployerSignerA.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); - // Signer A mints token 721 to Signer B - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address, 721)) + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); + // Signer A mints token to Signer B + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerB.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer A mints token 722 to Signer C - await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address, 722)) + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer A mints token to Signer C + await expect(deployedERC721NoData.connect(deployerSignerA).safeMint(signerC.address)) .to.emit(deployedERC721NoData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 722); + .withArgs(ZERO_ADDRESS, signerC.address, 2); - expect(await deployedERC721NoData.tokenURI(720)).to.equal('firefly://token/720'); - expect(await deployedERC721NoData.tokenURI(721)).to.equal('firefly://token/721'); - expect(await deployedERC721NoData.tokenURI(722)).to.equal('firefly://token/722'); + expect(await deployedERC721NoData.tokenURI(0)).to.equal('firefly://token/0'); + expect(await deployedERC721NoData.tokenURI(1)).to.equal('firefly://token/1'); + expect(await deployedERC721NoData.tokenURI(2)).to.equal('firefly://token/2'); expect(await deployedERC721NoData.balanceOf(deployerSignerA.address)).to.equal(1); expect(await deployedERC721NoData.balanceOf(signerB.address)).to.equal(1); diff --git a/samples/solidity/test/ERC721WithData.ts b/samples/solidity/test/ERC721WithData.ts index f267a08..b5a6e9e 100644 --- a/samples/solidity/test/ERC721WithData.ts +++ b/samples/solidity/test/ERC721WithData.ts @@ -30,7 +30,7 @@ describe('ERC721WithData - Unit Tests', function () { it('Verify interface ID', async function () { const checkerFactory = await ethers.getContractFactory('InterfaceCheck'); const checker: InterfaceCheck = await checkerFactory.connect(deployerSignerA).deploy(); - expect(await checker.erc721WithData()).to.equal('0x8706707d'); + expect(await checker.erc721WithData()).to.equal('0xaefe69bf'); }); it('Create - Should create a new ERC721 instance with default state', async function () { @@ -41,24 +41,24 @@ describe('ERC721WithData - Unit Tests', function () { it('Mint - Should mint successfully with a custom URI', async function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); - // Signer A mint token 721 to Signer A (Allowed) + // Signer A mint token to Signer A (Allowed) await expect( deployedERC721WithData .connect(deployerSignerA) - .mintWithURI(deployerSignerA.address, 721, '0x00', 'ipfs://CID'), + .mintWithURI(deployerSignerA.address, '0x00', 'ipfs://CID'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(1); - expect(await deployedERC721WithData.tokenURI(721)).to.equal('ipfs://CID'); + expect(await deployedERC721WithData.tokenURI(0)).to.equal('ipfs://CID'); }); it('Mint - Non-deployer of contract should not be able to mint tokens', async function () { expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); - // Signer B mint token 721 to Signer B (Not allowed) + // Signer B mint token to Signer B (Not allowed) await expect( - deployedERC721WithData.connect(signerB).mintWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(signerB).mintWithData(signerB.address, '0x00'), ).to.be.revertedWith('Ownable: caller is not the owner'); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); @@ -66,9 +66,9 @@ describe('ERC721WithData - Unit Tests', function () { it('Mint - Non-signing address should not be able to mint tokens', async function () { expect(await deployedERC721WithData.balanceOf(ONE_ADDRESS)).to.equal(0); - // Non-signer mint token 721 to non-signer (Not allowed) - await expect(deployedERC721WithData.connect(ONE_ADDRESS).mintWithData(ONE_ADDRESS, 721, '0x00')) - .to.be.reverted; + // Non-signer mint token to non-signer (Not allowed) + await expect(deployedERC721WithData.connect(ONE_ADDRESS).mintWithData(ONE_ADDRESS, '0x00')).to + .be.reverted; expect(await deployedERC721WithData.balanceOf(ONE_ADDRESS)).to.equal(0); }); @@ -76,24 +76,22 @@ describe('ERC721WithData - Unit Tests', function () { it('Transfer - Signer should transfer tokens to another signer', async function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); - // Signer A mint token 721 to Signer A + // Signer A mint token to Signer A await expect( - deployedERC721WithData - .connect(deployerSignerA) - .mintWithData(deployerSignerA.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(deployerSignerA.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(1); - expect(await deployedERC721WithData.tokenURI(721)).to.equal('firefly://token/721'); - // Signer A transfer token 721 to Signer B + expect(await deployedERC721WithData.tokenURI(0)).to.equal('firefly://token/0'); + // Signer A transfer token to Signer B await expect( deployedERC721WithData .connect(deployerSignerA) - .transferWithData(deployerSignerA.address, signerB.address, 721, '0x00'), + .transferWithData(deployerSignerA.address, signerB.address, 0, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(deployerSignerA.address, signerB.address, 721); + .withArgs(deployerSignerA.address, signerB.address, 0); signerB.getAddress(); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); @@ -104,22 +102,22 @@ describe('ERC721WithData - Unit Tests', function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerC.address)).to.equal(0); - // Signer A mint token 721 to Signer B + // Signer A mint token to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer B approves signer A for token 721 - deployedERC721WithData.connect(signerB).approve(deployerSignerA.address, 721); - // Signer A transfers token 721 from signer B to Signer C + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Signer B approves signer A for token + deployedERC721WithData.connect(signerB).approve(deployerSignerA.address, 0); + // Signer A transfers token from signer B to Signer C await expect( deployedERC721WithData .connect(deployerSignerA) - .transferWithData(signerB.address, signerC.address, 721, '0x00'), + .transferWithData(signerB.address, signerC.address, 0, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(signerB.address, signerC.address, 721); + .withArgs(signerB.address, signerC.address, 0); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); @@ -130,25 +128,25 @@ describe('ERC721WithData - Unit Tests', function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerC.address)).to.equal(0); - // Signer A mint to Signer B - tokenId: 720 + // Signer A mint to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 720, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 720); - // Signer A mint to Signer B - tokenId: 721 + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Signer A mint to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer B approves signer A for token 721 - deployedERC721WithData.connect(signerB).approve(deployerSignerA.address, 721); - // Signer A transfers token 720 from signer B to Signer C (Not Allowed) + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer B approves signer A for token + deployedERC721WithData.connect(signerB).approve(deployerSignerA.address, 1); + // Signer A transfers token from signer B to Signer C (Not Allowed) await expect( deployedERC721WithData .connect(deployerSignerA) - .transferWithData(signerB.address, signerC.address, 720, '0x00'), + .transferWithData(signerB.address, signerC.address, 0, '0x00'), ).to.be.revertedWith('ERC721: caller is not token owner nor approved'); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); @@ -160,29 +158,29 @@ describe('ERC721WithData - Unit Tests', function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerC.address)).to.equal(0); - // Mint token token 720 to Signer B + // Mint token token to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 720, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 720); - // Mint token 721 to Signer C + .withArgs(ZERO_ADDRESS, signerB.address, 0); + // Mint token to Signer C await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 721); - // Signer B attempts to transfer token 721 from Signer A to Signer B (Not allowed) + .withArgs(ZERO_ADDRESS, signerC.address, 1); + // Signer B attempts to transfer token from Signer A to Signer B (Not allowed) await expect( deployedERC721WithData .connect(signerB) - .transferWithData(signerC.address, signerB.address, 721, '0x00'), + .transferWithData(signerC.address, signerB.address, 1, '0x00'), ).to.be.reverted; - // Signer C attempts to transfer token 720 from Signer B to Signer C (Not allowed) + // Signer C attempts to transfer token from Signer B to Signer C (Not allowed) await expect( deployedERC721WithData .connect(signerC) - .transferWithData(signerB.address, signerC.address, 720, '0x00'), + .transferWithData(signerB.address, signerC.address, 0, '0x00'), ).to.be.reverted; expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); @@ -192,39 +190,35 @@ describe('ERC721WithData - Unit Tests', function () { it('Burn - Signer should burn their own tokens successfully', async function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); - // Mint tokens 720 and 721 to Signer A + // Mint tokens to Signer A await expect( - deployedERC721WithData - .connect(deployerSignerA) - .mintWithData(deployerSignerA.address, 720, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(deployerSignerA.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); await expect( - deployedERC721WithData - .connect(deployerSignerA) - .mintWithData(deployerSignerA.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(deployerSignerA.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 721); + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 1); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(2); - // Signer A burns token 720 + // Signer A burns token await expect( deployedERC721WithData .connect(deployerSignerA) - .burnWithData(deployerSignerA.address, 720, '0x00'), + .burnWithData(deployerSignerA.address, 0, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(deployerSignerA.address, ZERO_ADDRESS, 720); + .withArgs(deployerSignerA.address, ZERO_ADDRESS, 0); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(1); - // Signer A burns token 721 + // Signer A burns token await expect( deployedERC721WithData .connect(deployerSignerA) - .burnWithData(deployerSignerA.address, 721, '0x00'), + .burnWithData(deployerSignerA.address, 1, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(deployerSignerA.address, ZERO_ADDRESS, 721); + .withArgs(deployerSignerA.address, ZERO_ADDRESS, 1); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); }); @@ -233,33 +227,31 @@ describe('ERC721WithData - Unit Tests', function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerC.address)).to.equal(0); - // Signer A mints token 720 to itself + // Signer A mints token to itself await expect( - deployedERC721WithData - .connect(deployerSignerA) - .mintWithData(deployerSignerA.address, 720, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(deployerSignerA.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); - // Signer A mints token 721 to Signer B + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); + // Signer A mints token to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer A mints token 722 to Signer C + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer A mints token to Signer C await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, 722, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 722); - // Signer B attempts to burn token 720 from Signer A wallet (not allowed) + .withArgs(ZERO_ADDRESS, signerC.address, 2); + // Signer B attempts to burn token from Signer A wallet (not allowed) await expect( deployedERC721WithData.connect(signerB).burnWithData(deployerSignerA.address, 720, '0x00'), ).to.be.revertedWith('ERC721WithData: caller is not owner'); - // Signer C attempts to burn token 721 from Signer B wallet (not allowed) + // Signer C attempts to burn token from Signer B wallet (not allowed) await expect( - deployedERC721WithData.connect(signerC).burnWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(signerC).burnWithData(signerB.address, 1, '0x00'), ).to.be.revertedWith('ERC721WithData: caller is not owner'); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(1); @@ -271,30 +263,28 @@ describe('ERC721WithData - Unit Tests', function () { expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(0); expect(await deployedERC721WithData.balanceOf(signerC.address)).to.equal(0); - // Signer A mints token 720 to itself + // Signer A mints token to itself await expect( - deployedERC721WithData - .connect(deployerSignerA) - .mintWithData(deployerSignerA.address, 720, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(deployerSignerA.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, deployerSignerA.address, 720); - // Signer A mints token 721 to Signer B + .withArgs(ZERO_ADDRESS, deployerSignerA.address, 0); + // Signer A mints token to Signer B await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, 721, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerB.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerB.address, 721); - // Signer A mints token 722 to Signer C + .withArgs(ZERO_ADDRESS, signerB.address, 1); + // Signer A mints token to Signer C await expect( - deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, 722, '0x00'), + deployedERC721WithData.connect(deployerSignerA).mintWithData(signerC.address, '0x00'), ) .to.emit(deployedERC721WithData, 'Transfer') - .withArgs(ZERO_ADDRESS, signerC.address, 722); + .withArgs(ZERO_ADDRESS, signerC.address, 2); - expect(await deployedERC721WithData.tokenURI(720)).to.equal('firefly://token/720'); - expect(await deployedERC721WithData.tokenURI(721)).to.equal('firefly://token/721'); - expect(await deployedERC721WithData.tokenURI(722)).to.equal('firefly://token/722'); + expect(await deployedERC721WithData.tokenURI(0)).to.equal('firefly://token/0'); + expect(await deployedERC721WithData.tokenURI(1)).to.equal('firefly://token/1'); + expect(await deployedERC721WithData.tokenURI(2)).to.equal('firefly://token/2'); expect(await deployedERC721WithData.balanceOf(deployerSignerA.address)).to.equal(1); expect(await deployedERC721WithData.balanceOf(signerB.address)).to.equal(1); diff --git a/src/abi/ERC20NoDataOld.json b/src/abi/ERC20NoDataLegacy.json similarity index 100% rename from src/abi/ERC20NoDataOld.json rename to src/abi/ERC20NoDataLegacy.json diff --git a/src/abi/ERC721NoData.json b/src/abi/ERC721NoData.json index 581ce8a..23eab40 100644 --- a/src/abi/ERC721NoData.json +++ b/src/abi/ERC721NoData.json @@ -264,11 +264,6 @@ "internalType": "address", "name": "to", "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" } ], "name": "safeMint", @@ -433,8 +428,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b5060405162001ab838038062001ab8833981016040819052620000349162000220565b8181620000413362000077565b815162000056906001906020850190620000c7565b5080516200006c906002906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6117ce80620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c8063715018a6116100b2578063a22cb46511610081578063c87b56dd11610066578063c87b56dd1461027f578063e985e9c514610292578063f2fde38b146102ce57600080fd5b8063a22cb46514610259578063b88d4fde1461026c57600080fd5b8063715018a6146102255780638da5cb5b1461022d57806395d89b411461023e578063a14481941461024657600080fd5b806323b872dd1161010957806342966c68116100ee57806342966c68146101de5780636352211e146101f157806370a082311461020457600080fd5b806323b872dd146101b857806342842e0e146101cb57600080fd5b806301ffc9a71461013b57806306fdde0314610163578063081812fc14610178578063095ea7b3146101a3575b600080fd5b61014e61014936600461156d565b6102e1565b60405190151581526020015b60405180910390f35b61016b61037e565b60405161015a9190611654565b61018b6101863660046115a5565b610410565b6040516001600160a01b03909116815260200161015a565b6101b66101b1366004611544565b610437565b005b6101b66101c63660046113fa565b61056e565b6101b66101d93660046113fa565b6105e7565b6101b66101ec3660046115a5565b610602565b61018b6101ff3660046115a5565b61067a565b6102176102123660046113ae565b6106df565b60405190815260200161015a565b6101b6610779565b6000546001600160a01b031661018b565b61016b61078d565b6101b6610254366004611544565b61079c565b6101b661026736600461150a565b6107b2565b6101b661027a366004611435565b6107bd565b61016b61028d3660046115a5565b61083c565b61014e6102a03660046113c8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101b66102dc3660046113ae565b6108d5565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061034457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461038d906116d6565b80601f01602080910402602001604051908101604052809291908181526020018280546103b9906116d6565b80156104065780601f106103db57610100808354040283529160200191610406565b820191906000526020600020905b8154815290600101906020018083116103e957829003601f168201915b5050505050905090565b600061041b82610962565b506000908152600560205260409020546001600160a01b031690565b60006104428261067a565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806104ed57506104ed81336102a0565b61055f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104c8565b61056983836109c6565b505050565b610579335b82610a34565b6105dc5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b610569838383610ab3565b610569838383604051806020016040528060008152506107bd565b61060b33610573565b61066e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61067781610c80565b50565b6000818152600360205260408120546001600160a01b0316806103785760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b60006001600160a01b03821661075d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016104c8565b506001600160a01b031660009081526004602052604090205490565b610781610d1b565b61078b6000610d75565b565b60606002805461038d906116d6565b6107a4610d1b565b6107ae8282610dc5565b5050565b6107ae338383610ddf565b6107c73383610a34565b61082a5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61083684848484610eae565b50505050565b606061084782610962565b600061088360408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b905060008151116108a357604051806020016040528060008152506108ce565b806108ad84610f2c565b6040516020016108be9291906115e9565b6040516020818303038152906040525b9392505050565b6108dd610d1b565b6001600160a01b0381166109595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c8565b61067781610d75565b6000818152600360205260409020546001600160a01b03166106775760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906109fb8261067a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610a408361067a565b9050806001600160a01b0316846001600160a01b03161480610a8757506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610aab5750836001600160a01b0316610aa084610410565b6001600160a01b0316145b949350505050565b826001600160a01b0316610ac68261067a565b6001600160a01b031614610b425760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104c8565b6001600160a01b038216610bbd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c8565b610bc86000826109c6565b6001600160a01b0383166000908152600460205260408120805460019290610bf1908490611693565b90915550506001600160a01b0382166000908152600460205260408120805460019290610c1f908490611667565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000610c8b8261067a565b9050610c986000836109c6565b6001600160a01b0381166000908152600460205260408120805460019290610cc1908490611693565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000546001600160a01b0316331461078b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ae82826040518060200160405280600081525061107a565b816001600160a01b0316836001600160a01b03161415610e415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610eb9848484610ab3565b610ec5848484846110f8565b6108365760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b606081610f6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610f965780610f8081611711565b9150610f8f9050600a8361167f565b9150610f70565b60008167ffffffffffffffff811115610fbf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610fe9576020820181803683370190505b5090505b8415610aab57610ffe600183611693565b915061100b600a8661172c565b611016906030611667565b60f81b81838151811061103957634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611073600a8661167f565b9450610fed565b6110848383611250565b61109160008484846110f8565b6105695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b60006001600160a01b0384163b1561124557604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061113c903390899088908890600401611618565b602060405180830381600087803b15801561115657600080fd5b505af1925050508015611186575060408051601f3d908101601f1916820190925261118391810190611589565b60015b61122b573d8080156111b4576040519150601f19603f3d011682016040523d82523d6000602084013e6111b9565b606091505b5080516112235760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610aab565b506001949350505050565b6001600160a01b0382166112a65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c8565b6000818152600360205260409020546001600160a01b03161561130b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c8565b6001600160a01b0382166000908152600460205260408120805460019290611334908490611667565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146113a957600080fd5b919050565b6000602082840312156113bf578081fd5b6108ce82611392565b600080604083850312156113da578081fd5b6113e383611392565b91506113f160208401611392565b90509250929050565b60008060006060848603121561140e578081fd5b61141784611392565b925061142560208501611392565b9150604084013590509250925092565b6000806000806080858703121561144a578081fd5b61145385611392565b935061146160208601611392565b925060408501359150606085013567ffffffffffffffff80821115611484578283fd5b818701915087601f830112611497578283fd5b8135818111156114a9576114a961176c565b604051601f8201601f19908116603f011681019083821181831017156114d1576114d161176c565b816040528281528a60208487010111156114e9578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561151c578182fd5b61152583611392565b915060208301358015158114611539578182fd5b809150509250929050565b60008060408385031215611556578182fd5b61155f83611392565b946020939093013593505050565b60006020828403121561157e578081fd5b81356108ce81611782565b60006020828403121561159a578081fd5b81516108ce81611782565b6000602082840312156115b6578081fd5b5035919050565b600081518084526115d58160208601602086016116aa565b601f01601f19169290920160200192915050565b600083516115fb8184602088016116aa565b83519083019061160f8183602088016116aa565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261164a60808301846115bd565b9695505050505050565b6020815260006108ce60208301846115bd565b6000821982111561167a5761167a611740565b500190565b60008261168e5761168e611756565b500490565b6000828210156116a5576116a5611740565b500390565b60005b838110156116c55781810151838201526020016116ad565b838111156108365750506000910152565b600181811c908216806116ea57607f821691505b6020821081141561170b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561172557611725611740565b5060010190565b60008261173b5761173b611756565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461067757600080fdfea26469706673582212202a1985b8be87bdcead8fc52678707c1368a79651b375c794985d7280028b512664736f6c63430008040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c8063715018a6116100b2578063a22cb46511610081578063c87b56dd11610066578063c87b56dd1461027f578063e985e9c514610292578063f2fde38b146102ce57600080fd5b8063a22cb46514610259578063b88d4fde1461026c57600080fd5b8063715018a6146102255780638da5cb5b1461022d57806395d89b411461023e578063a14481941461024657600080fd5b806323b872dd1161010957806342966c68116100ee57806342966c68146101de5780636352211e146101f157806370a082311461020457600080fd5b806323b872dd146101b857806342842e0e146101cb57600080fd5b806301ffc9a71461013b57806306fdde0314610163578063081812fc14610178578063095ea7b3146101a3575b600080fd5b61014e61014936600461156d565b6102e1565b60405190151581526020015b60405180910390f35b61016b61037e565b60405161015a9190611654565b61018b6101863660046115a5565b610410565b6040516001600160a01b03909116815260200161015a565b6101b66101b1366004611544565b610437565b005b6101b66101c63660046113fa565b61056e565b6101b66101d93660046113fa565b6105e7565b6101b66101ec3660046115a5565b610602565b61018b6101ff3660046115a5565b61067a565b6102176102123660046113ae565b6106df565b60405190815260200161015a565b6101b6610779565b6000546001600160a01b031661018b565b61016b61078d565b6101b6610254366004611544565b61079c565b6101b661026736600461150a565b6107b2565b6101b661027a366004611435565b6107bd565b61016b61028d3660046115a5565b61083c565b61014e6102a03660046113c8565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101b66102dc3660046113ae565b6108d5565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061034457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461038d906116d6565b80601f01602080910402602001604051908101604052809291908181526020018280546103b9906116d6565b80156104065780601f106103db57610100808354040283529160200191610406565b820191906000526020600020905b8154815290600101906020018083116103e957829003601f168201915b5050505050905090565b600061041b82610962565b506000908152600560205260409020546001600160a01b031690565b60006104428261067a565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806104ed57506104ed81336102a0565b61055f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104c8565b61056983836109c6565b505050565b610579335b82610a34565b6105dc5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b610569838383610ab3565b610569838383604051806020016040528060008152506107bd565b61060b33610573565b61066e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61067781610c80565b50565b6000818152600360205260408120546001600160a01b0316806103785760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b60006001600160a01b03821661075d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016104c8565b506001600160a01b031660009081526004602052604090205490565b610781610d1b565b61078b6000610d75565b565b60606002805461038d906116d6565b6107a4610d1b565b6107ae8282610dc5565b5050565b6107ae338383610ddf565b6107c73383610a34565b61082a5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61083684848484610eae565b50505050565b606061084782610962565b600061088360408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b905060008151116108a357604051806020016040528060008152506108ce565b806108ad84610f2c565b6040516020016108be9291906115e9565b6040516020818303038152906040525b9392505050565b6108dd610d1b565b6001600160a01b0381166109595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c8565b61067781610d75565b6000818152600360205260409020546001600160a01b03166106775760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906109fb8261067a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610a408361067a565b9050806001600160a01b0316846001600160a01b03161480610a8757506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610aab5750836001600160a01b0316610aa084610410565b6001600160a01b0316145b949350505050565b826001600160a01b0316610ac68261067a565b6001600160a01b031614610b425760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104c8565b6001600160a01b038216610bbd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c8565b610bc86000826109c6565b6001600160a01b0383166000908152600460205260408120805460019290610bf1908490611693565b90915550506001600160a01b0382166000908152600460205260408120805460019290610c1f908490611667565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000610c8b8261067a565b9050610c986000836109c6565b6001600160a01b0381166000908152600460205260408120805460019290610cc1908490611693565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000546001600160a01b0316331461078b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6107ae82826040518060200160405280600081525061107a565b816001600160a01b0316836001600160a01b03161415610e415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610eb9848484610ab3565b610ec5848484846110f8565b6108365760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b606081610f6c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610f965780610f8081611711565b9150610f8f9050600a8361167f565b9150610f70565b60008167ffffffffffffffff811115610fbf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610fe9576020820181803683370190505b5090505b8415610aab57610ffe600183611693565b915061100b600a8661172c565b611016906030611667565b60f81b81838151811061103957634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611073600a8661167f565b9450610fed565b6110848383611250565b61109160008484846110f8565b6105695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b60006001600160a01b0384163b1561124557604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061113c903390899088908890600401611618565b602060405180830381600087803b15801561115657600080fd5b505af1925050508015611186575060408051601f3d908101601f1916820190925261118391810190611589565b60015b61122b573d8080156111b4576040519150601f19603f3d011682016040523d82523d6000602084013e6111b9565b606091505b5080516112235760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610aab565b506001949350505050565b6001600160a01b0382166112a65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c8565b6000818152600360205260409020546001600160a01b03161561130b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c8565b6001600160a01b0382166000908152600460205260408120805460019290611334908490611667565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146113a957600080fd5b919050565b6000602082840312156113bf578081fd5b6108ce82611392565b600080604083850312156113da578081fd5b6113e383611392565b91506113f160208401611392565b90509250929050565b60008060006060848603121561140e578081fd5b61141784611392565b925061142560208501611392565b9150604084013590509250925092565b6000806000806080858703121561144a578081fd5b61145385611392565b935061146160208601611392565b925060408501359150606085013567ffffffffffffffff80821115611484578283fd5b818701915087601f830112611497578283fd5b8135818111156114a9576114a961176c565b604051601f8201601f19908116603f011681019083821181831017156114d1576114d161176c565b816040528281528a60208487010111156114e9578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561151c578182fd5b61152583611392565b915060208301358015158114611539578182fd5b809150509250929050565b60008060408385031215611556578182fd5b61155f83611392565b946020939093013593505050565b60006020828403121561157e578081fd5b81356108ce81611782565b60006020828403121561159a578081fd5b81516108ce81611782565b6000602082840312156115b6578081fd5b5035919050565b600081518084526115d58160208601602086016116aa565b601f01601f19169290920160200192915050565b600083516115fb8184602088016116aa565b83519083019061160f8183602088016116aa565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261164a60808301846115bd565b9695505050505050565b6020815260006108ce60208301846115bd565b6000821982111561167a5761167a611740565b500190565b60008261168e5761168e611756565b500490565b6000828210156116a5576116a5611740565b500390565b60005b838110156116c55781810151838201526020016116ad565b838111156108365750506000910152565b600181811c908216806116ea57607f821691505b6020821081141561170b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561172557611725611740565b5060010190565b60008261173b5761173b611756565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461067757600080fdfea26469706673582212202a1985b8be87bdcead8fc52678707c1368a79651b375c794985d7280028b512664736f6c63430008040033", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162001ad338038062001ad3833981016040819052620000349162000220565b8181620000413362000077565b815162000056906001906020850190620000c7565b5080516200006c906002906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6117e980620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b2578063a22cb46511610081578063c87b56dd11610066578063c87b56dd1461027f578063e985e9c514610292578063f2fde38b146102ce57600080fd5b8063a22cb46514610259578063b88d4fde1461026c57600080fd5b806370a0823114610217578063715018a6146102385780638da5cb5b1461024057806395d89b411461025157600080fd5b806323b872dd1161010957806342842e0e116100ee57806342842e0e146101de57806342966c68146101f15780636352211e1461020457600080fd5b806323b872dd146101b857806340d097c3146101cb57600080fd5b806301ffc9a71461013b57806306fdde0314610163578063081812fc14610178578063095ea7b3146101a3575b600080fd5b61014e610149366004611588565b6102e1565b60405190151581526020015b60405180910390f35b61016b61037e565b60405161015a919061166f565b61018b6101863660046115c0565b610410565b6040516001600160a01b03909116815260200161015a565b6101b66101b136600461155f565b610437565b005b6101b66101c6366004611415565b61056e565b6101b66101d93660046113c9565b6105e7565b6101b66101ec366004611415565b610618565b6101b66101ff3660046115c0565b610633565b61018b6102123660046115c0565b6106ab565b61022a6102253660046113c9565b610710565b60405190815260200161015a565b6101b66107aa565b6000546001600160a01b031661018b565b61016b6107be565b6101b6610267366004611525565b6107cd565b6101b661027a366004611450565b6107d8565b61016b61028d3660046115c0565b610857565b61014e6102a03660046113e3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101b66102dc3660046113c9565b6108f0565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061034457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461038d906116f1565b80601f01602080910402602001604051908101604052809291908181526020018280546103b9906116f1565b80156104065780601f106103db57610100808354040283529160200191610406565b820191906000526020600020905b8154815290600101906020018083116103e957829003601f168201915b5050505050905090565b600061041b8261097d565b506000908152600560205260409020546001600160a01b031690565b6000610442826106ab565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806104ed57506104ed81336102a0565b61055f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104c8565b61056983836109e1565b505050565b610579335b82610a4f565b6105dc5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b610569838383610ace565b6105ef610c9b565b60006105fa60075490565b905061060a600780546001019055565b6106148282610cf5565b5050565b610569838383604051806020016040528060008152506107d8565b61063c33610573565b61069f5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b6106a881610d0f565b50565b6000818152600360205260408120546001600160a01b0316806103785760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b60006001600160a01b03821661078e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016104c8565b506001600160a01b031660009081526004602052604090205490565b6107b2610c9b565b6107bc6000610daa565b565b60606002805461038d906116f1565b610614338383610dfa565b6107e23383610a4f565b6108455760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61085184848484610ec9565b50505050565b60606108628261097d565b600061089e60408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b905060008151116108be57604051806020016040528060008152506108e9565b806108c884610f47565b6040516020016108d9929190611604565b6040516020818303038152906040525b9392505050565b6108f8610c9b565b6001600160a01b0381166109745760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c8565b6106a881610daa565b6000818152600360205260409020546001600160a01b03166106a85760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610a16826106ab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610a5b836106ab565b9050806001600160a01b0316846001600160a01b03161480610aa257506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610ac65750836001600160a01b0316610abb84610410565b6001600160a01b0316145b949350505050565b826001600160a01b0316610ae1826106ab565b6001600160a01b031614610b5d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104c8565b6001600160a01b038216610bd85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c8565b610be36000826109e1565b6001600160a01b0383166000908152600460205260408120805460019290610c0c9084906116ae565b90915550506001600160a01b0382166000908152600460205260408120805460019290610c3a908490611682565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146107bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c8565b610614828260405180602001604052806000815250611095565b6000610d1a826106ab565b9050610d276000836109e1565b6001600160a01b0381166000908152600460205260408120805460019290610d509084906116ae565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415610e5c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610ed4848484610ace565b610ee084848484611113565b6108515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b606081610f8757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610fb15780610f9b8161172c565b9150610faa9050600a8361169a565b9150610f8b565b60008167ffffffffffffffff811115610fda57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611004576020820181803683370190505b5090505b8415610ac6576110196001836116ae565b9150611026600a86611747565b611031906030611682565b60f81b81838151811061105457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061108e600a8661169a565b9450611008565b61109f838361126b565b6110ac6000848484611113565b6105695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b60006001600160a01b0384163b1561126057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611157903390899088908890600401611633565b602060405180830381600087803b15801561117157600080fd5b505af19250505080156111a1575060408051601f3d908101601f1916820190925261119e918101906115a4565b60015b611246573d8080156111cf576040519150601f19603f3d011682016040523d82523d6000602084013e6111d4565b606091505b50805161123e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ac6565b506001949350505050565b6001600160a01b0382166112c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c8565b6000818152600360205260409020546001600160a01b0316156113265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c8565b6001600160a01b038216600090815260046020526040812080546001929061134f908490611682565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146113c457600080fd5b919050565b6000602082840312156113da578081fd5b6108e9826113ad565b600080604083850312156113f5578081fd5b6113fe836113ad565b915061140c602084016113ad565b90509250929050565b600080600060608486031215611429578081fd5b611432846113ad565b9250611440602085016113ad565b9150604084013590509250925092565b60008060008060808587031215611465578081fd5b61146e856113ad565b935061147c602086016113ad565b925060408501359150606085013567ffffffffffffffff8082111561149f578283fd5b818701915087601f8301126114b2578283fd5b8135818111156114c4576114c4611787565b604051601f8201601f19908116603f011681019083821181831017156114ec576114ec611787565b816040528281528a6020848701011115611504578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215611537578182fd5b611540836113ad565b915060208301358015158114611554578182fd5b809150509250929050565b60008060408385031215611571578182fd5b61157a836113ad565b946020939093013593505050565b600060208284031215611599578081fd5b81356108e98161179d565b6000602082840312156115b5578081fd5b81516108e98161179d565b6000602082840312156115d1578081fd5b5035919050565b600081518084526115f08160208601602086016116c5565b601f01601f19169290920160200192915050565b600083516116168184602088016116c5565b83519083019061162a8183602088016116c5565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261166560808301846115d8565b9695505050505050565b6020815260006108e960208301846115d8565b600082198211156116955761169561175b565b500190565b6000826116a9576116a9611771565b500490565b6000828210156116c0576116c061175b565b500390565b60005b838110156116e05781810151838201526020016116c8565b838111156108515750506000910152565b600181811c9082168061170557607f821691505b6020821081141561172657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156117405761174061175b565b5060010190565b60008261175657611756611771565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106a857600080fdfea264697066735822122019e733086ff3d6bf967e71f02edcef33f8bb73fe84aa3a4454b8e1f69acffef564736f6c63430008040033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b2578063a22cb46511610081578063c87b56dd11610066578063c87b56dd1461027f578063e985e9c514610292578063f2fde38b146102ce57600080fd5b8063a22cb46514610259578063b88d4fde1461026c57600080fd5b806370a0823114610217578063715018a6146102385780638da5cb5b1461024057806395d89b411461025157600080fd5b806323b872dd1161010957806342842e0e116100ee57806342842e0e146101de57806342966c68146101f15780636352211e1461020457600080fd5b806323b872dd146101b857806340d097c3146101cb57600080fd5b806301ffc9a71461013b57806306fdde0314610163578063081812fc14610178578063095ea7b3146101a3575b600080fd5b61014e610149366004611588565b6102e1565b60405190151581526020015b60405180910390f35b61016b61037e565b60405161015a919061166f565b61018b6101863660046115c0565b610410565b6040516001600160a01b03909116815260200161015a565b6101b66101b136600461155f565b610437565b005b6101b66101c6366004611415565b61056e565b6101b66101d93660046113c9565b6105e7565b6101b66101ec366004611415565b610618565b6101b66101ff3660046115c0565b610633565b61018b6102123660046115c0565b6106ab565b61022a6102253660046113c9565b610710565b60405190815260200161015a565b6101b66107aa565b6000546001600160a01b031661018b565b61016b6107be565b6101b6610267366004611525565b6107cd565b6101b661027a366004611450565b6107d8565b61016b61028d3660046115c0565b610857565b61014e6102a03660046113e3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6101b66102dc3660046113c9565b6108f0565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061034457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461038d906116f1565b80601f01602080910402602001604051908101604052809291908181526020018280546103b9906116f1565b80156104065780601f106103db57610100808354040283529160200191610406565b820191906000526020600020905b8154815290600101906020018083116103e957829003601f168201915b5050505050905090565b600061041b8261097d565b506000908152600560205260409020546001600160a01b031690565b6000610442826106ab565b9050806001600160a01b0316836001600160a01b031614156104d15760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806104ed57506104ed81336102a0565b61055f5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104c8565b61056983836109e1565b505050565b610579335b82610a4f565b6105dc5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b610569838383610ace565b6105ef610c9b565b60006105fa60075490565b905061060a600780546001019055565b6106148282610cf5565b5050565b610569838383604051806020016040528060008152506107d8565b61063c33610573565b61069f5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b6106a881610d0f565b50565b6000818152600360205260408120546001600160a01b0316806103785760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b60006001600160a01b03821661078e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e6572000000000000000000000000000000000000000000000060648201526084016104c8565b506001600160a01b031660009081526004602052604090205490565b6107b2610c9b565b6107bc6000610daa565b565b60606002805461038d906116f1565b610614338383610dfa565b6107e23383610a4f565b6108455760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016104c8565b61085184848484610ec9565b50505050565b60606108628261097d565b600061089e60408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b905060008151116108be57604051806020016040528060008152506108e9565b806108c884610f47565b6040516020016108d9929190611604565b6040516020818303038152906040525b9392505050565b6108f8610c9b565b6001600160a01b0381166109745760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c8565b6106a881610daa565b6000818152600360205260409020546001600160a01b03166106a85760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e204944000000000000000060448201526064016104c8565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610a16826106ab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610a5b836106ab565b9050806001600160a01b0316846001600160a01b03161480610aa257506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610ac65750836001600160a01b0316610abb84610410565b6001600160a01b0316145b949350505050565b826001600160a01b0316610ae1826106ab565b6001600160a01b031614610b5d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104c8565b6001600160a01b038216610bd85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104c8565b610be36000826109e1565b6001600160a01b0383166000908152600460205260408120805460019290610c0c9084906116ae565b90915550506001600160a01b0382166000908152600460205260408120805460019290610c3a908490611682565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146107bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c8565b610614828260405180602001604052806000815250611095565b6000610d1a826106ab565b9050610d276000836109e1565b6001600160a01b0381166000908152600460205260408120805460019290610d509084906116ae565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415610e5c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104c8565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610ed4848484610ace565b610ee084848484611113565b6108515760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b606081610f8757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610fb15780610f9b8161172c565b9150610faa9050600a8361169a565b9150610f8b565b60008167ffffffffffffffff811115610fda57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611004576020820181803683370190505b5090505b8415610ac6576110196001836116ae565b9150611026600a86611747565b611031906030611682565b60f81b81838151811061105457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061108e600a8661169a565b9450611008565b61109f838361126b565b6110ac6000848484611113565b6105695760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b60006001600160a01b0384163b1561126057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611157903390899088908890600401611633565b602060405180830381600087803b15801561117157600080fd5b505af19250505080156111a1575060408051601f3d908101601f1916820190925261119e918101906115a4565b60015b611246573d8080156111cf576040519150601f19603f3d011682016040523d82523d6000602084013e6111d4565b606091505b50805161123e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016104c8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ac6565b506001949350505050565b6001600160a01b0382166112c15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104c8565b6000818152600360205260409020546001600160a01b0316156113265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104c8565b6001600160a01b038216600090815260046020526040812080546001929061134f908490611682565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b03811681146113c457600080fd5b919050565b6000602082840312156113da578081fd5b6108e9826113ad565b600080604083850312156113f5578081fd5b6113fe836113ad565b915061140c602084016113ad565b90509250929050565b600080600060608486031215611429578081fd5b611432846113ad565b9250611440602085016113ad565b9150604084013590509250925092565b60008060008060808587031215611465578081fd5b61146e856113ad565b935061147c602086016113ad565b925060408501359150606085013567ffffffffffffffff8082111561149f578283fd5b818701915087601f8301126114b2578283fd5b8135818111156114c4576114c4611787565b604051601f8201601f19908116603f011681019083821181831017156114ec576114ec611787565b816040528281528a6020848701011115611504578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215611537578182fd5b611540836113ad565b915060208301358015158114611554578182fd5b809150509250929050565b60008060408385031215611571578182fd5b61157a836113ad565b946020939093013593505050565b600060208284031215611599578081fd5b81356108e98161179d565b6000602082840312156115b5578081fd5b81516108e98161179d565b6000602082840312156115d1578081fd5b5035919050565b600081518084526115f08160208601602086016116c5565b601f01601f19169290920160200192915050565b600083516116168184602088016116c5565b83519083019061162a8183602088016116c5565b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261166560808301846115d8565b9695505050505050565b6020815260006108e960208301846115d8565b600082198211156116955761169561175b565b500190565b6000826116a9576116a9611771565b500490565b6000828210156116c0576116c061175b565b500390565b60005b838110156116e05781810151838201526020016116c8565b838111156108515750506000910152565b600181811c9082168061170557607f821691505b6020821081141561172657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156117405761174061175b565b5060010190565b60008261175657611756611771565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106a857600080fdfea264697066735822122019e733086ff3d6bf967e71f02edcef33f8bb73fe84aa3a4454b8e1f69acffef564736f6c63430008040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/abi/ERC721NoDataOld.json b/src/abi/ERC721NoDataLegacy.json similarity index 100% rename from src/abi/ERC721NoDataOld.json rename to src/abi/ERC721NoDataLegacy.json diff --git a/src/abi/ERC721WithDataOld.json b/src/abi/ERC721WithDataV1a.json similarity index 100% rename from src/abi/ERC721WithDataOld.json rename to src/abi/ERC721WithDataV1a.json diff --git a/src/abi/ERC721WithData.json b/src/abi/ERC721WithDataV1b.json similarity index 100% rename from src/abi/ERC721WithData.json rename to src/abi/ERC721WithDataV1b.json diff --git a/src/abi/ERC721WithDataV2.json b/src/abi/ERC721WithDataV2.json new file mode 100644 index 0000000..c8bf61b --- /dev/null +++ b/src/abi/ERC721WithDataV2.json @@ -0,0 +1,565 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC721WithData", + "sourceName": "contracts/ERC721WithData.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "string", + "name": "baseTokenURI", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "approveWithData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseTokenUri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "burnWithData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mintWithData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "string", + "name": "tokenURI_", + "type": "string" + } + ], + "name": "mintWithURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "setApprovalForAllWithData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "transferWithData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b50604051620022c3380380620022c3833981016040819052620000349162000237565b828262000041336200008e565b815162000056906001906020850190620000de565b5080516200006c906002906020840190620000de565b505081516200008491506008906020840190620000de565b5050505062000317565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000ec90620002c4565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b262000301565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000301565b81604052838152602092508683858801011115620001f9578485fd5b8491505b838210156200021c5785820183015181830184015290820190620001fd565b838211156200022d57848385830101525b9695505050505050565b6000806000606084860312156200024c578283fd5b83516001600160401b038082111562000263578485fd5b620002718783880162000184565b9450602086015191508082111562000287578384fd5b620002958783880162000184565b93506040860151915080821115620002ab578283fd5b50620002ba8682870162000184565b9150509250925092565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f9c80620003276000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063b88d4fde1161008c578063d4f1804611610066578063d4f180461461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063b88d4fde146102f1578063c0ea7a7a14610304578063c87b56dd1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d6578063a22cb465146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806324e18a0b1461023557806342842e0e1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611d3b565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611e22565b6101e26101dd366004611d73565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611cd2565b610489565b005b61020d61021d366004611bb3565b6105c0565b61020d610230366004611a69565b6105d0565b61020d610243366004611c63565b610657565b61020d610256366004611a69565b610714565b6101e2610269366004611d73565b61072f565b61028161027c366004611a16565b610794565b6040519081526020016101b1565b61020d61082e565b6101c2610842565b61020d6102ad366004611cfb565b610851565b61020d6102c0366004611cfb565b61085b565b6000546001600160a01b03166101e2565b6101c26108e2565b61020d6102ec366004611b8a565b6108f1565b61020d6102ff366004611b11565b610900565b61020d610312366004611aa4565b610988565b6101c2610325366004611d73565b6109d1565b61020d610338366004611c12565b610ae3565b6101a561034b366004611a37565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d610387366004611a16565b610b5c565b60006001600160e01b031982167faefe69bf0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bec565b92915050565b6060600180546103df90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611ea4565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c87565b506000908152600560205260409020546001600160a01b031690565b60006104948261072f565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610ceb565b505050565b6105ca84846108f1565b50505050565b6105da3382610d59565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610dd8565b61065f610fa5565b600061066a60075490565b905061067a600780546001019055565b6106bb858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b81518290610702576106fd826106cf61107d565b6106d8856111e6565b6040516020016106e9929190611db7565b604051602081830303815290604052611334565b61070c565b61070c8284611334565b505050505050565b6105bb83838360405180602001604052806000815250610900565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b610836610fa5565b61084060006113cb565b565b606061084c61107d565b905090565b6105ca8484610489565b6001600160a01b03841633146108d95760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca8361141b565b6060600280546103df90611ea4565b6108fc3383836114b6565b5050565b61090a3383610d59565b61097c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca84848484611585565b6109ca85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061090092505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a445760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526009602052604081208054610a5d90611ea4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990611ea4565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b5093979650505050505050565b610aeb610fa5565b6000610af660075490565b9050610b06600780546001019055565b610b47848285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b6105ca81610b5361107d565b6106d8846111e6565b610b64610fa5565b6001600160a01b038116610be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610be9816113cb565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c4f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610be95760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d208261072f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d658361072f565b9050806001600160a01b0316846001600160a01b03161480610dac57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dd05750836001600160a01b0316610dc584610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610deb8261072f565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610ee25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eed600082610ceb565b6001600160a01b0383166000908152600460205260408120805460019290610f16908490611e61565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f44908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6110098383611603565b6110166000848484611745565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006008805461108e90611ea4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90611ea4565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905080516000141561115157505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6008805461115e90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90611ea4565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b505050505091505090565b5090565b60608161122657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611250578061123a81611edf565b91506112499050600a83611e4d565b915061122a565b60008167ffffffffffffffff81111561127957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112a3576020820181803683370190505b5090505b8415610dd0576112b8600183611e61565b91506112c5600a86611efa565b6112d0906030611e35565b60f81b8183815181106112f357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061132d600a86611e4d565b94506112a7565b61133c610fa5565b6000828152600360205260409020546001600160a01b03166113ac5760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260096020908152604090912082516105bb9284019061189d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006114268261072f565b9050611433600083610ceb565b6001600160a01b038116600090815260046020526040812080546001929061145c908490611e61565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156115185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611590848484610dd8565b61159c84848484611745565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116e7908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561189257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611789903390899088908890600401611de6565b602060405180830381600087803b1580156117a357600080fd5b505af19250505080156117d3575060408051601f3d908101601f191682019092526117d091810190611d57565b60015b611878573d808015611801576040519150601f19603f3d011682016040523d82523d6000602084013e611806565b606091505b5080516118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dd0565b506001949350505050565b8280546118a990611ea4565b90600052602060002090601f0160209004810192826118cb5760008555611911565b82601f106118e457805160ff1916838001178555611911565b82800160010185558215611911579182015b828111156119115782518255916020019190600101906118f6565b506111e29291505b808211156111e25760008155600101611919565b600067ffffffffffffffff8084111561194857611948611f3a565b604051601f8501601f19908116603f0116810190828211818310171561197057611970611f3a565b8160405280935085815286868601111561198957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146119ba57600080fd5b919050565b803580151581146119ba57600080fd5b60008083601f8401126119e0578182fd5b50813567ffffffffffffffff8111156119f7578182fd5b602083019150836020828501011115611a0f57600080fd5b9250929050565b600060208284031215611a27578081fd5b611a30826119a3565b9392505050565b60008060408385031215611a49578081fd5b611a52836119a3565b9150611a60602084016119a3565b90509250929050565b600080600060608486031215611a7d578081fd5b611a86846119a3565b9250611a94602085016119a3565b9150604084013590509250925092565b600080600080600060808688031215611abb578081fd5b611ac4866119a3565b9450611ad2602087016119a3565b935060408601359250606086013567ffffffffffffffff811115611af4578182fd5b611b00888289016119cf565b969995985093965092949392505050565b60008060008060808587031215611b26578384fd5b611b2f856119a3565b9350611b3d602086016119a3565b925060408501359150606085013567ffffffffffffffff811115611b5f578182fd5b8501601f81018713611b6f578182fd5b611b7e8782356020840161192d565b91505092959194509250565b60008060408385031215611b9c578182fd5b611ba5836119a3565b9150611a60602084016119bf565b60008060008060608587031215611bc8578384fd5b611bd1856119a3565b9350611bdf602086016119bf565b9250604085013567ffffffffffffffff811115611bfa578283fd5b611c06878288016119cf565b95989497509550505050565b600080600060408486031215611c26578283fd5b611c2f846119a3565b9250602084013567ffffffffffffffff811115611c4a578283fd5b611c56868287016119cf565b9497909650939450505050565b60008060008060608587031215611c78578384fd5b611c81856119a3565b9350602085013567ffffffffffffffff80821115611c9d578485fd5b611ca9888389016119cf565b90955093506040870135915080821115611cc1578283fd5b508501601f81018713611b6f578182fd5b60008060408385031215611ce4578182fd5b611ced836119a3565b946020939093013593505050565b60008060008060608587031215611d10578182fd5b611d19856119a3565b935060208501359250604085013567ffffffffffffffff811115611bfa578283fd5b600060208284031215611d4c578081fd5b8135611a3081611f50565b600060208284031215611d68578081fd5b8151611a3081611f50565b600060208284031215611d84578081fd5b5035919050565b60008151808452611da3816020860160208601611e78565b601f01601f19169290920160200192915050565b60008351611dc9818460208801611e78565b835190830190611ddd818360208801611e78565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e186080830184611d8b565b9695505050505050565b602081526000611a306020830184611d8b565b60008219821115611e4857611e48611f0e565b500190565b600082611e5c57611e5c611f24565b500490565b600082821015611e7357611e73611f0e565b500390565b60005b83811015611e93578181015183820152602001611e7b565b838111156105ca5750506000910152565b600181811c90821680611eb857607f821691505b60208210811415611ed957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ef357611ef3611f0e565b5060010190565b600082611f0957611f09611f24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be957600080fdfea26469706673582212203d6e700f8a0b10796db56246303859e2d579a99be49f8d1d81068a8040f00c0e64736f6c63430008040033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063b88d4fde1161008c578063d4f1804611610066578063d4f180461461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063b88d4fde146102f1578063c0ea7a7a14610304578063c87b56dd1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d6578063a22cb465146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806324e18a0b1461023557806342842e0e1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611d3b565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611e22565b6101e26101dd366004611d73565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611cd2565b610489565b005b61020d61021d366004611bb3565b6105c0565b61020d610230366004611a69565b6105d0565b61020d610243366004611c63565b610657565b61020d610256366004611a69565b610714565b6101e2610269366004611d73565b61072f565b61028161027c366004611a16565b610794565b6040519081526020016101b1565b61020d61082e565b6101c2610842565b61020d6102ad366004611cfb565b610851565b61020d6102c0366004611cfb565b61085b565b6000546001600160a01b03166101e2565b6101c26108e2565b61020d6102ec366004611b8a565b6108f1565b61020d6102ff366004611b11565b610900565b61020d610312366004611aa4565b610988565b6101c2610325366004611d73565b6109d1565b61020d610338366004611c12565b610ae3565b6101a561034b366004611a37565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d610387366004611a16565b610b5c565b60006001600160e01b031982167faefe69bf0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bec565b92915050565b6060600180546103df90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611ea4565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c87565b506000908152600560205260409020546001600160a01b031690565b60006104948261072f565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610ceb565b505050565b6105ca84846108f1565b50505050565b6105da3382610d59565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610dd8565b61065f610fa5565b600061066a60075490565b905061067a600780546001019055565b6106bb858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b81518290610702576106fd826106cf61107d565b6106d8856111e6565b6040516020016106e9929190611db7565b604051602081830303815290604052611334565b61070c565b61070c8284611334565b505050505050565b6105bb83838360405180602001604052806000815250610900565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b610836610fa5565b61084060006113cb565b565b606061084c61107d565b905090565b6105ca8484610489565b6001600160a01b03841633146108d95760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca8361141b565b6060600280546103df90611ea4565b6108fc3383836114b6565b5050565b61090a3383610d59565b61097c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca84848484611585565b6109ca85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061090092505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a445760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526009602052604081208054610a5d90611ea4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990611ea4565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b5093979650505050505050565b610aeb610fa5565b6000610af660075490565b9050610b06600780546001019055565b610b47848285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b6105ca81610b5361107d565b6106d8846111e6565b610b64610fa5565b6001600160a01b038116610be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610be9816113cb565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c4f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610be95760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d208261072f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d658361072f565b9050806001600160a01b0316846001600160a01b03161480610dac57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dd05750836001600160a01b0316610dc584610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610deb8261072f565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610ee25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eed600082610ceb565b6001600160a01b0383166000908152600460205260408120805460019290610f16908490611e61565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f44908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6110098383611603565b6110166000848484611745565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006008805461108e90611ea4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90611ea4565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905080516000141561115157505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6008805461115e90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90611ea4565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b505050505091505090565b5090565b60608161122657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611250578061123a81611edf565b91506112499050600a83611e4d565b915061122a565b60008167ffffffffffffffff81111561127957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112a3576020820181803683370190505b5090505b8415610dd0576112b8600183611e61565b91506112c5600a86611efa565b6112d0906030611e35565b60f81b8183815181106112f357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061132d600a86611e4d565b94506112a7565b61133c610fa5565b6000828152600360205260409020546001600160a01b03166113ac5760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260096020908152604090912082516105bb9284019061189d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006114268261072f565b9050611433600083610ceb565b6001600160a01b038116600090815260046020526040812080546001929061145c908490611e61565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156115185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611590848484610dd8565b61159c84848484611745565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116e7908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561189257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611789903390899088908890600401611de6565b602060405180830381600087803b1580156117a357600080fd5b505af19250505080156117d3575060408051601f3d908101601f191682019092526117d091810190611d57565b60015b611878573d808015611801576040519150601f19603f3d011682016040523d82523d6000602084013e611806565b606091505b5080516118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dd0565b506001949350505050565b8280546118a990611ea4565b90600052602060002090601f0160209004810192826118cb5760008555611911565b82601f106118e457805160ff1916838001178555611911565b82800160010185558215611911579182015b828111156119115782518255916020019190600101906118f6565b506111e29291505b808211156111e25760008155600101611919565b600067ffffffffffffffff8084111561194857611948611f3a565b604051601f8501601f19908116603f0116810190828211818310171561197057611970611f3a565b8160405280935085815286868601111561198957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146119ba57600080fd5b919050565b803580151581146119ba57600080fd5b60008083601f8401126119e0578182fd5b50813567ffffffffffffffff8111156119f7578182fd5b602083019150836020828501011115611a0f57600080fd5b9250929050565b600060208284031215611a27578081fd5b611a30826119a3565b9392505050565b60008060408385031215611a49578081fd5b611a52836119a3565b9150611a60602084016119a3565b90509250929050565b600080600060608486031215611a7d578081fd5b611a86846119a3565b9250611a94602085016119a3565b9150604084013590509250925092565b600080600080600060808688031215611abb578081fd5b611ac4866119a3565b9450611ad2602087016119a3565b935060408601359250606086013567ffffffffffffffff811115611af4578182fd5b611b00888289016119cf565b969995985093965092949392505050565b60008060008060808587031215611b26578384fd5b611b2f856119a3565b9350611b3d602086016119a3565b925060408501359150606085013567ffffffffffffffff811115611b5f578182fd5b8501601f81018713611b6f578182fd5b611b7e8782356020840161192d565b91505092959194509250565b60008060408385031215611b9c578182fd5b611ba5836119a3565b9150611a60602084016119bf565b60008060008060608587031215611bc8578384fd5b611bd1856119a3565b9350611bdf602086016119bf565b9250604085013567ffffffffffffffff811115611bfa578283fd5b611c06878288016119cf565b95989497509550505050565b600080600060408486031215611c26578283fd5b611c2f846119a3565b9250602084013567ffffffffffffffff811115611c4a578283fd5b611c56868287016119cf565b9497909650939450505050565b60008060008060608587031215611c78578384fd5b611c81856119a3565b9350602085013567ffffffffffffffff80821115611c9d578485fd5b611ca9888389016119cf565b90955093506040870135915080821115611cc1578283fd5b508501601f81018713611b6f578182fd5b60008060408385031215611ce4578182fd5b611ced836119a3565b946020939093013593505050565b60008060008060608587031215611d10578182fd5b611d19856119a3565b935060208501359250604085013567ffffffffffffffff811115611bfa578283fd5b600060208284031215611d4c578081fd5b8135611a3081611f50565b600060208284031215611d68578081fd5b8151611a3081611f50565b600060208284031215611d84578081fd5b5035919050565b60008151808452611da3816020860160208601611e78565b601f01601f19169290920160200192915050565b60008351611dc9818460208801611e78565b835190830190611ddd818360208801611e78565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e186080830184611d8b565b9695505050505050565b602081526000611a306020830184611d8b565b60008219821115611e4857611e48611f0e565b500190565b600082611e5c57611e5c611f24565b500490565b600082821015611e7357611e73611f0e565b500390565b60005b83811015611e93578181015183820152602001611e7b565b838111156105ca5750506000910152565b600181811c90821680611eb857607f821691505b60208210811415611ed957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ef357611ef3611f0e565b5060010190565b600082611f0957611f09611f24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be957600080fdfea26469706673582212203d6e700f8a0b10796db56246303859e2d579a99be49f8d1d81068a8040f00c0e64736f6c63430008040033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/src/abi/IERC721WithData.json b/src/abi/IERC721WithData.json index 49b6ed2..3af8aec 100644 --- a/src/abi/IERC721WithData.json +++ b/src/abi/IERC721WithData.json @@ -69,11 +69,6 @@ "name": "to", "type": "address" }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, { "internalType": "bytes", "name": "data", @@ -92,11 +87,6 @@ "name": "to", "type": "address" }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, { "internalType": "bytes", "name": "data", diff --git a/src/abi/InterfaceCheck.json b/src/abi/InterfaceCheck.json index daf773b..754eadd 100644 --- a/src/abi/InterfaceCheck.json +++ b/src/abi/InterfaceCheck.json @@ -43,8 +43,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50610118806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80637a40160e1460415780638f48f171146098578063c7f1b08f1460bd575b600080fd5b7faefdad0f000000000000000000000000000000000000000000000000000000005b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390f35b7f83a74a0c000000000000000000000000000000000000000000000000000000006063565b7f8706707d00000000000000000000000000000000000000000000000000000000606356fea2646970667358221220234ed343d84ae5c0c2cf81ac08edd180f6834763217f9851f72d7289062bfda064736f6c63430008040033", - "deployedBytecode": "0x6080604052348015600f57600080fd5b5060043610603c5760003560e01c80637a40160e1460415780638f48f171146098578063c7f1b08f1460bd575b600080fd5b7faefdad0f000000000000000000000000000000000000000000000000000000005b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390f35b7f83a74a0c000000000000000000000000000000000000000000000000000000006063565b7f8706707d00000000000000000000000000000000000000000000000000000000606356fea2646970667358221220234ed343d84ae5c0c2cf81ac08edd180f6834763217f9851f72d7289062bfda064736f6c63430008040033", + "bytecode": "0x608060405234801561001057600080fd5b50610118806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80637a40160e1460415780638f48f171146098578063c7f1b08f1460bd575b600080fd5b7faefdad0f000000000000000000000000000000000000000000000000000000005b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390f35b7f83a74a0c000000000000000000000000000000000000000000000000000000006063565b7faefe69bf00000000000000000000000000000000000000000000000000000000606356fea264697066735822122043922eb5e7ed24b7a2bbcc06f5579955451888dfbbde46aa6d89fc5678bc9caa64736f6c63430008040033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b5060043610603c5760003560e01c80637a40160e1460415780638f48f171146098578063c7f1b08f1460bd575b600080fd5b7faefdad0f000000000000000000000000000000000000000000000000000000005b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200160405180910390f35b7f83a74a0c000000000000000000000000000000000000000000000000000000006063565b7faefe69bf00000000000000000000000000000000000000000000000000000000606356fea264697066735822122043922eb5e7ed24b7a2bbcc06f5579955451888dfbbde46aa6d89fc5678bc9caa64736f6c63430008040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/abi/TokenFactory.json b/src/abi/TokenFactory.json index 6dc4741..2b69078 100644 --- a/src/abi/TokenFactory.json +++ b/src/abi/TokenFactory.json @@ -93,8 +93,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50613c83806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806383a74a0c1461008c575b600080fd5b61007861004936600461037d565b6001600160e01b0319167f83a74a0c000000000000000000000000000000000000000000000000000000001490565b604051901515815260200160405180910390f35b61009f61009a3660046103ac565b6100a1565b005b831561019a57600086866040516100b790610293565b6100c29291906104bc565b604051809103906000f0801580156100de573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561013257600080fd5b505af1158015610146573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e130688886001888860405161018c9594939291906104ea565b60405180910390a25061028b565b60008686836040516101ab906102a1565b6101b79392919061054d565b604051809103906000f0801580156101d3573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e13068888600088886040516102819594939291906104ea565b60405180910390a2505b505050505050565b61142d80620005c083390190565b61226180620019ed83390190565b60008083601f8401126102c0578081fd5b50813567ffffffffffffffff8111156102d7578182fd5b6020830191508360208285010111156102ef57600080fd5b9250929050565b600082601f830112610306578081fd5b813567ffffffffffffffff8082111561032157610321610590565b604051601f8301601f19908116603f0116810190828211818310171561034957610349610590565b81604052838152866020858801011115610361578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561038e578081fd5b81356001600160e01b0319811681146103a5578182fd5b9392505050565b60008060008060008060a087890312156103c4578182fd5b863567ffffffffffffffff808211156103db578384fd5b6103e78a838b016102f6565b975060208901359150808211156103fc578384fd5b6104088a838b016102f6565b965060408901359150811515821461041e578384fd5b90945060608801359080821115610433578384fd5b61043f8a838b016102af565b90955093506080890135915080821115610457578283fd5b5061046489828a016102f6565b9150509295509295509295565b60008151808452815b818110156104965760208185018101518683018201520161047a565b818111156104a75782602083870101525b50601f01601f19169290920160200192915050565b6040815260006104cf6040830185610471565b82810360208401526104e18185610471565b95945050505050565b6080815260006104fd6080830188610471565b828103602084015261050f8188610471565b9050851515604084015282810360608401528381528385602083013781602085830101526020601f19601f8601168201019150509695505050505050565b6060815260006105606060830186610471565b82810360208401526105728186610471565b905082810360408401526105868185610471565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040523480156200001157600080fd5b506040516200142d3803806200142d833981016040819052620000349162000220565b8181620000413362000077565b815162000056906004906020850190620000c7565b5080516200006c906005906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61114380620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5eb564116100cd578063a457c2d711610081578063c0ea7a7a11610066578063c0ea7a7a146102a2578063dd62ed3e146102b5578063f2fde38b146102ee57600080fd5b8063a457c2d71461027c578063a9059cbb1461028f57600080fd5b80638da5cb5b116100b25780638da5cb5b1461024657806395d89b411461026157806396adfe421461026957600080fd5b80637b5eb5641461022057806383e49c531461023357600080fd5b806323b872dd11610124578063395093511161010957806339509351146101da57806370a08231146101ed578063715018a61461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004610ffa565b610301565b60405190151581526020015b60405180910390f35b61018661039a565b604051610175919061103a565b6101696101a1366004610f79565b61042c565b6003545b604051908152602001610175565b6101696101c6366004610ed1565b610444565b60405160128152602001610175565b6101696101e8366004610f79565b610468565b6101aa6101fb366004610e7e565b6001600160a01b031660009081526001602052604090205490565b61021e6104a7565b005b61016961022e366004610fa2565b6104bb565b61021e610241366004610fa2565b6104d0565b6000546040516001600160a01b039091168152602001610175565b610186610563565b61021e610277366004610fa2565b610572565b61016961028a366004610f79565b610584565b61016961029d366004610f79565b61062e565b61021e6102b0366004610f0c565b61063c565b6101aa6102c3366004610e9f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61021e6102fc366004610e7e565b610671565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faefdad0f00000000000000000000000000000000000000000000000000000000148061039457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600480546103a9906110bc565b80601f01602080910402602001604051908101604052809291908181526020018280546103d5906110bc565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b60003361043a818585610701565b5060019392505050565b60003361045285828561085a565b61045d8585856108e6565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490919061043a90829086906104a290879061108d565b610701565b6104af610afd565b6104b96000610b57565b565b60006104c7858561042c565b95945050505050565b6001600160a01b03841633146105535760405162461bcd60e51b815260206004820152602260248201527f455243323057697468446174613a2063616c6c6572206973206e6f74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61055d8484610bbf565b50505050565b6060600580546103a9906110bc565b61057a610afd565b61055d8484610d3c565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190838110156106215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161054a565b61045d8286868403610701565b60003361043a8185856108e6565b6001600160a01b03851633141561065d57610657848461062e565b5061066a565b610668858585610444565b505b5050505050565b610679610afd565b6001600160a01b0381166106f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161054a565b6106fe81610b57565b50565b6001600160a01b03831661077c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166107f85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260026020908152604080832093861683529290522054600019811461055d57818110156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161054a565b61055d8484848403610701565b6001600160a01b0383166109625760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03831660009081526001602052604090205481811015610a6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610aa490849061108d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af091815260200190565b60405180910390a361055d565b6000546001600160a01b031633146104b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054a565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216610c3b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03821660009081526001602052604090205481811015610cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610cf99084906110a5565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161084d565b6001600160a01b038216610d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161054a565b8060036000828254610da4919061108d565b90915550506001600160a01b03821660009081526001602052604081208054839290610dd190849061108d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610e3257600080fd5b919050565b60008083601f840112610e48578182fd5b50813567ffffffffffffffff811115610e5f578182fd5b602083019150836020828501011115610e7757600080fd5b9250929050565b600060208284031215610e8f578081fd5b610e9882610e1b565b9392505050565b60008060408385031215610eb1578081fd5b610eba83610e1b565b9150610ec860208401610e1b565b90509250929050565b600080600060608486031215610ee5578081fd5b610eee84610e1b565b9250610efc60208501610e1b565b9150604084013590509250925092565b600080600080600060808688031215610f23578081fd5b610f2c86610e1b565b9450610f3a60208701610e1b565b935060408601359250606086013567ffffffffffffffff811115610f5c578182fd5b610f6888828901610e37565b969995985093965092949392505050565b60008060408385031215610f8b578182fd5b610f9483610e1b565b946020939093013593505050565b60008060008060608587031215610fb7578384fd5b610fc085610e1b565b935060208501359250604085013567ffffffffffffffff811115610fe2578283fd5b610fee87828801610e37565b95989497509550505050565b60006020828403121561100b578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e98578182fd5b6000602080835283518082850152825b818110156110665785810183015185820160400152820161104a565b818111156110775783604083870101525b50601f01601f1916929092016040019392505050565b600082198211156110a0576110a06110f7565b500190565b6000828210156110b7576110b76110f7565b500390565b600181811c908216806110d057607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212206dfce5d713e5cea79f1985732d257a191870105f550fe71f71dc3d215d59655b64736f6c6343000804003360806040523480156200001157600080fd5b506040516200226138038062002261833981016040819052620000349162000237565b828262000041336200008e565b815162000056906001906020850190620000de565b5080516200006c906002906020840190620000de565b505081516200008491506007906020840190620000de565b5050505062000317565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000ec90620002c4565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b262000301565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000301565b81604052838152602092508683858801011115620001f9578485fd5b8491505b838210156200021c5785820183015181830184015290820190620001fd565b838211156200022d57848385830101525b9695505050505050565b6000806000606084860312156200024c578283fd5b83516001600160401b038082111562000263578485fd5b620002718783880162000184565b9450602086015191508082111562000287578384fd5b620002958783880162000184565b93506040860151915080821115620002ab578283fd5b50620002ba8682870162000184565b9150509250925092565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f3a80620003276000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063a22cb4651161008c578063c87b56dd11610066578063c87b56dd1461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063a22cb465146102f1578063b88d4fde14610304578063c0ea7a7a1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d657806396adfe42146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806342842e0e146102355780634f45edcd1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611cd9565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611dc0565b6101e26101dd366004611d11565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611bdc565b610489565b005b61020d61021d366004611b7d565b6105c0565b61020d610230366004611a33565b6105d0565b61020d610243366004611a33565b610657565b61020d610256366004611c45565b610672565b6101e2610269366004611d11565b610714565b61028161027c3660046119e0565b610779565b6040519081526020016101b1565b61020d610813565b6101c2610827565b61020d6102ad366004611c05565b610836565b61020d6102c0366004611c05565b610840565b6000546001600160a01b03166101e2565b6101c26108c7565b61020d6102ec366004611c05565b6108d6565b61020d6102ff366004611b54565b610934565b61020d610312366004611adb565b610943565b61020d610325366004611a6e565b6109cb565b6101c2610338366004611d11565b610a14565b6101a561034b366004611a01565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d6103873660046119e0565b610b26565b60006001600160e01b031982167f8706707d0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bb6565b92915050565b6060600180546103df90611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611e42565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c51565b506000908152600560205260409020546001600160a01b031690565b600061049482610714565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610cb5565b505050565b6105ca8484610934565b50505050565b6105da3382610d23565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610da2565b6105bb83838360405180602001604052806000815250610943565b61067a610f6f565b6106bb858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b80518190610702576106fd856106cf611047565b6106d8886111b0565b6040516020016106e9929190611d55565b6040516020818303038152906040526112fe565b61070c565b61070c85836112fe565b505050505050565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166107f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b61081b610f6f565b6108256000611395565b565b6060610831611047565b905090565b6105ca8484610489565b6001600160a01b03841633146108be5760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca836113e5565b6060600280546103df90611e42565b6108de610f6f565b61091f848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b6105ca8361092b611047565b6106d8866111b0565b61093f338383611480565b5050565b61094d3383610d23565b6109bf5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca8484848461154f565b610a0d85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061094392505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a875760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526008602052604081208054610aa090611e42565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90611e42565b8015610b195780601f10610aee57610100808354040283529160200191610b19565b820191906000526020600020905b815481529060010190602001808311610afc57829003601f168201915b5093979650505050505050565b610b2e610f6f565b6001600160a01b038116610baa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610bb381611395565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c1957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610bb35760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cea82610714565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d2f83610714565b9050806001600160a01b0316846001600160a01b03161480610d7657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610d9a5750836001600160a01b0316610d8f84610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610db582610714565b6001600160a01b031614610e315760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610eac5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eb7600082610cb5565b6001600160a01b0383166000908152600460205260408120805460019290610ee0908490611dff565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f0e908490611dd3565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b610fd383836115cd565b610fe0600084848461170f565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006007805461105890611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461108490611e42565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b5050505050905080516000141561111b57505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6007805461112890611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461115490611e42565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505091505090565b5090565b6060816111f057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561121a578061120481611e7d565b91506112139050600a83611deb565b91506111f4565b60008167ffffffffffffffff81111561124357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561126d576020820181803683370190505b5090505b8415610d9a57611282600183611dff565b915061128f600a86611e98565b61129a906030611dd3565b60f81b8183815181106112bd57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506112f7600a86611deb565b9450611271565b611306610f6f565b6000828152600360205260409020546001600160a01b03166113765760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260086020908152604090912082516105bb92840190611867565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113f082610714565b90506113fd600083610cb5565b6001600160a01b0381166000908152600460205260408120805460019290611426908490611dff565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156114e25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61155a848484610da2565b6115668484848461170f565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116235760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116b1908490611dd3565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561185c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611753903390899088908890600401611d84565b602060405180830381600087803b15801561176d57600080fd5b505af192505050801561179d575060408051601f3d908101601f1916820190925261179a91810190611cf5565b60015b611842573d8080156117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b50805161183a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d9a565b506001949350505050565b82805461187390611e42565b90600052602060002090601f01602090048101928261189557600085556118db565b82601f106118ae57805160ff19168380011785556118db565b828001600101855582156118db579182015b828111156118db5782518255916020019190600101906118c0565b506111ac9291505b808211156111ac57600081556001016118e3565b600067ffffffffffffffff8084111561191257611912611ed8565b604051601f8501601f19908116603f0116810190828211818310171561193a5761193a611ed8565b8160405280935085815286868601111561195357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461198457600080fd5b919050565b8035801515811461198457600080fd5b60008083601f8401126119aa578182fd5b50813567ffffffffffffffff8111156119c1578182fd5b6020830191508360208285010111156119d957600080fd5b9250929050565b6000602082840312156119f1578081fd5b6119fa8261196d565b9392505050565b60008060408385031215611a13578081fd5b611a1c8361196d565b9150611a2a6020840161196d565b90509250929050565b600080600060608486031215611a47578081fd5b611a508461196d565b9250611a5e6020850161196d565b9150604084013590509250925092565b600080600080600060808688031215611a85578081fd5b611a8e8661196d565b9450611a9c6020870161196d565b935060408601359250606086013567ffffffffffffffff811115611abe578182fd5b611aca88828901611999565b969995985093965092949392505050565b60008060008060808587031215611af0578384fd5b611af98561196d565b9350611b076020860161196d565b925060408501359150606085013567ffffffffffffffff811115611b29578182fd5b8501601f81018713611b39578182fd5b611b48878235602084016118f7565b91505092959194509250565b60008060408385031215611b66578182fd5b611b6f8361196d565b9150611a2a60208401611989565b60008060008060608587031215611b92578384fd5b611b9b8561196d565b9350611ba960208601611989565b9250604085013567ffffffffffffffff811115611bc4578283fd5b611bd087828801611999565b95989497509550505050565b60008060408385031215611bee578182fd5b611bf78361196d565b946020939093013593505050565b60008060008060608587031215611c1a578384fd5b611c238561196d565b935060208501359250604085013567ffffffffffffffff811115611bc4578283fd5b600080600080600060808688031215611c5c578081fd5b611c658661196d565b945060208601359350604086013567ffffffffffffffff80821115611c88578283fd5b611c9489838a01611999565b90955093506060880135915080821115611cac578283fd5b508601601f81018813611cbd578182fd5b611ccc888235602084016118f7565b9150509295509295909350565b600060208284031215611cea578081fd5b81356119fa81611eee565b600060208284031215611d06578081fd5b81516119fa81611eee565b600060208284031215611d22578081fd5b5035919050565b60008151808452611d41816020860160208601611e16565b601f01601f19169290920160200192915050565b60008351611d67818460208801611e16565b835190830190611d7b818360208801611e16565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611db66080830184611d29565b9695505050505050565b6020815260006119fa6020830184611d29565b60008219821115611de657611de6611eac565b500190565b600082611dfa57611dfa611ec2565b500490565b600082821015611e1157611e11611eac565b500390565b60005b83811015611e31578181015183820152602001611e19565b838111156105ca5750506000910152565b600181811c90821680611e5657607f821691505b60208210811415611e7757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e9157611e91611eac565b5060010190565b600082611ea757611ea7611ec2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610bb357600080fdfea2646970667358221220a29ed52ab39db7742dfc3cb70285c067d51c4520cce59e3d6ba4460c4346879e64736f6c63430008040033a2646970667358221220f61e2abcf7418341c207ada889d3db5e39b47ee5ddbc0d9a7ccb4d72a906ddd064736f6c63430008040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806383a74a0c1461008c575b600080fd5b61007861004936600461037d565b6001600160e01b0319167f83a74a0c000000000000000000000000000000000000000000000000000000001490565b604051901515815260200160405180910390f35b61009f61009a3660046103ac565b6100a1565b005b831561019a57600086866040516100b790610293565b6100c29291906104bc565b604051809103906000f0801580156100de573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561013257600080fd5b505af1158015610146573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e130688886001888860405161018c9594939291906104ea565b60405180910390a25061028b565b60008686836040516101ab906102a1565b6101b79392919061054d565b604051809103906000f0801580156101d3573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e13068888600088886040516102819594939291906104ea565b60405180910390a2505b505050505050565b61142d80620005c083390190565b61226180620019ed83390190565b60008083601f8401126102c0578081fd5b50813567ffffffffffffffff8111156102d7578182fd5b6020830191508360208285010111156102ef57600080fd5b9250929050565b600082601f830112610306578081fd5b813567ffffffffffffffff8082111561032157610321610590565b604051601f8301601f19908116603f0116810190828211818310171561034957610349610590565b81604052838152866020858801011115610361578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561038e578081fd5b81356001600160e01b0319811681146103a5578182fd5b9392505050565b60008060008060008060a087890312156103c4578182fd5b863567ffffffffffffffff808211156103db578384fd5b6103e78a838b016102f6565b975060208901359150808211156103fc578384fd5b6104088a838b016102f6565b965060408901359150811515821461041e578384fd5b90945060608801359080821115610433578384fd5b61043f8a838b016102af565b90955093506080890135915080821115610457578283fd5b5061046489828a016102f6565b9150509295509295509295565b60008151808452815b818110156104965760208185018101518683018201520161047a565b818111156104a75782602083870101525b50601f01601f19169290920160200192915050565b6040815260006104cf6040830185610471565b82810360208401526104e18185610471565b95945050505050565b6080815260006104fd6080830188610471565b828103602084015261050f8188610471565b9050851515604084015282810360608401528381528385602083013781602085830101526020601f19601f8601168201019150509695505050505050565b6060815260006105606060830186610471565b82810360208401526105728186610471565b905082810360408401526105868185610471565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040523480156200001157600080fd5b506040516200142d3803806200142d833981016040819052620000349162000220565b8181620000413362000077565b815162000056906004906020850190620000c7565b5080516200006c906005906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61114380620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5eb564116100cd578063a457c2d711610081578063c0ea7a7a11610066578063c0ea7a7a146102a2578063dd62ed3e146102b5578063f2fde38b146102ee57600080fd5b8063a457c2d71461027c578063a9059cbb1461028f57600080fd5b80638da5cb5b116100b25780638da5cb5b1461024657806395d89b411461026157806396adfe421461026957600080fd5b80637b5eb5641461022057806383e49c531461023357600080fd5b806323b872dd11610124578063395093511161010957806339509351146101da57806370a08231146101ed578063715018a61461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004610ffa565b610301565b60405190151581526020015b60405180910390f35b61018661039a565b604051610175919061103a565b6101696101a1366004610f79565b61042c565b6003545b604051908152602001610175565b6101696101c6366004610ed1565b610444565b60405160128152602001610175565b6101696101e8366004610f79565b610468565b6101aa6101fb366004610e7e565b6001600160a01b031660009081526001602052604090205490565b61021e6104a7565b005b61016961022e366004610fa2565b6104bb565b61021e610241366004610fa2565b6104d0565b6000546040516001600160a01b039091168152602001610175565b610186610563565b61021e610277366004610fa2565b610572565b61016961028a366004610f79565b610584565b61016961029d366004610f79565b61062e565b61021e6102b0366004610f0c565b61063c565b6101aa6102c3366004610e9f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61021e6102fc366004610e7e565b610671565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faefdad0f00000000000000000000000000000000000000000000000000000000148061039457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600480546103a9906110bc565b80601f01602080910402602001604051908101604052809291908181526020018280546103d5906110bc565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b60003361043a818585610701565b5060019392505050565b60003361045285828561085a565b61045d8585856108e6565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490919061043a90829086906104a290879061108d565b610701565b6104af610afd565b6104b96000610b57565b565b60006104c7858561042c565b95945050505050565b6001600160a01b03841633146105535760405162461bcd60e51b815260206004820152602260248201527f455243323057697468446174613a2063616c6c6572206973206e6f74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61055d8484610bbf565b50505050565b6060600580546103a9906110bc565b61057a610afd565b61055d8484610d3c565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190838110156106215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161054a565b61045d8286868403610701565b60003361043a8185856108e6565b6001600160a01b03851633141561065d57610657848461062e565b5061066a565b610668858585610444565b505b5050505050565b610679610afd565b6001600160a01b0381166106f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161054a565b6106fe81610b57565b50565b6001600160a01b03831661077c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166107f85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260026020908152604080832093861683529290522054600019811461055d57818110156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161054a565b61055d8484848403610701565b6001600160a01b0383166109625760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03831660009081526001602052604090205481811015610a6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610aa490849061108d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af091815260200190565b60405180910390a361055d565b6000546001600160a01b031633146104b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054a565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216610c3b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03821660009081526001602052604090205481811015610cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610cf99084906110a5565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161084d565b6001600160a01b038216610d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161054a565b8060036000828254610da4919061108d565b90915550506001600160a01b03821660009081526001602052604081208054839290610dd190849061108d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610e3257600080fd5b919050565b60008083601f840112610e48578182fd5b50813567ffffffffffffffff811115610e5f578182fd5b602083019150836020828501011115610e7757600080fd5b9250929050565b600060208284031215610e8f578081fd5b610e9882610e1b565b9392505050565b60008060408385031215610eb1578081fd5b610eba83610e1b565b9150610ec860208401610e1b565b90509250929050565b600080600060608486031215610ee5578081fd5b610eee84610e1b565b9250610efc60208501610e1b565b9150604084013590509250925092565b600080600080600060808688031215610f23578081fd5b610f2c86610e1b565b9450610f3a60208701610e1b565b935060408601359250606086013567ffffffffffffffff811115610f5c578182fd5b610f6888828901610e37565b969995985093965092949392505050565b60008060408385031215610f8b578182fd5b610f9483610e1b565b946020939093013593505050565b60008060008060608587031215610fb7578384fd5b610fc085610e1b565b935060208501359250604085013567ffffffffffffffff811115610fe2578283fd5b610fee87828801610e37565b95989497509550505050565b60006020828403121561100b578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e98578182fd5b6000602080835283518082850152825b818110156110665785810183015185820160400152820161104a565b818111156110775783604083870101525b50601f01601f1916929092016040019392505050565b600082198211156110a0576110a06110f7565b500190565b6000828210156110b7576110b76110f7565b500390565b600181811c908216806110d057607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212206dfce5d713e5cea79f1985732d257a191870105f550fe71f71dc3d215d59655b64736f6c6343000804003360806040523480156200001157600080fd5b506040516200226138038062002261833981016040819052620000349162000237565b828262000041336200008e565b815162000056906001906020850190620000de565b5080516200006c906002906020840190620000de565b505081516200008491506007906020840190620000de565b5050505062000317565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000ec90620002c4565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b262000301565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000301565b81604052838152602092508683858801011115620001f9578485fd5b8491505b838210156200021c5785820183015181830184015290820190620001fd565b838211156200022d57848385830101525b9695505050505050565b6000806000606084860312156200024c578283fd5b83516001600160401b038082111562000263578485fd5b620002718783880162000184565b9450602086015191508082111562000287578384fd5b620002958783880162000184565b93506040860151915080821115620002ab578283fd5b50620002ba8682870162000184565b9150509250925092565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f3a80620003276000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063a22cb4651161008c578063c87b56dd11610066578063c87b56dd1461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063a22cb465146102f1578063b88d4fde14610304578063c0ea7a7a1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d657806396adfe42146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806342842e0e146102355780634f45edcd1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611cd9565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611dc0565b6101e26101dd366004611d11565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611bdc565b610489565b005b61020d61021d366004611b7d565b6105c0565b61020d610230366004611a33565b6105d0565b61020d610243366004611a33565b610657565b61020d610256366004611c45565b610672565b6101e2610269366004611d11565b610714565b61028161027c3660046119e0565b610779565b6040519081526020016101b1565b61020d610813565b6101c2610827565b61020d6102ad366004611c05565b610836565b61020d6102c0366004611c05565b610840565b6000546001600160a01b03166101e2565b6101c26108c7565b61020d6102ec366004611c05565b6108d6565b61020d6102ff366004611b54565b610934565b61020d610312366004611adb565b610943565b61020d610325366004611a6e565b6109cb565b6101c2610338366004611d11565b610a14565b6101a561034b366004611a01565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d6103873660046119e0565b610b26565b60006001600160e01b031982167f8706707d0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bb6565b92915050565b6060600180546103df90611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611e42565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c51565b506000908152600560205260409020546001600160a01b031690565b600061049482610714565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610cb5565b505050565b6105ca8484610934565b50505050565b6105da3382610d23565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610da2565b6105bb83838360405180602001604052806000815250610943565b61067a610f6f565b6106bb858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b80518190610702576106fd856106cf611047565b6106d8886111b0565b6040516020016106e9929190611d55565b6040516020818303038152906040526112fe565b61070c565b61070c85836112fe565b505050505050565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166107f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b61081b610f6f565b6108256000611395565b565b6060610831611047565b905090565b6105ca8484610489565b6001600160a01b03841633146108be5760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca836113e5565b6060600280546103df90611e42565b6108de610f6f565b61091f848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b6105ca8361092b611047565b6106d8866111b0565b61093f338383611480565b5050565b61094d3383610d23565b6109bf5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca8484848461154f565b610a0d85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061094392505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a875760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526008602052604081208054610aa090611e42565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90611e42565b8015610b195780601f10610aee57610100808354040283529160200191610b19565b820191906000526020600020905b815481529060010190602001808311610afc57829003601f168201915b5093979650505050505050565b610b2e610f6f565b6001600160a01b038116610baa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610bb381611395565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c1957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610bb35760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cea82610714565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d2f83610714565b9050806001600160a01b0316846001600160a01b03161480610d7657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610d9a5750836001600160a01b0316610d8f84610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610db582610714565b6001600160a01b031614610e315760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610eac5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eb7600082610cb5565b6001600160a01b0383166000908152600460205260408120805460019290610ee0908490611dff565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f0e908490611dd3565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b610fd383836115cd565b610fe0600084848461170f565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006007805461105890611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461108490611e42565b80156110d15780601f106110a6576101008083540402835291602001916110d1565b820191906000526020600020905b8154815290600101906020018083116110b457829003601f168201915b5050505050905080516000141561111b57505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6007805461112890611e42565b80601f016020809104026020016040519081016040528092919081815260200182805461115490611e42565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505091505090565b5090565b6060816111f057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561121a578061120481611e7d565b91506112139050600a83611deb565b91506111f4565b60008167ffffffffffffffff81111561124357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561126d576020820181803683370190505b5090505b8415610d9a57611282600183611dff565b915061128f600a86611e98565b61129a906030611dd3565b60f81b8183815181106112bd57634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506112f7600a86611deb565b9450611271565b611306610f6f565b6000828152600360205260409020546001600160a01b03166113765760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260086020908152604090912082516105bb92840190611867565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113f082610714565b90506113fd600083610cb5565b6001600160a01b0381166000908152600460205260408120805460019290611426908490611dff565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156114e25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61155a848484610da2565b6115668484848461170f565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116235760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116b1908490611dd3565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561185c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611753903390899088908890600401611d84565b602060405180830381600087803b15801561176d57600080fd5b505af192505050801561179d575060408051601f3d908101601f1916820190925261179a91810190611cf5565b60015b611842573d8080156117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b50805161183a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d9a565b506001949350505050565b82805461187390611e42565b90600052602060002090601f01602090048101928261189557600085556118db565b82601f106118ae57805160ff19168380011785556118db565b828001600101855582156118db579182015b828111156118db5782518255916020019190600101906118c0565b506111ac9291505b808211156111ac57600081556001016118e3565b600067ffffffffffffffff8084111561191257611912611ed8565b604051601f8501601f19908116603f0116810190828211818310171561193a5761193a611ed8565b8160405280935085815286868601111561195357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461198457600080fd5b919050565b8035801515811461198457600080fd5b60008083601f8401126119aa578182fd5b50813567ffffffffffffffff8111156119c1578182fd5b6020830191508360208285010111156119d957600080fd5b9250929050565b6000602082840312156119f1578081fd5b6119fa8261196d565b9392505050565b60008060408385031215611a13578081fd5b611a1c8361196d565b9150611a2a6020840161196d565b90509250929050565b600080600060608486031215611a47578081fd5b611a508461196d565b9250611a5e6020850161196d565b9150604084013590509250925092565b600080600080600060808688031215611a85578081fd5b611a8e8661196d565b9450611a9c6020870161196d565b935060408601359250606086013567ffffffffffffffff811115611abe578182fd5b611aca88828901611999565b969995985093965092949392505050565b60008060008060808587031215611af0578384fd5b611af98561196d565b9350611b076020860161196d565b925060408501359150606085013567ffffffffffffffff811115611b29578182fd5b8501601f81018713611b39578182fd5b611b48878235602084016118f7565b91505092959194509250565b60008060408385031215611b66578182fd5b611b6f8361196d565b9150611a2a60208401611989565b60008060008060608587031215611b92578384fd5b611b9b8561196d565b9350611ba960208601611989565b9250604085013567ffffffffffffffff811115611bc4578283fd5b611bd087828801611999565b95989497509550505050565b60008060408385031215611bee578182fd5b611bf78361196d565b946020939093013593505050565b60008060008060608587031215611c1a578384fd5b611c238561196d565b935060208501359250604085013567ffffffffffffffff811115611bc4578283fd5b600080600080600060808688031215611c5c578081fd5b611c658661196d565b945060208601359350604086013567ffffffffffffffff80821115611c88578283fd5b611c9489838a01611999565b90955093506060880135915080821115611cac578283fd5b508601601f81018813611cbd578182fd5b611ccc888235602084016118f7565b9150509295509295909350565b600060208284031215611cea578081fd5b81356119fa81611eee565b600060208284031215611d06578081fd5b81516119fa81611eee565b600060208284031215611d22578081fd5b5035919050565b60008151808452611d41816020860160208601611e16565b601f01601f19169290920160200192915050565b60008351611d67818460208801611e16565b835190830190611d7b818360208801611e16565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611db66080830184611d29565b9695505050505050565b6020815260006119fa6020830184611d29565b60008219821115611de657611de6611eac565b500190565b600082611dfa57611dfa611ec2565b500490565b600082821015611e1157611e11611eac565b500390565b60005b83811015611e31578181015183820152602001611e19565b838111156105ca5750506000910152565b600181811c90821680611e5657607f821691505b60208210811415611e7757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e9157611e91611eac565b5060010190565b600082611ea757611ea7611ec2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610bb357600080fdfea2646970667358221220a29ed52ab39db7742dfc3cb70285c067d51c4520cce59e3d6ba4460c4346879e64736f6c63430008040033a2646970667358221220f61e2abcf7418341c207ada889d3db5e39b47ee5ddbc0d9a7ccb4d72a906ddd064736f6c63430008040033", + "bytecode": "0x608060405234801561001057600080fd5b50613ce5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806383a74a0c1461008c575b600080fd5b61007861004936600461037d565b6001600160e01b0319167f83a74a0c000000000000000000000000000000000000000000000000000000001490565b604051901515815260200160405180910390f35b61009f61009a3660046103ac565b6100a1565b005b831561019a57600086866040516100b790610293565b6100c29291906104bc565b604051809103906000f0801580156100de573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561013257600080fd5b505af1158015610146573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e130688886001888860405161018c9594939291906104ea565b60405180910390a25061028b565b60008686836040516101ab906102a1565b6101b79392919061054d565b604051809103906000f0801580156101d3573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e13068888600088886040516102819594939291906104ea565b60405180910390a2505b505050505050565b61142d80620005c083390190565b6122c380620019ed83390190565b60008083601f8401126102c0578081fd5b50813567ffffffffffffffff8111156102d7578182fd5b6020830191508360208285010111156102ef57600080fd5b9250929050565b600082601f830112610306578081fd5b813567ffffffffffffffff8082111561032157610321610590565b604051601f8301601f19908116603f0116810190828211818310171561034957610349610590565b81604052838152866020858801011115610361578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561038e578081fd5b81356001600160e01b0319811681146103a5578182fd5b9392505050565b60008060008060008060a087890312156103c4578182fd5b863567ffffffffffffffff808211156103db578384fd5b6103e78a838b016102f6565b975060208901359150808211156103fc578384fd5b6104088a838b016102f6565b965060408901359150811515821461041e578384fd5b90945060608801359080821115610433578384fd5b61043f8a838b016102af565b90955093506080890135915080821115610457578283fd5b5061046489828a016102f6565b9150509295509295509295565b60008151808452815b818110156104965760208185018101518683018201520161047a565b818111156104a75782602083870101525b50601f01601f19169290920160200192915050565b6040815260006104cf6040830185610471565b82810360208401526104e18185610471565b95945050505050565b6080815260006104fd6080830188610471565b828103602084015261050f8188610471565b9050851515604084015282810360608401528381528385602083013781602085830101526020601f19601f8601168201019150509695505050505050565b6060815260006105606060830186610471565b82810360208401526105728186610471565b905082810360408401526105868185610471565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040523480156200001157600080fd5b506040516200142d3803806200142d833981016040819052620000349162000220565b8181620000413362000077565b815162000056906004906020850190620000c7565b5080516200006c906005906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61114380620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5eb564116100cd578063a457c2d711610081578063c0ea7a7a11610066578063c0ea7a7a146102a2578063dd62ed3e146102b5578063f2fde38b146102ee57600080fd5b8063a457c2d71461027c578063a9059cbb1461028f57600080fd5b80638da5cb5b116100b25780638da5cb5b1461024657806395d89b411461026157806396adfe421461026957600080fd5b80637b5eb5641461022057806383e49c531461023357600080fd5b806323b872dd11610124578063395093511161010957806339509351146101da57806370a08231146101ed578063715018a61461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004610ffa565b610301565b60405190151581526020015b60405180910390f35b61018661039a565b604051610175919061103a565b6101696101a1366004610f79565b61042c565b6003545b604051908152602001610175565b6101696101c6366004610ed1565b610444565b60405160128152602001610175565b6101696101e8366004610f79565b610468565b6101aa6101fb366004610e7e565b6001600160a01b031660009081526001602052604090205490565b61021e6104a7565b005b61016961022e366004610fa2565b6104bb565b61021e610241366004610fa2565b6104d0565b6000546040516001600160a01b039091168152602001610175565b610186610563565b61021e610277366004610fa2565b610572565b61016961028a366004610f79565b610584565b61016961029d366004610f79565b61062e565b61021e6102b0366004610f0c565b61063c565b6101aa6102c3366004610e9f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61021e6102fc366004610e7e565b610671565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faefdad0f00000000000000000000000000000000000000000000000000000000148061039457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600480546103a9906110bc565b80601f01602080910402602001604051908101604052809291908181526020018280546103d5906110bc565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b60003361043a818585610701565b5060019392505050565b60003361045285828561085a565b61045d8585856108e6565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490919061043a90829086906104a290879061108d565b610701565b6104af610afd565b6104b96000610b57565b565b60006104c7858561042c565b95945050505050565b6001600160a01b03841633146105535760405162461bcd60e51b815260206004820152602260248201527f455243323057697468446174613a2063616c6c6572206973206e6f74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61055d8484610bbf565b50505050565b6060600580546103a9906110bc565b61057a610afd565b61055d8484610d3c565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190838110156106215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161054a565b61045d8286868403610701565b60003361043a8185856108e6565b6001600160a01b03851633141561065d57610657848461062e565b5061066a565b610668858585610444565b505b5050505050565b610679610afd565b6001600160a01b0381166106f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161054a565b6106fe81610b57565b50565b6001600160a01b03831661077c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166107f85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260026020908152604080832093861683529290522054600019811461055d57818110156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161054a565b61055d8484848403610701565b6001600160a01b0383166109625760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03831660009081526001602052604090205481811015610a6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610aa490849061108d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af091815260200190565b60405180910390a361055d565b6000546001600160a01b031633146104b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054a565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216610c3b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03821660009081526001602052604090205481811015610cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610cf99084906110a5565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161084d565b6001600160a01b038216610d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161054a565b8060036000828254610da4919061108d565b90915550506001600160a01b03821660009081526001602052604081208054839290610dd190849061108d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610e3257600080fd5b919050565b60008083601f840112610e48578182fd5b50813567ffffffffffffffff811115610e5f578182fd5b602083019150836020828501011115610e7757600080fd5b9250929050565b600060208284031215610e8f578081fd5b610e9882610e1b565b9392505050565b60008060408385031215610eb1578081fd5b610eba83610e1b565b9150610ec860208401610e1b565b90509250929050565b600080600060608486031215610ee5578081fd5b610eee84610e1b565b9250610efc60208501610e1b565b9150604084013590509250925092565b600080600080600060808688031215610f23578081fd5b610f2c86610e1b565b9450610f3a60208701610e1b565b935060408601359250606086013567ffffffffffffffff811115610f5c578182fd5b610f6888828901610e37565b969995985093965092949392505050565b60008060408385031215610f8b578182fd5b610f9483610e1b565b946020939093013593505050565b60008060008060608587031215610fb7578384fd5b610fc085610e1b565b935060208501359250604085013567ffffffffffffffff811115610fe2578283fd5b610fee87828801610e37565b95989497509550505050565b60006020828403121561100b578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e98578182fd5b6000602080835283518082850152825b818110156110665785810183015185820160400152820161104a565b818111156110775783604083870101525b50601f01601f1916929092016040019392505050565b600082198211156110a0576110a06110f7565b500190565b6000828210156110b7576110b76110f7565b500390565b600181811c908216806110d057607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212206dfce5d713e5cea79f1985732d257a191870105f550fe71f71dc3d215d59655b64736f6c6343000804003360806040523480156200001157600080fd5b50604051620022c3380380620022c3833981016040819052620000349162000237565b828262000041336200008e565b815162000056906001906020850190620000de565b5080516200006c906002906020840190620000de565b505081516200008491506008906020840190620000de565b5050505062000317565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000ec90620002c4565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b262000301565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000301565b81604052838152602092508683858801011115620001f9578485fd5b8491505b838210156200021c5785820183015181830184015290820190620001fd565b838211156200022d57848385830101525b9695505050505050565b6000806000606084860312156200024c578283fd5b83516001600160401b038082111562000263578485fd5b620002718783880162000184565b9450602086015191508082111562000287578384fd5b620002958783880162000184565b93506040860151915080821115620002ab578283fd5b50620002ba8682870162000184565b9150509250925092565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f9c80620003276000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063b88d4fde1161008c578063d4f1804611610066578063d4f180461461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063b88d4fde146102f1578063c0ea7a7a14610304578063c87b56dd1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d6578063a22cb465146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806324e18a0b1461023557806342842e0e1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611d3b565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611e22565b6101e26101dd366004611d73565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611cd2565b610489565b005b61020d61021d366004611bb3565b6105c0565b61020d610230366004611a69565b6105d0565b61020d610243366004611c63565b610657565b61020d610256366004611a69565b610714565b6101e2610269366004611d73565b61072f565b61028161027c366004611a16565b610794565b6040519081526020016101b1565b61020d61082e565b6101c2610842565b61020d6102ad366004611cfb565b610851565b61020d6102c0366004611cfb565b61085b565b6000546001600160a01b03166101e2565b6101c26108e2565b61020d6102ec366004611b8a565b6108f1565b61020d6102ff366004611b11565b610900565b61020d610312366004611aa4565b610988565b6101c2610325366004611d73565b6109d1565b61020d610338366004611c12565b610ae3565b6101a561034b366004611a37565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d610387366004611a16565b610b5c565b60006001600160e01b031982167faefe69bf0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bec565b92915050565b6060600180546103df90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611ea4565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c87565b506000908152600560205260409020546001600160a01b031690565b60006104948261072f565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610ceb565b505050565b6105ca84846108f1565b50505050565b6105da3382610d59565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610dd8565b61065f610fa5565b600061066a60075490565b905061067a600780546001019055565b6106bb858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b81518290610702576106fd826106cf61107d565b6106d8856111e6565b6040516020016106e9929190611db7565b604051602081830303815290604052611334565b61070c565b61070c8284611334565b505050505050565b6105bb83838360405180602001604052806000815250610900565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b610836610fa5565b61084060006113cb565b565b606061084c61107d565b905090565b6105ca8484610489565b6001600160a01b03841633146108d95760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca8361141b565b6060600280546103df90611ea4565b6108fc3383836114b6565b5050565b61090a3383610d59565b61097c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca84848484611585565b6109ca85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061090092505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a445760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526009602052604081208054610a5d90611ea4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990611ea4565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b5093979650505050505050565b610aeb610fa5565b6000610af660075490565b9050610b06600780546001019055565b610b47848285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b6105ca81610b5361107d565b6106d8846111e6565b610b64610fa5565b6001600160a01b038116610be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610be9816113cb565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c4f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610be95760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d208261072f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d658361072f565b9050806001600160a01b0316846001600160a01b03161480610dac57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dd05750836001600160a01b0316610dc584610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610deb8261072f565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610ee25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eed600082610ceb565b6001600160a01b0383166000908152600460205260408120805460019290610f16908490611e61565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f44908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6110098383611603565b6110166000848484611745565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006008805461108e90611ea4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90611ea4565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905080516000141561115157505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6008805461115e90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90611ea4565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b505050505091505090565b5090565b60608161122657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611250578061123a81611edf565b91506112499050600a83611e4d565b915061122a565b60008167ffffffffffffffff81111561127957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112a3576020820181803683370190505b5090505b8415610dd0576112b8600183611e61565b91506112c5600a86611efa565b6112d0906030611e35565b60f81b8183815181106112f357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061132d600a86611e4d565b94506112a7565b61133c610fa5565b6000828152600360205260409020546001600160a01b03166113ac5760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260096020908152604090912082516105bb9284019061189d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006114268261072f565b9050611433600083610ceb565b6001600160a01b038116600090815260046020526040812080546001929061145c908490611e61565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156115185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611590848484610dd8565b61159c84848484611745565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116e7908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561189257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611789903390899088908890600401611de6565b602060405180830381600087803b1580156117a357600080fd5b505af19250505080156117d3575060408051601f3d908101601f191682019092526117d091810190611d57565b60015b611878573d808015611801576040519150601f19603f3d011682016040523d82523d6000602084013e611806565b606091505b5080516118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dd0565b506001949350505050565b8280546118a990611ea4565b90600052602060002090601f0160209004810192826118cb5760008555611911565b82601f106118e457805160ff1916838001178555611911565b82800160010185558215611911579182015b828111156119115782518255916020019190600101906118f6565b506111e29291505b808211156111e25760008155600101611919565b600067ffffffffffffffff8084111561194857611948611f3a565b604051601f8501601f19908116603f0116810190828211818310171561197057611970611f3a565b8160405280935085815286868601111561198957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146119ba57600080fd5b919050565b803580151581146119ba57600080fd5b60008083601f8401126119e0578182fd5b50813567ffffffffffffffff8111156119f7578182fd5b602083019150836020828501011115611a0f57600080fd5b9250929050565b600060208284031215611a27578081fd5b611a30826119a3565b9392505050565b60008060408385031215611a49578081fd5b611a52836119a3565b9150611a60602084016119a3565b90509250929050565b600080600060608486031215611a7d578081fd5b611a86846119a3565b9250611a94602085016119a3565b9150604084013590509250925092565b600080600080600060808688031215611abb578081fd5b611ac4866119a3565b9450611ad2602087016119a3565b935060408601359250606086013567ffffffffffffffff811115611af4578182fd5b611b00888289016119cf565b969995985093965092949392505050565b60008060008060808587031215611b26578384fd5b611b2f856119a3565b9350611b3d602086016119a3565b925060408501359150606085013567ffffffffffffffff811115611b5f578182fd5b8501601f81018713611b6f578182fd5b611b7e8782356020840161192d565b91505092959194509250565b60008060408385031215611b9c578182fd5b611ba5836119a3565b9150611a60602084016119bf565b60008060008060608587031215611bc8578384fd5b611bd1856119a3565b9350611bdf602086016119bf565b9250604085013567ffffffffffffffff811115611bfa578283fd5b611c06878288016119cf565b95989497509550505050565b600080600060408486031215611c26578283fd5b611c2f846119a3565b9250602084013567ffffffffffffffff811115611c4a578283fd5b611c56868287016119cf565b9497909650939450505050565b60008060008060608587031215611c78578384fd5b611c81856119a3565b9350602085013567ffffffffffffffff80821115611c9d578485fd5b611ca9888389016119cf565b90955093506040870135915080821115611cc1578283fd5b508501601f81018713611b6f578182fd5b60008060408385031215611ce4578182fd5b611ced836119a3565b946020939093013593505050565b60008060008060608587031215611d10578182fd5b611d19856119a3565b935060208501359250604085013567ffffffffffffffff811115611bfa578283fd5b600060208284031215611d4c578081fd5b8135611a3081611f50565b600060208284031215611d68578081fd5b8151611a3081611f50565b600060208284031215611d84578081fd5b5035919050565b60008151808452611da3816020860160208601611e78565b601f01601f19169290920160200192915050565b60008351611dc9818460208801611e78565b835190830190611ddd818360208801611e78565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e186080830184611d8b565b9695505050505050565b602081526000611a306020830184611d8b565b60008219821115611e4857611e48611f0e565b500190565b600082611e5c57611e5c611f24565b500490565b600082821015611e7357611e73611f0e565b500390565b60005b83811015611e93578181015183820152602001611e7b565b838111156105ca5750506000910152565b600181811c90821680611eb857607f821691505b60208210811415611ed957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ef357611ef3611f0e565b5060010190565b600082611f0957611f09611f24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be957600080fdfea26469706673582212203d6e700f8a0b10796db56246303859e2d579a99be49f8d1d81068a8040f00c0e64736f6c63430008040033a264697066735822122065d59ca45b6f4a8ed7d7a84951eae73c8ae623c27568389b80c1b68ad8a8876664736f6c63430008040033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b57806383a74a0c1461008c575b600080fd5b61007861004936600461037d565b6001600160e01b0319167f83a74a0c000000000000000000000000000000000000000000000000000000001490565b604051901515815260200160405180910390f35b61009f61009a3660046103ac565b6100a1565b005b831561019a57600086866040516100b790610293565b6100c29291906104bc565b604051809103906000f0801580156100de573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561013257600080fd5b505af1158015610146573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e130688886001888860405161018c9594939291906104ea565b60405180910390a25061028b565b60008686836040516101ab906102a1565b6101b79392919061054d565b604051809103906000f0801580156101d3573d6000803e3d6000fd5b5090506001600160a01b03811663f2fde38b336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561022757600080fd5b505af115801561023b573d6000803e3d6000fd5b50505050806001600160a01b03167fca8fb21c1d554712c6778c5f566f410954f08d7eba66fd8e740581f9d93e13068888600088886040516102819594939291906104ea565b60405180910390a2505b505050505050565b61142d80620005c083390190565b6122c380620019ed83390190565b60008083601f8401126102c0578081fd5b50813567ffffffffffffffff8111156102d7578182fd5b6020830191508360208285010111156102ef57600080fd5b9250929050565b600082601f830112610306578081fd5b813567ffffffffffffffff8082111561032157610321610590565b604051601f8301601f19908116603f0116810190828211818310171561034957610349610590565b81604052838152866020858801011115610361578485fd5b8360208701602083013792830160200193909352509392505050565b60006020828403121561038e578081fd5b81356001600160e01b0319811681146103a5578182fd5b9392505050565b60008060008060008060a087890312156103c4578182fd5b863567ffffffffffffffff808211156103db578384fd5b6103e78a838b016102f6565b975060208901359150808211156103fc578384fd5b6104088a838b016102f6565b965060408901359150811515821461041e578384fd5b90945060608801359080821115610433578384fd5b61043f8a838b016102af565b90955093506080890135915080821115610457578283fd5b5061046489828a016102f6565b9150509295509295509295565b60008151808452815b818110156104965760208185018101518683018201520161047a565b818111156104a75782602083870101525b50601f01601f19169290920160200192915050565b6040815260006104cf6040830185610471565b82810360208401526104e18185610471565b95945050505050565b6080815260006104fd6080830188610471565b828103602084015261050f8188610471565b9050851515604084015282810360608401528381528385602083013781602085830101526020601f19601f8601168201019150509695505050505050565b6060815260006105606060830186610471565b82810360208401526105728186610471565b905082810360408401526105868185610471565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60806040523480156200001157600080fd5b506040516200142d3803806200142d833981016040819052620000349162000220565b8181620000413362000077565b815162000056906004906020850190620000c7565b5080516200006c906005906020840190620000c7565b5050505050620002da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000d59062000287565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600082601f8301126200017e578081fd5b81516001600160401b03808211156200019b576200019b620002c4565b604051601f8301601f19908116603f01168101908282118183101715620001c657620001c6620002c4565b81604052838152602092508683858801011115620001e2578485fd5b8491505b83821015620002055785820183015181830184015290820190620001e6565b838211156200021657848385830101525b9695505050505050565b6000806040838503121562000233578182fd5b82516001600160401b03808211156200024a578384fd5b62000258868387016200016d565b935060208501519150808211156200026e578283fd5b506200027d858286016200016d565b9150509250929050565b600181811c908216806200029c57607f821691505b60208210811415620002be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61114380620002ea6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5eb564116100cd578063a457c2d711610081578063c0ea7a7a11610066578063c0ea7a7a146102a2578063dd62ed3e146102b5578063f2fde38b146102ee57600080fd5b8063a457c2d71461027c578063a9059cbb1461028f57600080fd5b80638da5cb5b116100b25780638da5cb5b1461024657806395d89b411461026157806396adfe421461026957600080fd5b80637b5eb5641461022057806383e49c531461023357600080fd5b806323b872dd11610124578063395093511161010957806339509351146101da57806370a08231146101ed578063715018a61461021657600080fd5b806323b872dd146101b8578063313ce567146101cb57600080fd5b806301ffc9a71461015657806306fdde031461017e578063095ea7b31461019357806318160ddd146101a6575b600080fd5b610169610164366004610ffa565b610301565b60405190151581526020015b60405180910390f35b61018661039a565b604051610175919061103a565b6101696101a1366004610f79565b61042c565b6003545b604051908152602001610175565b6101696101c6366004610ed1565b610444565b60405160128152602001610175565b6101696101e8366004610f79565b610468565b6101aa6101fb366004610e7e565b6001600160a01b031660009081526001602052604090205490565b61021e6104a7565b005b61016961022e366004610fa2565b6104bb565b61021e610241366004610fa2565b6104d0565b6000546040516001600160a01b039091168152602001610175565b610186610563565b61021e610277366004610fa2565b610572565b61016961028a366004610f79565b610584565b61016961029d366004610f79565b61062e565b61021e6102b0366004610f0c565b61063c565b6101aa6102c3366004610e9f565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61021e6102fc366004610e7e565b610671565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faefdad0f00000000000000000000000000000000000000000000000000000000148061039457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600480546103a9906110bc565b80601f01602080910402602001604051908101604052809291908181526020018280546103d5906110bc565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b5050505050905090565b60003361043a818585610701565b5060019392505050565b60003361045285828561085a565b61045d8585856108e6565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490919061043a90829086906104a290879061108d565b610701565b6104af610afd565b6104b96000610b57565b565b60006104c7858561042c565b95945050505050565b6001600160a01b03841633146105535760405162461bcd60e51b815260206004820152602260248201527f455243323057697468446174613a2063616c6c6572206973206e6f74206f776e60448201527f657200000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61055d8484610bbf565b50505050565b6060600580546103a9906110bc565b61057a610afd565b61055d8484610d3c565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190838110156106215760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161054a565b61045d8286868403610701565b60003361043a8185856108e6565b6001600160a01b03851633141561065d57610657848461062e565b5061066a565b610668858585610444565b505b5050505050565b610679610afd565b6001600160a01b0381166106f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161054a565b6106fe81610b57565b50565b6001600160a01b03831661077c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166107f85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260026020908152604080832093861683529290522054600019811461055d57818110156108d95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161054a565b61055d8484848403610701565b6001600160a01b0383166109625760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0382166109de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03831660009081526001602052604090205481811015610a6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610aa490849061108d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610af091815260200190565b60405180910390a361055d565b6000546001600160a01b031633146104b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054a565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216610c3b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b03821660009081526001602052604090205481811015610cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161054a565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610cf99084906110a5565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161084d565b6001600160a01b038216610d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161054a565b8060036000828254610da4919061108d565b90915550506001600160a01b03821660009081526001602052604081208054839290610dd190849061108d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80356001600160a01b0381168114610e3257600080fd5b919050565b60008083601f840112610e48578182fd5b50813567ffffffffffffffff811115610e5f578182fd5b602083019150836020828501011115610e7757600080fd5b9250929050565b600060208284031215610e8f578081fd5b610e9882610e1b565b9392505050565b60008060408385031215610eb1578081fd5b610eba83610e1b565b9150610ec860208401610e1b565b90509250929050565b600080600060608486031215610ee5578081fd5b610eee84610e1b565b9250610efc60208501610e1b565b9150604084013590509250925092565b600080600080600060808688031215610f23578081fd5b610f2c86610e1b565b9450610f3a60208701610e1b565b935060408601359250606086013567ffffffffffffffff811115610f5c578182fd5b610f6888828901610e37565b969995985093965092949392505050565b60008060408385031215610f8b578182fd5b610f9483610e1b565b946020939093013593505050565b60008060008060608587031215610fb7578384fd5b610fc085610e1b565b935060208501359250604085013567ffffffffffffffff811115610fe2578283fd5b610fee87828801610e37565b95989497509550505050565b60006020828403121561100b578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e98578182fd5b6000602080835283518082850152825b818110156110665785810183015185820160400152820161104a565b818111156110775783604083870101525b50601f01601f1916929092016040019392505050565b600082198211156110a0576110a06110f7565b500190565b6000828210156110b7576110b76110f7565b500390565b600181811c908216806110d057607f821691505b602082108114156110f157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212206dfce5d713e5cea79f1985732d257a191870105f550fe71f71dc3d215d59655b64736f6c6343000804003360806040523480156200001157600080fd5b50604051620022c3380380620022c3833981016040819052620000349162000237565b828262000041336200008e565b815162000056906001906020850190620000de565b5080516200006c906002906020840190620000de565b505081516200008491506008906020840190620000de565b5050505062000317565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000ec90620002c4565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f83011262000195578081fd5b81516001600160401b0380821115620001b257620001b262000301565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000301565b81604052838152602092508683858801011115620001f9578485fd5b8491505b838210156200021c5785820183015181830184015290820190620001fd565b838211156200022d57848385830101525b9695505050505050565b6000806000606084860312156200024c578283fd5b83516001600160401b038082111562000263578485fd5b620002718783880162000184565b9450602086015191508082111562000287578384fd5b620002958783880162000184565b93506040860151915080821115620002ab578283fd5b50620002ba8682870162000184565b9150509250925092565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611f9c80620003276000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637a0101a2116100e3578063b88d4fde1161008c578063d4f1804611610066578063d4f180461461032a578063e985e9c51461033d578063f2fde38b1461037957600080fd5b8063b88d4fde146102f1578063c0ea7a7a14610304578063c87b56dd1461031757600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c557806395d89b41146102d6578063a22cb465146102de57600080fd5b80637a0101a2146102975780637b5eb5641461029f57806383e49c53146102b257600080fd5b806323b872dd116101455780636352211e1161011f5780636352211e1461025b57806370a082311461026e578063715018a61461028f57600080fd5b806323b872dd1461022257806324e18a0b1461023557806342842e0e1461024857600080fd5b8063081812fc11610176578063081812fc146101cf578063095ea7b3146101fa5780631cbf311d1461020f57600080fd5b806301ffc9a71461019257806306fdde03146101ba575b600080fd5b6101a56101a0366004611d3b565b61038c565b60405190151581526020015b60405180910390f35b6101c26103d0565b6040516101b19190611e22565b6101e26101dd366004611d73565b610462565b6040516001600160a01b0390911681526020016101b1565b61020d610208366004611cd2565b610489565b005b61020d61021d366004611bb3565b6105c0565b61020d610230366004611a69565b6105d0565b61020d610243366004611c63565b610657565b61020d610256366004611a69565b610714565b6101e2610269366004611d73565b61072f565b61028161027c366004611a16565b610794565b6040519081526020016101b1565b61020d61082e565b6101c2610842565b61020d6102ad366004611cfb565b610851565b61020d6102c0366004611cfb565b61085b565b6000546001600160a01b03166101e2565b6101c26108e2565b61020d6102ec366004611b8a565b6108f1565b61020d6102ff366004611b11565b610900565b61020d610312366004611aa4565b610988565b6101c2610325366004611d73565b6109d1565b61020d610338366004611c12565b610ae3565b6101a561034b366004611a37565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61020d610387366004611a16565b610b5c565b60006001600160e01b031982167faefe69bf0000000000000000000000000000000000000000000000000000000014806103ca57506103ca82610bec565b92915050565b6060600180546103df90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461040b90611ea4565b80156104585780601f1061042d57610100808354040283529160200191610458565b820191906000526020600020905b81548152906001019060200180831161043b57829003601f168201915b5050505050905090565b600061046d82610c87565b506000908152600560205260409020546001600160a01b031690565b60006104948261072f565b9050806001600160a01b0316836001600160a01b031614156105235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061053f575061053f813361034b565b6105b15760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161051a565b6105bb8383610ceb565b505050565b6105ca84846108f1565b50505050565b6105da3382610d59565b61064c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105bb838383610dd8565b61065f610fa5565b600061066a60075490565b905061067a600780546001019055565b6106bb858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b81518290610702576106fd826106cf61107d565b6106d8856111e6565b6040516020016106e9929190611db7565b604051602081830303815290604052611334565b61070c565b61070c8284611334565b505050505050565b6105bb83838360405180602001604052806000815250610900565b6000818152600360205260408120546001600160a01b0316806103ca5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b60006001600160a01b0382166108125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161051a565b506001600160a01b031660009081526004602052604090205490565b610836610fa5565b61084060006113cb565b565b606061084c61107d565b905090565b6105ca8484610489565b6001600160a01b03841633146108d95760405162461bcd60e51b815260206004820152602360248201527f45524337323157697468446174613a2063616c6c6572206973206e6f74206f7760448201527f6e65720000000000000000000000000000000000000000000000000000000000606482015260840161051a565b6105ca8361141b565b6060600280546103df90611ea4565b6108fc3383836114b6565b5050565b61090a3383610d59565b61097c5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161051a565b6105ca84848484611585565b6109ca85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061090092505050565b5050505050565b6000818152600360205260409020546060906001600160a01b0316610a445760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b60008281526009602052604081208054610a5d90611ea4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8990611ea4565b8015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b5093979650505050505050565b610aeb610fa5565b6000610af660075490565b9050610b06600780546001019055565b610b47848285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fff92505050565b6105ca81610b5361107d565b6106d8846111e6565b610b64610fa5565b6001600160a01b038116610be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610be9816113cb565b50565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610c4f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ca57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146103ca565b6000818152600360205260409020546001600160a01b0316610be95760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161051a565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d208261072f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610d658361072f565b9050806001600160a01b0316846001600160a01b03161480610dac57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610dd05750836001600160a01b0316610dc584610462565b6001600160a01b0316145b949350505050565b826001600160a01b0316610deb8261072f565b6001600160a01b031614610e675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161051a565b6001600160a01b038216610ee25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161051a565b610eed600082610ceb565b6001600160a01b0383166000908152600460205260408120805460019290610f16908490611e61565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f44908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146108405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6110098383611603565b6110166000848484611745565b6105bb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b606060006008805461108e90611ea4565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90611ea4565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905080516000141561115157505060408051808201909152601081527f66697265666c793a2f2f746f6b656e2f00000000000000000000000000000000602082015290565b6008805461115e90611ea4565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90611ea4565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b505050505091505090565b5090565b60608161122657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611250578061123a81611edf565b91506112499050600a83611e4d565b915061122a565b60008167ffffffffffffffff81111561127957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112a3576020820181803683370190505b5090505b8415610dd0576112b8600183611e61565b91506112c5600a86611efa565b6112d0906030611e35565b60f81b8183815181106112f357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061132d600a86611e4d565b94506112a7565b61133c610fa5565b6000828152600360205260409020546001600160a01b03166113ac5760405162461bcd60e51b8152602060048201526024808201527f45524337323157697468446174613a20546f6b656e20646f6573206e6f7420656044820152631e1a5cdd60e21b606482015260840161051a565b600082815260096020908152604090912082516105bb9284019061189d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006114268261072f565b9050611433600083610ceb565b6001600160a01b038116600090815260046020526040812080546001929061145c908490611e61565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b031614156115185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161051a565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611590848484610dd8565b61159c84848484611745565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b6001600160a01b0382166116595760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161051a565b6000818152600360205260409020546001600160a01b0316156116be5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161051a565b6001600160a01b03821660009081526004602052604081208054600192906116e7908490611e35565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561189257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611789903390899088908890600401611de6565b602060405180830381600087803b1580156117a357600080fd5b505af19250505080156117d3575060408051601f3d908101601f191682019092526117d091810190611d57565b60015b611878573d808015611801576040519150601f19603f3d011682016040523d82523d6000602084013e611806565b606091505b5080516118705760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161051a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dd0565b506001949350505050565b8280546118a990611ea4565b90600052602060002090601f0160209004810192826118cb5760008555611911565b82601f106118e457805160ff1916838001178555611911565b82800160010185558215611911579182015b828111156119115782518255916020019190600101906118f6565b506111e29291505b808211156111e25760008155600101611919565b600067ffffffffffffffff8084111561194857611948611f3a565b604051601f8501601f19908116603f0116810190828211818310171561197057611970611f3a565b8160405280935085815286868601111561198957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146119ba57600080fd5b919050565b803580151581146119ba57600080fd5b60008083601f8401126119e0578182fd5b50813567ffffffffffffffff8111156119f7578182fd5b602083019150836020828501011115611a0f57600080fd5b9250929050565b600060208284031215611a27578081fd5b611a30826119a3565b9392505050565b60008060408385031215611a49578081fd5b611a52836119a3565b9150611a60602084016119a3565b90509250929050565b600080600060608486031215611a7d578081fd5b611a86846119a3565b9250611a94602085016119a3565b9150604084013590509250925092565b600080600080600060808688031215611abb578081fd5b611ac4866119a3565b9450611ad2602087016119a3565b935060408601359250606086013567ffffffffffffffff811115611af4578182fd5b611b00888289016119cf565b969995985093965092949392505050565b60008060008060808587031215611b26578384fd5b611b2f856119a3565b9350611b3d602086016119a3565b925060408501359150606085013567ffffffffffffffff811115611b5f578182fd5b8501601f81018713611b6f578182fd5b611b7e8782356020840161192d565b91505092959194509250565b60008060408385031215611b9c578182fd5b611ba5836119a3565b9150611a60602084016119bf565b60008060008060608587031215611bc8578384fd5b611bd1856119a3565b9350611bdf602086016119bf565b9250604085013567ffffffffffffffff811115611bfa578283fd5b611c06878288016119cf565b95989497509550505050565b600080600060408486031215611c26578283fd5b611c2f846119a3565b9250602084013567ffffffffffffffff811115611c4a578283fd5b611c56868287016119cf565b9497909650939450505050565b60008060008060608587031215611c78578384fd5b611c81856119a3565b9350602085013567ffffffffffffffff80821115611c9d578485fd5b611ca9888389016119cf565b90955093506040870135915080821115611cc1578283fd5b508501601f81018713611b6f578182fd5b60008060408385031215611ce4578182fd5b611ced836119a3565b946020939093013593505050565b60008060008060608587031215611d10578182fd5b611d19856119a3565b935060208501359250604085013567ffffffffffffffff811115611bfa578283fd5b600060208284031215611d4c578081fd5b8135611a3081611f50565b600060208284031215611d68578081fd5b8151611a3081611f50565b600060208284031215611d84578081fd5b5035919050565b60008151808452611da3816020860160208601611e78565b601f01601f19169290920160200192915050565b60008351611dc9818460208801611e78565b835190830190611ddd818360208801611e78565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611e186080830184611d8b565b9695505050505050565b602081526000611a306020830184611d8b565b60008219821115611e4857611e48611f0e565b500190565b600082611e5c57611e5c611f24565b500490565b600082821015611e7357611e73611f0e565b500390565b60005b83811015611e93578181015183820152602001611e7b565b838111156105ca5750506000910152565b600181811c90821680611eb857607f821691505b60208210811415611ed957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ef357611ef3611f0e565b5060010190565b600082611f0957611f09611f24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610be957600080fdfea26469706673582212203d6e700f8a0b10796db56246303859e2d579a99be49f8d1d81068a8040f00c0e64736f6c63430008040033a264697066735822122065d59ca45b6f4a8ed7d7a84951eae73c8ae623c27568389b80c1b68ad8a8876664736f6c63430008040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/tokens/abimapper.service.ts b/src/tokens/abimapper.service.ts index 3317fe0..b5d0340 100644 --- a/src/tokens/abimapper.service.ts +++ b/src/tokens/abimapper.service.ts @@ -18,12 +18,13 @@ import { BadRequestException, Injectable, Logger } from '@nestjs/common'; import LRUCache from 'lru-cache'; import { Context } from '../request-context/request-context.decorator'; import ERC20NoDataABI from '../abi/ERC20NoData.json'; -import ERC20NoDataOldABI from '../abi/ERC20NoDataOld.json'; +import ERC20NoDataLegacyABI from '../abi/ERC20NoDataLegacy.json'; import ERC20WithDataABI from '../abi/ERC20WithData.json'; import ERC721NoDataABI from '../abi/ERC721NoData.json'; -import ERC721NoDataOldABI from '../abi/ERC721NoDataOld.json'; -import ERC721WithDataABI from '../abi/ERC721WithData.json'; -import ERC721WithDataOldABI from '../abi/ERC721WithDataOld.json'; +import ERC721NoDataLegacyABI from '../abi/ERC721NoDataLegacy.json'; +import ERC721WithDataV2ABI from '../abi/ERC721WithDataV2.json'; +import ERC721WithDataV1bABI from '../abi/ERC721WithDataV1b.json'; +import ERC721WithDataV1aABI from '../abi/ERC721WithDataV1a.json'; import TokenFactoryABI from '../abi/TokenFactory.json'; import { BlockchainConnectorService } from './blockchain.service'; import { SupportsInterface } from './erc165'; @@ -39,16 +40,15 @@ import { } from './tokens.interfaces'; import { encodeHex } from './tokens.util'; -// The current version of IERC20WithData +// Interface identifier for IERC20WithData const ERC20WithDataIID = '0xaefdad0f'; -// The current version of IERC721WithData -const ERC721WithDataIID = '0x8706707d'; +// Interface identifier for IERC721WithData +const ERC721WithDataV2IID = '0xaefe69bf'; // current version +const ERC721WithDataV1bIID = '0x8706707d'; // no auto-indexing +const ERC721WithDataV1aIID = '0xb2429c12'; // no mintWithURI or baseTokenUri -// The previous version of IERC721WithData (no mintWithURI or baseTokenUri) -const ERC721WithDataOldIID = '0xb2429c12'; - -// The current version of ITokenFactory +// Interface identifier for ITokenFactory const TokenFactoryIID = '0x83a74a0c'; const tokenCreateMethod = 'create'; @@ -70,11 +70,31 @@ export class AbiMapperService { this.legacyERC721 = legacyERC721; } - getTokenSchema(type: TokenType, withData = true): ContractSchemaStrings { - if (type === TokenType.FUNGIBLE) { - return withData ? 'ERC20WithData' : 'ERC20NoData'; + async getTokenSchema( + ctx: Context, + type: TokenType, + address: string, + ): Promise { + if (type === TokenType.NONFUNGIBLE) { + if (await this.supportsInterface(ctx, address, ERC721WithDataV2IID)) { + return 'ERC721WithDataV2'; + } else if ( + (await this.supportsInterface(ctx, address, ERC721WithDataV1bIID)) || + (await this.supportsInterface(ctx, address, ERC721WithDataV1aIID)) + ) { + // Note: no change was introduced in schema string for 1a vs. 1b + // This must be sorted out with a secondary check in getAbi() + return 'ERC721WithData'; + } else { + return 'ERC721NoData'; + } + } else { + if (await this.supportsInterface(ctx, address, ERC20WithDataIID)) { + return 'ERC20WithData'; + } else { + return 'ERC20NoData'; + } } - return withData ? 'ERC721WithData' : 'ERC721NoData'; } allInvokeMethods(abi: IAbiMethod[], isFungible: boolean) { @@ -99,22 +119,22 @@ export class AbiMapperService { return events.map(event => event.name); } - getAbi(schema: ContractSchemaStrings, uriSupport = true) { + async getAbi(ctx: Context, schema: ContractSchemaStrings, address: string) { switch (schema) { + case 'ERC721WithDataV2': + return ERC721WithDataV2ABI.abi; case 'ERC721WithData': - if (uriSupport === false) { - // The newer ERC721WithData schema is a strict superset of the old, with a - // few new methods around URIs. Assume the URI methods exist, unless - // uriSupport is explicitly set to false. - return ERC721WithDataOldABI.abi; - } - return ERC721WithDataABI.abi; + // This schema string was reused for two versions of the interface, + // so we have to check each time (but the results are cached for efficiency) + return (await this.supportsInterface(ctx, address, ERC721WithDataV1bIID)) + ? ERC721WithDataV1bABI.abi + : ERC721WithDataV1aABI.abi; case 'ERC721NoData': - return this.legacyERC721 ? ERC721NoDataOldABI.abi : ERC721NoDataABI.abi; + return this.legacyERC721 ? ERC721NoDataLegacyABI.abi : ERC721NoDataABI.abi; case 'ERC20WithData': return ERC20WithDataABI.abi; case 'ERC20NoData': - return this.legacyERC20 ? ERC20NoDataOldABI.abi : ERC20NoDataABI.abi; + return this.legacyERC20 ? ERC20NoDataLegacyABI.abi : ERC20NoDataABI.abi; default: throw new BadRequestException(`Unknown schema: ${schema}`); } @@ -167,7 +187,7 @@ export class AbiMapperService { return TokenFactoryABI.abi.find(m => m.name === tokenCreateEvent); } - getCreateMethodAndParams(dto: TokenPool, uriSupport = true) { + async getCreateMethodAndParams(ctx: Context, address: string, dto: TokenPool) { const isFungible = dto.type === TokenType.FUNGIBLE; const encodedData = encodeHex(dto.data ?? ''); const method = this.getCreateMethod(); @@ -175,6 +195,7 @@ export class AbiMapperService { throw new BadRequestException('Failed to parse factory contract ABI'); } const params = [dto.name, dto.symbol, isFungible, encodedData]; + const uriSupport = await this.supportsInterface(ctx, address, TokenFactoryIID); if (uriSupport) { // supply empty string if URI isn't provided // the contract itself handles empty base URIs appropriately @@ -194,44 +215,17 @@ export class AbiMapperService { try { const result = await this.blockchain.query(ctx, address, SupportsInterface, [iid]); support = result.output === true; + this.logger.log(`Querying interface '${iid}' support on contract '${address}': ${support}`); } catch (err) { - // do nothing + this.logger.log( + `Querying interface '${iid}' support on contract '${address}': failed (assuming false)`, + ); } this.supportCache.set(cacheKey, support); return support; } - async supportsData(ctx: Context, address: string, type: TokenType) { - let result = false; - switch (type) { - case TokenType.NONFUNGIBLE: - result = - (await this.supportsInterface(ctx, address, ERC721WithDataIID)) || - (await this.supportsInterface(ctx, address, ERC721WithDataOldIID)); - break; - case TokenType.FUNGIBLE: - default: - result = await this.supportsInterface(ctx, address, ERC20WithDataIID); - break; - } - - this.logger.log(`Querying extra data support on contract '${address}': ${result}`); - return result; - } - - async supportsMintWithUri(ctx: Context, address: string): Promise { - const result = await this.supportsInterface(ctx, address, ERC721WithDataIID); - this.logger.log(`Querying URI support on contract '${address}': ${result}`); - return result; - } - - async supportsFactoryWithUri(ctx: Context, address: string): Promise { - const result = await this.supportsInterface(ctx, address, TokenFactoryIID); - this.logger.log(`Querying URI support on contract '${address}': ${result}`); - return result; - } - async getDecimals(ctx: Context, address: string) { const response = await this.blockchain.query(ctx, address, Decimals, []); return parseInt(response.output) || 0; diff --git a/src/tokens/erc721.ts b/src/tokens/erc721.ts index 6fce2ed..4af52b4 100644 --- a/src/tokens/erc721.ts +++ b/src/tokens/erc721.ts @@ -228,7 +228,8 @@ export const DynamicMethods: Record = { name: 'burnWithData', inputs: [{ type: 'address' }, { type: 'uint256' }, { type: 'bytes' }], map: (dto: TokenBurn) => { - return [dto.from, getTokenID(dto), encodeHex(dto.data ?? '')]; + checkAmount(dto); + return [dto.from, dto.tokenIndex, encodeHex(dto.data ?? '')]; }, }, { @@ -236,7 +237,8 @@ export const DynamicMethods: Record = { name: 'burn', inputs: [{ type: 'uint256' }], map: (dto: TokenBurn) => { - return [getTokenID(dto)]; + checkAmount(dto); + return [dto.tokenIndex]; }, }, { @@ -244,7 +246,8 @@ export const DynamicMethods: Record = { name: 'burn', inputs: [{ type: 'address' }, { type: 'uint256' }], map: (dto: TokenBurn) => { - return [dto.from, getTokenID(dto)]; + checkAmount(dto); + return [dto.from, dto.tokenIndex]; }, }, ], @@ -253,25 +256,37 @@ export const DynamicMethods: Record = { { // Source: FireFly extension name: 'mintWithURI', + inputs: [{ type: 'address' }, { type: 'bytes' }, { type: 'string' }], + map: (dto: TokenMint) => { + checkAmount(dto); + return [dto.to, encodeHex(dto.data ?? ''), dto.uri ?? '']; + }, + }, + { + // Source: FireFly extension (without auto-index) + name: 'mintWithURI', inputs: [{ type: 'address' }, { type: 'uint256' }, { type: 'bytes' }, { type: 'string' }], map: (dto: TokenMint) => { - return [dto.to, getTokenID(dto), encodeHex(dto.data ?? ''), dto.uri]; + checkAmount(dto); + return [dto.to, dto.tokenIndex, encodeHex(dto.data ?? ''), dto.uri ?? '']; }, }, { // Source: FireFly extension name: 'mintWithData', - inputs: [{ type: 'address' }, { type: 'uint256' }, { type: 'bytes' }], + inputs: [{ type: 'address' }, { type: 'bytes' }], map: (dto: TokenMint) => { - return [dto.to, getTokenID(dto), encodeHex(dto.data ?? '')]; + checkAmount(dto); + return [dto.to, encodeHex(dto.data ?? '')]; }, }, { - // Source: OpenZeppelin extension - name: 'safeMint', - inputs: [{ type: 'address' }, { type: 'uint256' }], + // Source: FireFly extension (without auto-index) + name: 'mintWithData', + inputs: [{ type: 'address' }, { type: 'uint256' }, { type: 'bytes' }], map: (dto: TokenMint) => { - return [dto.to, getTokenID(dto)]; + checkAmount(dto); + return [dto.to, dto.tokenIndex, encodeHex(dto.data ?? '')]; }, }, { @@ -279,15 +294,26 @@ export const DynamicMethods: Record = { name: 'safeMint', inputs: [{ type: 'address' }], map: (dto: TokenMint) => { + checkAmount(dto); return [dto.to]; }, }, + { + // Source: OpenZeppelin extension (without auto-index) + name: 'safeMint', + inputs: [{ type: 'address' }, { type: 'uint256' }], + map: (dto: TokenMint) => { + checkAmount(dto); + return [dto.to, dto.tokenIndex]; + }, + }, { // Source: Legacy sample contract name: 'mint', inputs: [{ type: 'address' }, { type: 'uint256' }], map: (dto: TokenMint) => { - return [dto.to, getTokenID(dto)]; + checkAmount(dto); + return [dto.to, dto.tokenIndex]; }, }, ], @@ -298,7 +324,8 @@ export const DynamicMethods: Record = { name: 'transferWithData', inputs: [{ type: 'address' }, { type: 'address' }, { type: 'uint256' }, { type: 'bytes' }], map: (dto: TokenTransfer) => { - return [dto.from, dto.to, getTokenID(dto), encodeHex(dto.data ?? '')]; + checkAmount(dto); + return [dto.from, dto.to, dto.tokenIndex, encodeHex(dto.data ?? '')]; }, }, { @@ -306,7 +333,8 @@ export const DynamicMethods: Record = { name: 'safeTransferFrom', inputs: [{ type: 'address' }, { type: 'address' }, { type: 'uint256' }, { type: 'bytes' }], map: (dto: TokenTransfer) => { - return [dto.from, dto.to, getTokenID(dto), encodeHex(dto.data ?? '')]; + checkAmount(dto); + return [dto.from, dto.to, dto.tokenIndex, encodeHex(dto.data ?? '')]; }, }, { @@ -314,15 +342,15 @@ export const DynamicMethods: Record = { name: 'safeTransferFrom', inputs: [{ type: 'address' }, { type: 'address' }, { type: 'uint256' }], map: (dto: TokenTransfer) => { - return [dto.from, dto.to, getTokenID(dto)]; + checkAmount(dto); + return [dto.from, dto.to, dto.tokenIndex]; }, }, ], }; -function getTokenID(dto: TokenMint | TokenTransfer | TokenBurn): string | undefined { +function checkAmount(dto: TokenMint | TokenTransfer | TokenBurn) { if (dto.amount !== undefined && dto.amount !== '1') { throw new BadRequestException('Amount for nonfungible tokens must be 1'); } - return dto.tokenIndex; } diff --git a/src/tokens/tokens.interfaces.ts b/src/tokens/tokens.interfaces.ts index 39ea7c5..fa5a2dd 100644 --- a/src/tokens/tokens.interfaces.ts +++ b/src/tokens/tokens.interfaces.ts @@ -80,6 +80,7 @@ export class AsyncResponse { export type ContractSchemaStrings = | 'ERC20WithData' | 'ERC20NoData' + | 'ERC721WithDataV2' | 'ERC721WithData' | 'ERC721NoData'; diff --git a/src/tokens/tokens.listener.ts b/src/tokens/tokens.listener.ts index 055986a..23cd6e6 100644 --- a/src/tokens/tokens.listener.ts +++ b/src/tokens/tokens.listener.ts @@ -139,8 +139,7 @@ export class TokenListener implements EventListener { const decimals = output.is_fungible ? await this.mapper.getDecimals(ctx, output.contract_address) : 0; - const withData = await this.mapper.supportsData(ctx, output.contract_address, type); - const schema = this.mapper.getTokenSchema(type, withData); + const schema = await this.mapper.getTokenSchema(ctx, type, output.contract_address); const poolLocator: IValidPoolLocator = { address: output.contract_address.toLowerCase(), type, diff --git a/src/tokens/tokens.service.spec.ts b/src/tokens/tokens.service.spec.ts index 790e06a..dbde27b 100644 --- a/src/tokens/tokens.service.spec.ts +++ b/src/tokens/tokens.service.spec.ts @@ -23,7 +23,8 @@ import { newContext } from '../request-context/request-context.decorator'; import ERC20NoDataABI from '../abi/ERC20NoData.json'; import ERC20WithDataABI from '../abi/ERC20WithData.json'; import ERC721NoDataABI from '../abi/ERC721NoData.json'; -import ERC721WithDataABI from '../abi/ERC721WithData.json'; +import ERC721WithDataV1ABI from '../abi/ERC721WithDataV1b.json'; +import ERC721WithDataV2ABI from '../abi/ERC721WithDataV2.json'; import { EventStream, EventStreamReply, @@ -50,13 +51,6 @@ import { } from './tokens.interfaces'; import { TokensService } from './tokens.service'; -export const abiTypeMap = { - ERC20NoData: ERC20NoDataABI.abi, - ERC20WithData: ERC20WithDataABI.abi, - ERC721NoData: ERC721NoDataABI.abi, - ERC721WithData: ERC721WithDataABI.abi, -}; - const BASE_URL = 'http://eth'; const CONTRACT_ADDRESS = '0x123456'; const IDENTITY = '0x1'; @@ -72,8 +66,10 @@ const ERC20_WITH_DATA_SCHEMA = 'ERC20WithData'; const ERC20_WITH_DATA_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC20_WITH_DATA_SCHEMA}&type=${TokenType.FUNGIBLE}`; const ERC721_NO_DATA_SCHEMA = 'ERC721NoData'; const ERC721_NO_DATA_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC721_NO_DATA_SCHEMA}&type=${TokenType.NONFUNGIBLE}`; -const ERC721_WITH_DATA_SCHEMA = 'ERC721WithData'; +const ERC721_WITH_DATA_SCHEMA = 'ERC721WithDataV2'; const ERC721_WITH_DATA_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC721_WITH_DATA_SCHEMA}&type=${TokenType.NONFUNGIBLE}`; +const ERC721_WITH_DATA_V1_SCHEMA = 'ERC721WithData'; +const ERC721_WITH_DATA_V1_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC721_WITH_DATA_V1_SCHEMA}&type=${TokenType.NONFUNGIBLE}`; const ERC20_MINT_NO_DATA = 'mint'; const ERC20_TRANSFER_NO_DATA = 'transfer'; @@ -119,7 +115,7 @@ const abiMethodMap = { ERC20NoData: ERC20NoDataABI.abi as IAbiMethod[], ERC20WithData: ERC20WithDataABI.abi as IAbiMethod[], ERC721NoData: ERC721NoDataABI.abi as IAbiMethod[], - ERC721WithData: ERC721WithDataABI.abi as IAbiMethod[], + ERC721WithData: ERC721WithDataV2ABI.abi as IAbiMethod[], }; class FakeObservable { @@ -318,13 +314,13 @@ describe('TokensService', () => { expect(eventstream.getOrCreateSubscription).toHaveBeenCalledWith( ctx, BASE_URL, - abiTypeMap.ERC20NoData.find(abi => abi.name === TRANSFER_EVENT) as IAbiMethod, + ERC20NoDataABI.abi.find(abi => abi.name === TRANSFER_EVENT) as IAbiMethod, 'es-4297d77c-0c33-49dc-4e5b-617e0b68fbab', `fft:${ERC20_NO_DATA_POOL_ID}:${TRANSFER_EVENT}:ns1`, CONTRACT_ADDRESS, [...METHODS_NO_DATA, ERC20_TRANSFER_NO_DATA, ERC20_TRANSFER_FROM_NO_DATA] .map(name => { - return abiTypeMap.ERC20NoData.find(abi => abi.name === name); + return ERC20NoDataABI.abi.find(abi => abi.name === name); }) .filter(abi => abi !== undefined), '0', @@ -350,7 +346,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20NoData.find(abi => abi.name === ERC20_MINT_NO_DATA) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === ERC20_MINT_NO_DATA) as IAbiMethod, params: ['0x123', '20'], }; @@ -386,9 +382,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20NoData.find( - abi => abi.name === ERC20_TRANSFER_NO_DATA, - ) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === ERC20_TRANSFER_NO_DATA) as IAbiMethod, params: ['0x123', '20'], }; @@ -423,7 +417,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20NoData.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, params: ['20'], }; @@ -576,7 +570,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20WithData.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, params: ['0x123', '20', '0x00'], }; @@ -612,7 +606,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20WithData.find(abi => abi.name === TRANSFER_WITH_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === TRANSFER_WITH_DATA) as IAbiMethod, params: [IDENTITY, '0x123', '20', '0x00'], }; @@ -647,7 +641,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC20WithData.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, params: [IDENTITY, '20', '0x00'], }; @@ -678,6 +672,7 @@ describe('TokensService', () => { symbol: SYMBOL, }; + mockURIQuery(false); mockURIQuery(false); mockPoolQuery(false, false, true); @@ -735,7 +730,7 @@ describe('TokensService', () => { const methods: IAbiMethod[] = []; [...METHODS_NO_DATA, ERC721_TRANSFER_NO_DATA].forEach(name => { - methods.push(...abiTypeMap.ERC721NoData.filter(abi => abi.name === name).reverse()); + methods.push(...ERC721NoDataABI.abi.filter(abi => abi.name === name).reverse()); }); expect(eventstream.getOrCreateSubscription).toHaveBeenCalledWith( @@ -755,7 +750,6 @@ describe('TokensService', () => { const request: TokenMint = { amount: '2', - tokenIndex: '721', signer: IDENTITY, poolLocator: ERC721_NO_DATA_POOL_ID, to: '0x123', @@ -772,7 +766,6 @@ describe('TokensService', () => { }; const request: TokenMint = { - tokenIndex: '721', signer: IDENTITY, poolLocator: ERC721_NO_DATA_POOL_ID, to: '0x123', @@ -784,8 +777,8 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721NoData.find(abi => abi.name === ERC721_MINT_NO_DATA) as IAbiMethod, - params: ['0x123', '721'], + method: ERC721NoDataABI.abi.find(abi => abi.name === ERC721_MINT_NO_DATA) as IAbiMethod, + params: ['0x123'], }; const response: EthConnectAsyncResponse = { @@ -820,7 +813,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721NoData.find( + method: ERC721NoDataABI.abi.find( abi => abi.name === ERC721_TRANSFER_NO_DATA && abi.inputs.length === 4, ) as IAbiMethod, params: [IDENTITY, '0x123', '721', '0x00'], @@ -857,7 +850,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721NoData.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, + method: ERC721NoDataABI.abi.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, params: ['721'], }; @@ -909,40 +902,6 @@ describe('TokensService', () => { }); }); - it('should return ERC721WithData pool details successfully - explicit withData config', async () => { - const ctx = newContext(); - - const request: TokenPool = { - type: TokenType.NONFUNGIBLE, - requestId: REQUEST, - signer: IDENTITY, - data: `{"tx":${TX}}`, - config: { address: CONTRACT_ADDRESS }, - name: NAME, - symbol: SYMBOL, - }; - - mockURIQuery(false); - mockPoolQuery(true, false, true); - - await service.createPool(ctx, request).then(resp => { - expect(resp).toEqual({ - data: `{"tx":${TX}}`, - poolLocator: ERC721_WITH_DATA_POOL_ID, - standard: 'ERC721', - interfaceFormat: InterfaceFormat.ABI, - type: 'nonfungible', - symbol: SYMBOL, - decimals: 0, - info: { - name: NAME, - address: CONTRACT_ADDRESS, - schema: ERC721_WITH_DATA_SCHEMA, - }, - } as TokenPoolEvent); - }); - }); - it('should activate ERC721WithData pool correctly and return correct values', async () => { const ctx = newContext(); @@ -979,13 +938,13 @@ describe('TokensService', () => { const methods: IAbiMethod[] = []; [...METHODS_WITH_DATA, ERC721_TRANSFER_NO_DATA].forEach(name => { - methods.push(...abiTypeMap.ERC721WithData.filter(abi => abi.name === name).reverse()); + methods.push(...ERC721WithDataV2ABI.abi.filter(abi => abi.name === name).reverse()); }); expect(eventstream.getOrCreateSubscription).toHaveBeenCalledWith( ctx, BASE_URL, - abiTypeMap.ERC721WithData.find(abi => abi.name === TRANSFER_EVENT) as IAbiMethod, + ERC721WithDataV2ABI.abi.find(abi => abi.name === TRANSFER_EVENT) as IAbiMethod, 'es-4297d77c-0c33-49dc-4e5b-617e0b68fbab', `fft:${ERC721_WITH_DATA_POOL_ID}:${TRANSFER_EVENT}:ns1`, CONTRACT_ADDRESS, @@ -998,7 +957,6 @@ describe('TokensService', () => { const ctx = newContext(); const request: TokenMint = { amount: '2', - tokenIndex: '721', signer: IDENTITY, poolLocator: ERC721_WITH_DATA_POOL_ID, to: '0x123', @@ -1017,7 +975,7 @@ describe('TokensService', () => { const request: TokenMint = { tokenIndex: '721', signer: IDENTITY, - poolLocator: ERC721_WITH_DATA_POOL_ID, + poolLocator: ERC721_WITH_DATA_V1_POOL_ID, to: '0x123', }; @@ -1027,7 +985,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721WithData.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, + method: ERC721WithDataV1ABI.abi.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, params: ['0x123', '721', '0x00'], }; @@ -1036,10 +994,13 @@ describe('TokensService', () => { sent: true, }; - http.post = jest.fn(() => new FakeObservable(response)); + mockURIQuery(false); + http.post.mockReturnValueOnce(new FakeObservable(response)); + await expect(service.mint(ctx, request)).resolves.toEqual({ id: 'responseId', } as AsyncResponse); + expect(http.post).toHaveBeenCalledWith(BASE_URL, mockEthConnectRequest, { headers }); }); @@ -1052,20 +1013,47 @@ describe('TokensService', () => { const request: TokenMint = { tokenIndex: '721', signer: IDENTITY, - poolLocator: ERC721_WITH_DATA_POOL_ID, + poolLocator: ERC721_WITH_DATA_V1_POOL_ID, to: '0x123', uri: 'ipfs://CID', }; - const mockEthConnectURIQuery: EthConnectMsgRequest = { + const mockEthConnectRequest: EthConnectMsgRequest = { headers: { - type: 'Query', + type: 'SendTransaction', }, + from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721WithData.find( - abi => abi.name === SUPPORTS_INTERFACE, - ) as IAbiMethod, - params: ['0x8706707d'], + method: ERC721WithDataV1ABI.abi.find(abi => abi.name === MINT_WITH_URI) as IAbiMethod, + params: ['0x123', '721', '0x00', 'ipfs://CID'], + }; + + const response: EthConnectAsyncResponse = { + id: 'responseId', + sent: true, + }; + + mockURIQuery(true); + http.post.mockReturnValueOnce(new FakeObservable(response)); + + await expect(service.mint(ctx, request)).resolves.toEqual({ + id: 'responseId', + } as AsyncResponse); + + expect(http.post).toHaveBeenCalledWith(BASE_URL, mockEthConnectRequest, { headers }); + }); + + it('should mint ERC721WithData token with correct abi, custom uri, auto-indexing, and inputs', async () => { + const ctx = newContext(); + const headers = { + 'x-fireflyrequestid': ctx.requestId, + }; + + const request: TokenMint = { + signer: IDENTITY, + poolLocator: ERC721_WITH_DATA_POOL_ID, + to: '0x123', + uri: 'ipfs://CID', }; const mockEthConnectRequest: EthConnectMsgRequest = { @@ -1074,8 +1062,8 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721WithData.find(abi => abi.name === MINT_WITH_URI) as IAbiMethod, - params: ['0x123', '721', '0x00', 'ipfs://CID'], + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === MINT_WITH_URI) as IAbiMethod, + params: ['0x123', '0x00', 'ipfs://CID'], }; const response: EthConnectAsyncResponse = { @@ -1083,14 +1071,12 @@ describe('TokensService', () => { sent: true, }; - mockURIQuery(true); - http.post.mockReturnValueOnce(new FakeObservable(response)); + await expect(service.mint(ctx, request)).resolves.toEqual({ id: 'responseId', } as AsyncResponse); - expect(http.post).toHaveBeenCalledWith(BASE_URL, mockEthConnectURIQuery, { headers }); expect(http.post).toHaveBeenCalledWith(BASE_URL, mockEthConnectRequest, { headers }); }); @@ -1114,9 +1100,7 @@ describe('TokensService', () => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiTypeMap.ERC721WithData.find( - abi => abi.name === TRANSFER_WITH_DATA, - ) as IAbiMethod, + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === TRANSFER_WITH_DATA) as IAbiMethod, params: [IDENTITY, '0x123', '721', '0x00'], }; diff --git a/src/tokens/tokens.service.ts b/src/tokens/tokens.service.ts index f22d6b9..f51a324 100644 --- a/src/tokens/tokens.service.ts +++ b/src/tokens/tokens.service.ts @@ -248,8 +248,7 @@ export class TokensService { address: string, dto: TokenPool, ): Promise { - const withData = await this.mapper.supportsData(ctx, address, dto.type); - const schema = this.mapper.getTokenSchema(dto.type, withData); + const schema = await this.mapper.getTokenSchema(ctx, dto.type, address); const poolLocator: IPoolLocator = { address: address.toLowerCase(), type: dto.type, @@ -283,9 +282,11 @@ export class TokensService { } private async createFromFactory(ctx: Context, dto: TokenPool): Promise { - const supportsUri = await this.mapper.supportsFactoryWithUri(ctx, this.factoryAddress); - const { method, params } = this.mapper.getCreateMethodAndParams(dto, supportsUri); - + const { method, params } = await this.mapper.getCreateMethodAndParams( + ctx, + this.factoryAddress, + dto, + ); const response = await this.blockchain.sendTransaction( ctx, dto.signer, @@ -311,7 +312,7 @@ export class TokensService { throw new BadRequestException('Invalid pool locator'); } - const abi = this.mapper.getAbi(poolLocator.schema); + const abi = await this.mapper.getAbi(ctx, poolLocator.schema, poolLocator.address); const possibleMethods = this.mapper.allInvokeMethods( abi, poolLocator.type === TokenType.FUNGIBLE, @@ -404,19 +405,15 @@ export class TokensService { }; } - private async getAbiForMint(ctx: Context, poolLocator: IValidPoolLocator, dto: TokenMint) { - const supportsUri = - dto.uri !== undefined && (await this.mapper.supportsMintWithUri(ctx, poolLocator.address)); - return this.mapper.getAbi(poolLocator.schema, supportsUri); - } - async mint(ctx: Context, dto: TokenMint): Promise { const poolLocator = unpackPoolLocator(dto.poolLocator); if (!validatePoolLocator(poolLocator)) { throw new BadRequestException('Invalid pool locator'); } - const abi = dto.interface?.methods || (await this.getAbiForMint(ctx, poolLocator, dto)); + const abi = + dto.interface?.methods || + (await this.mapper.getAbi(ctx, poolLocator.schema, poolLocator.address)); const { method, params } = this.mapper.getMethodAndParams( abi, poolLocator.type === TokenType.FUNGIBLE, @@ -440,7 +437,9 @@ export class TokensService { throw new BadRequestException('Invalid pool locator'); } - const abi = dto.interface?.methods || this.mapper.getAbi(poolLocator.schema); + const abi = + dto.interface?.methods || + (await this.mapper.getAbi(ctx, poolLocator.schema, poolLocator.address)); const { method, params } = this.mapper.getMethodAndParams( abi, poolLocator.type === TokenType.FUNGIBLE, @@ -464,7 +463,9 @@ export class TokensService { throw new BadRequestException('Invalid pool locator'); } - const abi = dto.interface?.methods || this.mapper.getAbi(poolLocator.schema); + const abi = + dto.interface?.methods || + (await this.mapper.getAbi(ctx, poolLocator.schema, poolLocator.address)); const { method, params } = this.mapper.getMethodAndParams( abi, poolLocator.type === TokenType.FUNGIBLE, @@ -488,7 +489,9 @@ export class TokensService { throw new BadRequestException('Invalid pool locator'); } - const abi = dto.interface?.methods || this.mapper.getAbi(poolLocator.schema); + const abi = + dto.interface?.methods || + (await this.mapper.getAbi(ctx, poolLocator.schema, poolLocator.address)); const { method, params } = this.mapper.getMethodAndParams( abi, poolLocator.type === TokenType.FUNGIBLE, diff --git a/test/suites/erc20.ts b/test/suites/erc20.ts index 7e7e9d8..621e247 100644 --- a/test/suites/erc20.ts +++ b/test/suites/erc20.ts @@ -63,11 +63,6 @@ const TRANSFER_WITH_DATA = 'transferWithData'; const BURN_WITH_DATA = 'burnWithData'; const APPROVE_WITH_DATA = 'approveWithData'; -const abiMethodMap = { - ERC20WithData: ERC20WithDataABI.abi as IAbiMethod[], - ERC20NoData: ERC20NoDataABI.abi as IAbiMethod[], -}; - export default (context: TestContext) => { const mockPoolQuery = (withData: boolean | undefined) => { if (withData !== undefined) { @@ -196,7 +191,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20WithData.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, params: ['0x123', '20', '0x00'], }; @@ -228,9 +223,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20WithData.find( - abi => abi.name === TRANSFER_WITH_DATA, - ) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === TRANSFER_WITH_DATA) as IAbiMethod, params: [IDENTITY, '0x123', '20', '0x00'], }; @@ -261,7 +254,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20WithData.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, params: [IDENTITY, '20', '0x00'], }; @@ -293,9 +286,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20WithData.find( - abi => abi.name === APPROVE_WITH_DATA, - ) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === APPROVE_WITH_DATA) as IAbiMethod, params: ['2', '100', '0x00'], }; @@ -411,7 +402,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20NoData.find(abi => abi.name === MINT_NO_DATA) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === MINT_NO_DATA) as IAbiMethod, params: ['0x123', '20'], }; @@ -443,7 +434,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20NoData.find(abi => abi.name === TRANSFER_NO_DATA) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === TRANSFER_NO_DATA) as IAbiMethod, params: ['0x123', '20'], }; @@ -474,7 +465,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20NoData.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, + method: ERC20NoDataABI.abi.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, params: ['20'], }; @@ -506,7 +497,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC20WithData.find(abi => abi.name === APPROVE_NO_DATA) as IAbiMethod, + method: ERC20WithDataABI.abi.find(abi => abi.name === APPROVE_NO_DATA) as IAbiMethod, params: ['2', '100'], }; diff --git a/test/suites/erc721.ts b/test/suites/erc721.ts index 86eb866..9a004bb 100644 --- a/test/suites/erc721.ts +++ b/test/suites/erc721.ts @@ -15,7 +15,7 @@ // limitations under the License. import ERC721NoDataABI from '../../src/abi/ERC721NoData.json'; -import ERC721WithDataABI from '../../src/abi/ERC721WithData.json'; +import ERC721WithDataV2ABI from '../../src/abi/ERC721WithDataV2.json'; import { CheckInterfaceRequest, CheckInterfaceResponse, @@ -48,7 +48,7 @@ const NAME = 'abcTest'; const SYMBOL = 'abc'; const ERC721_NO_DATA_SCHEMA = 'ERC721NoData'; const ERC721_NO_DATA_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC721_NO_DATA_SCHEMA}&type=${TokenType.NONFUNGIBLE}`; -const ERC721_WITH_DATA_SCHEMA = 'ERC721WithData'; +const ERC721_WITH_DATA_SCHEMA = 'ERC721WithDataV2'; const ERC721_WITH_DATA_POOL_ID = `address=${CONTRACT_ADDRESS}&schema=${ERC721_WITH_DATA_SCHEMA}&type=${TokenType.NONFUNGIBLE}`; const MINT_NO_DATA = 'safeMint'; @@ -56,17 +56,12 @@ const TRANSFER_NO_DATA = 'safeTransferFrom'; const BURN_NO_DATA = 'burn'; const APPROVE_NO_DATA = 'approve'; const APPROVE_FOR_ALL_NO_DATA = 'setApprovalForAll'; -const MINT_WITH_DATA = 'mintWithData'; +const MINT_WITH_URI = 'mintWithURI'; const TRANSFER_WITH_DATA = 'transferWithData'; const BURN_WITH_DATA = 'burnWithData'; const APPROVE_WITH_DATA = 'approveWithData'; const APPROVE_FOR_ALL_WITH_DATA = 'setApprovalForAllWithData'; -const abiMethodMap = { - ERC721NoData: ERC721NoDataABI.abi as IAbiMethod[], - ERC721WithData: ERC721WithDataABI.abi as IAbiMethod[], -}; - export default (context: TestContext) => { const mockPoolQuery = (withData: boolean | undefined) => { if (withData !== undefined) { @@ -164,7 +159,6 @@ export default (context: TestContext) => { it('Mint token', async () => { const request: TokenMint = { - tokenIndex: '721', signer: IDENTITY, poolLocator: ERC721_WITH_DATA_POOL_ID, to: '0x123', @@ -176,8 +170,8 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721WithData.find(abi => abi.name === MINT_WITH_DATA) as IAbiMethod, - params: ['0x123', '721', '0x00'], + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === MINT_WITH_URI) as IAbiMethod, + params: ['0x123', '0x00', ''], }; const response: EthConnectAsyncResponse = { @@ -208,9 +202,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721WithData.find( - abi => abi.name === TRANSFER_WITH_DATA, - ) as IAbiMethod, + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === TRANSFER_WITH_DATA) as IAbiMethod, params: [IDENTITY, '0x123', '721', '0x00'], }; @@ -241,7 +233,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721WithData.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === BURN_WITH_DATA) as IAbiMethod, params: [IDENTITY, '721', '0x00'], }; @@ -273,7 +265,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721WithData.find( + method: ERC721WithDataV2ABI.abi.find( abi => abi.name === APPROVE_FOR_ALL_WITH_DATA, ) as IAbiMethod, params: ['2', true, '0x00'], @@ -307,9 +299,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721WithData.find( - abi => abi.name === APPROVE_WITH_DATA, - ) as IAbiMethod, + method: ERC721WithDataV2ABI.abi.find(abi => abi.name === APPROVE_WITH_DATA) as IAbiMethod, params: ['2', '5', '0x00'], }; @@ -352,6 +342,7 @@ export default (context: TestContext) => { }, }); + mockURIQuery(false); mockURIQuery(false); mockPoolQuery(false); context.http.get = jest.fn(() => new FakeObservable(expectedResponse)); @@ -374,8 +365,8 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721NoData.find(abi => abi.name === MINT_NO_DATA) as IAbiMethod, - params: ['0x123', '721'], + method: ERC721NoDataABI.abi.find(abi => abi.name === MINT_NO_DATA) as IAbiMethod, + params: ['0x123'], }; const response: EthConnectAsyncResponse = { @@ -406,7 +397,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721NoData.find( + method: ERC721NoDataABI.abi.find( abi => abi.name === TRANSFER_NO_DATA && abi.inputs?.length === 4, ) as IAbiMethod, params: [IDENTITY, '0x123', '721', '0x00'], @@ -439,7 +430,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721NoData.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, + method: ERC721NoDataABI.abi.find(abi => abi.name === BURN_NO_DATA) as IAbiMethod, params: ['721'], }; @@ -471,9 +462,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721NoData.find( - abi => abi.name === APPROVE_FOR_ALL_NO_DATA, - ) as IAbiMethod, + method: ERC721NoDataABI.abi.find(abi => abi.name === APPROVE_FOR_ALL_NO_DATA) as IAbiMethod, params: ['2', true], }; @@ -505,7 +494,7 @@ export default (context: TestContext) => { }, from: IDENTITY, to: CONTRACT_ADDRESS, - method: abiMethodMap.ERC721NoData.find(abi => abi.name === APPROVE_NO_DATA) as IAbiMethod, + method: ERC721NoDataABI.abi.find(abi => abi.name === APPROVE_NO_DATA) as IAbiMethod, params: ['2', '5'], };