diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2882999..005776e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,7 +74,178 @@ jobs: node_modules */*/node_modules key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} - - run: yarn test + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: -1 + + test-1: + name: Test contracts (1 bit) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 1 + + test-2: + name: Test contracts (2 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 2 + + test-4: + name: Test contracts (4 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 4 + + test-8: + name: Test contracts (8 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 8 + + test-16: + name: Test contracts (16 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 16 + + test-32: + name: Test contracts (32 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 32 + + test-64: + name: Test contracts (64 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 64 + + test-128: + name: Test contracts (128 bits) + runs-on: ubuntu-latest + needs: [install] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - uses: actions/cache@master + id: yarn-cache + with: + path: | + node_modules + */*/node_modules + key: ${{ runner.os }}-lerna-${{ hashFiles('**/package.json', '**/yarn.lock') }} + - run: yarn start:ganache & + - run: yarn test:ganache + env: + TEST_BIT: 128 # coverage: # name: Coverage diff --git a/hardhat.config.ts b/hardhat.config.ts index 2047d06..21abda7 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -41,6 +41,9 @@ const config: HardhatUserConfig = { currency: 'USD', gasPrice: 10, showTimeSpent: true + }, + mocha: { + timeout: 60000 } } diff --git a/src/artifacts/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol/ERC1155MetaMintBurnPackedBalanceMock.json b/src/artifacts/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol/ERC1155MetaMintBurnPackedBalanceMock.json index e121b07..161dca2 100644 --- a/src/artifacts/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol/ERC1155MetaMintBurnPackedBalanceMock.json +++ b/src/artifacts/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol/ERC1155MetaMintBurnPackedBalanceMock.json @@ -3,6 +3,17 @@ "contractName": "ERC1155MetaMintBurnPackedBalanceMock", "sourceName": "contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol", "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_idsBitsSize", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -144,6 +155,19 @@ "stateMutability": "nonpayable", "type": "fallback" }, + { + "inputs": [], + "name": "IDS_BITS_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -287,7 +311,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -330,7 +354,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -651,8 +675,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b5061448c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101505760003560e01c8063a3f091f5116100cd578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5d4c8201461031b578063fa4e12d71461032e57610150565b8063e985e9c5146102e2578063eaec5f81146102f557610150565b8063ce0b514b116100b2578063ce0b514b1461029b578063d7a0ad90146102ae578063db90e83c146102c157610150565b8063a3f091f514610275578063bd7a6c411461028857610150565b80632eb2c2d6116101245780634e1273f4116101095780634e1273f41461022f578063a22cb4651461024f578063a3d4926e1461026257610150565b80632eb2c2d614610207578063437ecbe91461021c57610150565b8062fdd58e1461018b57806301ffc9a7146101b45780630e89341c146101d45780632d0335ab146101f4575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613e20565b60405180910390fd5b61019e6101993660046136d8565b610341565b6040516101ab9190613e7d565b60405180910390f35b6101c76101c236600461386b565b610396565b6040516101ab9190613af1565b6101e76101e236600461396a565b6103a9565b6040516101ab9190613b79565b61019e610202366004613202565b6104fc565b61021a61021536600461335c565b610524565b005b61021a61022a366004613703565b61062f565b61024261023d36600461378c565b61063f565b6040516101ab9190613aad565b61021a61025d36600461365c565b6108be565b61021a61027036600461329f565b610957565b61021a610283366004613737565b610acb565b61021a610296366004613552565b610add565b61021a6102a936600461347f565b610ae8565b61021a6102bc3660046135c5565b610bc7565b6102d46102cf36600461396a565b610bd3565b6040516101ab929190613e86565b6101c76102f0366004613267565b610be0565b61019e610303366004613982565b610c1b565b61021a6103163660046134f7565b610c2e565b61021a610329366004613406565b610d32565b6101c761033c366004613689565b610e62565b600080600061034f84610bd3565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610c1b565b95945050505050565b60006103a182611643565b90505b919050565b606060036103b6836116a0565b60405160200180838054600181600116156101000203166002900480156104145780601f106103f2576101008083540402835291820191610414565b820191906000526020600020905b815481529060010190602001808311610400575b5050825160208401908083835b6020831061045e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610421565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061054d575061054d8533610be0565b6105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806141c2603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613faf603d913960400191505060405180910390fd5b61061a858585856117cc565b610628858585855a86611bd9565b5050505050565b61063a838383611e46565b505050565b8151815160609190811461069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613f766039913960400191505060405180910390fd5b6000806106be856000815181106106b157fe5b6020026020010151610bd3565b915091506000806000886000815181106106d457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561074857600080fd5b50604051908082528060200260200182016040528015610772578160200160208202803683370190505b50905061077f8385610c1b565b8160008151811061078c57fe5b602090810291909101015260015b868110156108b1576107b18982815181106106b157fe5b9096509450828614158061081a57508981815181106107cc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106107f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610888576000808b838151811061082e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108928486610c1b565b82828151811061089e57fe5b602090810291909101015260010161079a565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613d40565b60606109ae613033565b6060610a6189857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016109ec91906139a3565b604051602081830303815290604052805190602001208c604051602001610a1391906139a3565b604051602081830303815290604052805190602001208c610a35576000610a38565b60015b604051602001610a4d96959493929190613afc565b604051602081830303815290604052611eb0565b9050610a6f898989896117cc565b8415610ab25780806020019051810190610a899190613935565b8094508193505050610aa389898989866020015188611bd9565b610aad898361207f565b610ac0565b610ac0898989895a86611bd9565b505050505050505050565b610ad784848484612328565b50505050565b61063a83838361239c565b73ffffffffffffffffffffffffffffffffffffffff8516610b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613ce2565b6060610b3f613033565b6060610b7789857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a35576000610a38565b9050610b8589898989612545565b8415610bb95780806020019051810190610b9f9190613935565b8094508193505050610aa3898989898660200151886125e9565b610ac0898989895a866125e9565b610ad7848484846127da565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c575750610c578533610be0565b610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806140906037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061432e6038913960400191505060405180910390fd5b610d2485858585612545565b610628858585855a866125e9565b6060610d8e86837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610d68576000610d6b565b60015b89610d77576000610d7a565b60015b604051602001610a4d959493929190613b3d565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610e22908890613af1565b60405180910390a38215610e5a57610e38613033565b81806020019051810190610e4c9190613902565b9050610e58878261207f565b505b505050505050565b600080825111610ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142eb6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806142716033913960400191505060405180910390fd5b6000610f3483612a64565b60f81c905060058110610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b60008160ff166005811115610fa357fe5b9050600080808080856005811115610fb757fe5b141561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806140c76036913960400191505060405180910390fd5b600185600581111561101c57fe5b141561115f57875160611461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b611087886000612b21565b9250611094886020612b21565b9150876040815181106110a357fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561110d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d8116911614975061163b9650505050505050565b600285600581111561116d57fe5b14156112bd5787516061146111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b6111d8886000612b21565b92506111e5886020612b21565b9150876040815181106111f457fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561110d573d6000803e3d6000fd5b60038560058111156112cb57fe5b141561148357604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b83811015611359578181015183820152602001611341565b50505050905090810190601f1680156113865780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d602081101561142f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b600485600581111561149157fe5b14156115ea57604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b83811015611521578181015183820152602001611509565b50505050905090810190601f16801561154e5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d602081101561159657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611697575060016103a4565b6103a182612b89565b6060816116e1575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103a4565b818060005b82156116fa57600101600a830492506116e6565b60608167ffffffffffffffff8111801561171357600080fd5b506040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b83156117c257600a840660300160f81b8282806001900393508151811061178857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611765565b5095945050505050565b815181518114611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806140fd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156118635750600081115b15611a355760008061187b856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118d391908490889085906118c457fe5b60200260200101516001612be6565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611929919085908990859061191a57fe5b60200260200101516000612be6565b90508360015b868110156119e3576119468982815181106106b157fe5b90965094508186146119b55773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6119c684868a84815181106118c457fe5b93506119d983868a848151811061191a57fe5b925060010161192f565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611ad2565b60005b81811015611ad057828181518110611a4c57fe5b6020026020010151611a7187868481518110611a6457fe5b6020026020010151610341565b1015611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061423b6036913960400191505060405180910390fd5b600101611a38565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611b7e578181015183820152602001611b66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bbd578181015183820152602001611ba5565b5050505090500194505050505060405180910390a45050505050565b611bf88573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611cb0578181015183820152602001611c98565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611cef578181015183820152602001611cd7565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611d2b578181015183820152602001611d13565b50505050905090810190601f168015611d585780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611d7d57600080fd5b5087f1158015611d91573d6000803e3d6000fd5b50505050506040513d6020811015611da857600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061413f604c913960600191505060405180910390fd5b611e538383836001612e33565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611ec791906138ab565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611eff836041612b21565b9050818110801590611f1357508160640181105b611f49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c27565b6000611f8586838780519060200120604051602001611f6a939291906139d9565b60405160208183030381529060405280519060200120612eba565b90506060868387604051602001611f9e93929190613a00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161202991613e7d565b60405180910390a261203d89838388610e62565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c84565b50505050509392505050565b600061208e8260600151612a64565b60f81c9050600281106120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613dc3565b60008160ff1660028111156120de57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615612114578660400151612116565b335b9250600085600281111561212657fe5b1415612225578660600151806020019051810190612144919061323a565b909450915073ffffffffffffffffffffffffffffffffffffffff84163014156121955761217388848484612545565b6121908884845a85604051806020016040528060008152506125e9565b612220565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906121ed908b90879087908790600401613a68565b600060405180830381600087803b15801561220757600080fd5b505af115801561221b573d6000803e3d6000fd5b505050505b61231e565b866060015180602001905181019061223d919061321e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90612296908b9087908690600401613a37565b602060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e8919061384f565b61231e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613bca565b5050505050505050565b6123358484846000612e33565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610ad760008585855a866125e9565b8151815181146123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141fe603d913960400191505060405180910390fd5b60005b8181101561243d576124358585838151811061241257fe5b602002602001015185848151811061242657fe5b60200260200101516001612e33565b6001016123fa565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156124eb5781810151838201526020016124d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561252a578181015183820152602001612512565b5050505090500194505050505060405180910390a450505050565b6125528483836001612e33565b61255f8383836000612e33565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126088573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15781810151838201526020016126a9565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561271157600080fd5b5087f1158015612725573d6000803e3d6000fd5b50505050506040513d602081101561273c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806142a46047913960600191505060405180910390fd5b8151835114612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806143e7603e913960400191505060405180910390fd5b8251156129545760008061284e856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320858452909152812054875193955091935091612897919084908890859061191a57fe5b86519091508360015b8281101561291b576128b78982815181106106b157fe5b90965094508186146129005773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61291184868a848151811061191a57fe5b93506001016128a0565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a015781810151838201526020016129e9565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a40578181015183820152602001612a28565b5050505090500194505050505060405180910390a4610ad760008585855a86611bd9565b600080825111612abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613fec6037913960400191505060405180910390fd5b81600183510381518110612acf57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180614366603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612bdd575060016103a4565b6103a182612fe9565b60006020840263ffffffff82846001811115612bfe57fe5b1415612ccc5784821b8701925086831015612c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b64010000000087831c8216860110612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b612def565b6001846001811115612cda57fe5b1415612d9e5784821b8703925086831115612d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b84818389901c161015612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806143a26045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612e2c57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612e3f85610bd3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612e7f90828686612be6565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b60208310612f8757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f4a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112613081578081fd5b813561309461308f82613eb8565b613e94565b8181529150602080830190848101818402860182018710156130b557600080fd5b60005b848110156130d4578135845292820192908201906001016130b8565b505050505092915050565b600082601f8301126130ef578081fd5b81356130fd61308f82613ed6565b915080825283602082850101111561311457600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261313d578081fd5b815161314b61308f82613ed6565b915080825283602082850101111561316257600080fd5b613173816020840160208601613f16565b5092915050565b60006080828403121561318b578081fd5b6040516080810167ffffffffffffffff82821081831117156131a957fe5b816040528293508451835260208501516020840152604085015191506131ce82613f42565b81604084015260608501519150808211156131e857600080fd5b506131f58582860161312d565b6060830152505092915050565b600060208284031215613213578081fd5b8135612e2c81613f42565b60006020828403121561322f578081fd5b8151612e2c81613f42565b6000806040838503121561324c578081fd5b825161325781613f42565b6020939093015192949293505050565b60008060408385031215613279578182fd5b823561328481613f42565b9150602083013561329481613f42565b809150509250929050565b60008060008060008060c087890312156132b7578182fd5b86356132c281613f42565b955060208701356132d281613f42565b9450604087013567ffffffffffffffff808211156132ee578384fd5b6132fa8a838b01613071565b9550606089013591508082111561330f578384fd5b61331b8a838b01613071565b94506080890135915061332d82613f67565b90925060a08801359080821115613342578283fd5b5061334f89828a016130df565b9150509295509295509295565b600080600080600060a08688031215613373578081fd5b853561337e81613f42565b9450602086013561338e81613f42565b9350604086013567ffffffffffffffff808211156133aa578283fd5b6133b689838a01613071565b945060608801359150808211156133cb578283fd5b6133d789838a01613071565b935060808801359150808211156133ec578283fd5b506133f9888289016130df565b9150509295509295909350565b600080600080600060a0868803121561341d578081fd5b853561342881613f42565b9450602086013561343881613f42565b9350604086013561344881613f67565b9250606086013561345881613f67565b9150608086013567ffffffffffffffff811115613473578182fd5b6133f9888289016130df565b60008060008060008060c08789031215613497578384fd5b86356134a281613f42565b955060208701356134b281613f42565b9450604087013593506060870135925060808701356134d081613f67565b915060a087013567ffffffffffffffff8111156134eb578182fd5b61334f89828a016130df565b600080600080600060a0868803121561350e578283fd5b853561351981613f42565b9450602086013561352981613f42565b93506040860135925060608601359150608086013567ffffffffffffffff811115613473578182fd5b600080600060608486031215613566578081fd5b833561357181613f42565b9250602084013567ffffffffffffffff8082111561358d578283fd5b61359987838801613071565b935060408601359150808211156135ae578283fd5b506135bb86828701613071565b9150509250925092565b600080600080608085870312156135da578182fd5b84356135e581613f42565b9350602085013567ffffffffffffffff80821115613601578384fd5b61360d88838901613071565b94506040870135915080821115613622578384fd5b61362e88838901613071565b93506060870135915080821115613643578283fd5b50613650878288016130df565b91505092959194509250565b6000806040838503121561366e578182fd5b823561367981613f42565b9150602083013561329481613f67565b6000806000806080858703121561369e578182fd5b84356136a981613f42565b935060208501359250604085013567ffffffffffffffff808211156136cc578384fd5b61362e888389016130df565b600080604083850312156136ea578182fd5b82356136f581613f42565b946020939093013593505050565b600080600060608486031215613717578081fd5b833561372281613f42565b95602085013595506040909401359392505050565b6000806000806080858703121561374c578182fd5b843561375781613f42565b93506020850135925060408501359150606085013567ffffffffffffffff811115613780578182fd5b613650878288016130df565b6000806040838503121561379e578182fd5b823567ffffffffffffffff808211156137b5578384fd5b818501915085601f8301126137c8578384fd5b81356137d661308f82613eb8565b80828252602080830192508086018a8283870289010111156137f6578889fd5b8896505b8487101561382157803561380d81613f42565b8452600196909601959281019281016137fa565b509096508701359350505080821115613838578283fd5b5061384585828601613071565b9150509250929050565b600060208284031215613860578081fd5b8151612e2c81613f67565b60006020828403121561387c578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612e2c578182fd5b600080604083850312156138bd578182fd5b825167ffffffffffffffff808211156138d4578384fd5b6138e08683870161312d565b935060208501519150808211156138f5578283fd5b506138458582860161312d565b600060208284031215613913578081fd5b815167ffffffffffffffff811115613929578182fd5b61163b8482850161317a565b60008060408385031215613947578182fd5b825167ffffffffffffffff8082111561395e578384fd5b6138e08683870161317a565b60006020828403121561397b578081fd5b5035919050565b60008060408385031215613994578182fd5b50508035926020909101359150565b815160009082906020808601845b838110156139cd578151855293820193908201906001016139b1565b50929695505050505050565b600084516139eb818460208901613f16565b91909101928352506020820152604001919050565b60008451613a12818460208901613f16565b82018481528351613a2a816020808501908801613f16565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613ae557835183529284019291840191600101613ac9565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613b98816040850160208701613f16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613eb057fe5b604052919050565b600067ffffffffffffffff821115613ecc57fe5b5060209081020190565b600067ffffffffffffffff821115613eea57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613f31578181015183820152602001613f19565b83811115610ad75750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613f6457600080fd5b50565b8015158114613f6457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122019be05877fb85bb8642e043044f9c6ceb709fe50b18d08c0aa3d18114927e9bd64736f6c63430007040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101505760003560e01c8063a3f091f5116100cd578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5d4c8201461031b578063fa4e12d71461032e57610150565b8063e985e9c5146102e2578063eaec5f81146102f557610150565b8063ce0b514b116100b2578063ce0b514b1461029b578063d7a0ad90146102ae578063db90e83c146102c157610150565b8063a3f091f514610275578063bd7a6c411461028857610150565b80632eb2c2d6116101245780634e1273f4116101095780634e1273f41461022f578063a22cb4651461024f578063a3d4926e1461026257610150565b80632eb2c2d614610207578063437ecbe91461021c57610150565b8062fdd58e1461018b57806301ffc9a7146101b45780630e89341c146101d45780632d0335ab146101f4575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613e20565b60405180910390fd5b61019e6101993660046136d8565b610341565b6040516101ab9190613e7d565b60405180910390f35b6101c76101c236600461386b565b610396565b6040516101ab9190613af1565b6101e76101e236600461396a565b6103a9565b6040516101ab9190613b79565b61019e610202366004613202565b6104fc565b61021a61021536600461335c565b610524565b005b61021a61022a366004613703565b61062f565b61024261023d36600461378c565b61063f565b6040516101ab9190613aad565b61021a61025d36600461365c565b6108be565b61021a61027036600461329f565b610957565b61021a610283366004613737565b610acb565b61021a610296366004613552565b610add565b61021a6102a936600461347f565b610ae8565b61021a6102bc3660046135c5565b610bc7565b6102d46102cf36600461396a565b610bd3565b6040516101ab929190613e86565b6101c76102f0366004613267565b610be0565b61019e610303366004613982565b610c1b565b61021a6103163660046134f7565b610c2e565b61021a610329366004613406565b610d32565b6101c761033c366004613689565b610e62565b600080600061034f84610bd3565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610c1b565b95945050505050565b60006103a182611643565b90505b919050565b606060036103b6836116a0565b60405160200180838054600181600116156101000203166002900480156104145780601f106103f2576101008083540402835291820191610414565b820191906000526020600020905b815481529060010190602001808311610400575b5050825160208401908083835b6020831061045e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610421565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061054d575061054d8533610be0565b6105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806141c2603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613faf603d913960400191505060405180910390fd5b61061a858585856117cc565b610628858585855a86611bd9565b5050505050565b61063a838383611e46565b505050565b8151815160609190811461069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613f766039913960400191505060405180910390fd5b6000806106be856000815181106106b157fe5b6020026020010151610bd3565b915091506000806000886000815181106106d457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561074857600080fd5b50604051908082528060200260200182016040528015610772578160200160208202803683370190505b50905061077f8385610c1b565b8160008151811061078c57fe5b602090810291909101015260015b868110156108b1576107b18982815181106106b157fe5b9096509450828614158061081a57508981815181106107cc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106107f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610888576000808b838151811061082e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108928486610c1b565b82828151811061089e57fe5b602090810291909101015260010161079a565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613d40565b60606109ae613033565b6060610a6189857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016109ec91906139a3565b604051602081830303815290604052805190602001208c604051602001610a1391906139a3565b604051602081830303815290604052805190602001208c610a35576000610a38565b60015b604051602001610a4d96959493929190613afc565b604051602081830303815290604052611eb0565b9050610a6f898989896117cc565b8415610ab25780806020019051810190610a899190613935565b8094508193505050610aa389898989866020015188611bd9565b610aad898361207f565b610ac0565b610ac0898989895a86611bd9565b505050505050505050565b610ad784848484612328565b50505050565b61063a83838361239c565b73ffffffffffffffffffffffffffffffffffffffff8516610b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613ce2565b6060610b3f613033565b6060610b7789857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a35576000610a38565b9050610b8589898989612545565b8415610bb95780806020019051810190610b9f9190613935565b8094508193505050610aa3898989898660200151886125e9565b610ac0898989895a866125e9565b610ad7848484846127da565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c575750610c578533610be0565b610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806140906037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061432e6038913960400191505060405180910390fd5b610d2485858585612545565b610628858585855a866125e9565b6060610d8e86837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610d68576000610d6b565b60015b89610d77576000610d7a565b60015b604051602001610a4d959493929190613b3d565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610e22908890613af1565b60405180910390a38215610e5a57610e38613033565b81806020019051810190610e4c9190613902565b9050610e58878261207f565b505b505050505050565b600080825111610ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142eb6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806142716033913960400191505060405180910390fd5b6000610f3483612a64565b60f81c905060058110610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b60008160ff166005811115610fa357fe5b9050600080808080856005811115610fb757fe5b141561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806140c76036913960400191505060405180910390fd5b600185600581111561101c57fe5b141561115f57875160611461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b611087886000612b21565b9250611094886020612b21565b9150876040815181106110a357fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561110d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d8116911614975061163b9650505050505050565b600285600581111561116d57fe5b14156112bd5787516061146111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b6111d8886000612b21565b92506111e5886020612b21565b9150876040815181106111f457fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561110d573d6000803e3d6000fd5b60038560058111156112cb57fe5b141561148357604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b83811015611359578181015183820152602001611341565b50505050905090810190601f1680156113865780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d602081101561142f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b600485600581111561149157fe5b14156115ea57604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b83811015611521578181015183820152602001611509565b50505050905090810190601f16801561154e5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d602081101561159657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611697575060016103a4565b6103a182612b89565b6060816116e1575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103a4565b818060005b82156116fa57600101600a830492506116e6565b60608167ffffffffffffffff8111801561171357600080fd5b506040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b83156117c257600a840660300160f81b8282806001900393508151811061178857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611765565b5095945050505050565b815181518114611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806140fd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156118635750600081115b15611a355760008061187b856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118d391908490889085906118c457fe5b60200260200101516001612be6565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611929919085908990859061191a57fe5b60200260200101516000612be6565b90508360015b868110156119e3576119468982815181106106b157fe5b90965094508186146119b55773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6119c684868a84815181106118c457fe5b93506119d983868a848151811061191a57fe5b925060010161192f565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611ad2565b60005b81811015611ad057828181518110611a4c57fe5b6020026020010151611a7187868481518110611a6457fe5b6020026020010151610341565b1015611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061423b6036913960400191505060405180910390fd5b600101611a38565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611b7e578181015183820152602001611b66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bbd578181015183820152602001611ba5565b5050505090500194505050505060405180910390a45050505050565b611bf88573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611cb0578181015183820152602001611c98565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611cef578181015183820152602001611cd7565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611d2b578181015183820152602001611d13565b50505050905090810190601f168015611d585780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611d7d57600080fd5b5087f1158015611d91573d6000803e3d6000fd5b50505050506040513d6020811015611da857600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061413f604c913960600191505060405180910390fd5b611e538383836001612e33565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611ec791906138ab565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611eff836041612b21565b9050818110801590611f1357508160640181105b611f49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c27565b6000611f8586838780519060200120604051602001611f6a939291906139d9565b60405160208183030381529060405280519060200120612eba565b90506060868387604051602001611f9e93929190613a00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161202991613e7d565b60405180910390a261203d89838388610e62565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c84565b50505050509392505050565b600061208e8260600151612a64565b60f81c9050600281106120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613dc3565b60008160ff1660028111156120de57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615612114578660400151612116565b335b9250600085600281111561212657fe5b1415612225578660600151806020019051810190612144919061323a565b909450915073ffffffffffffffffffffffffffffffffffffffff84163014156121955761217388848484612545565b6121908884845a85604051806020016040528060008152506125e9565b612220565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906121ed908b90879087908790600401613a68565b600060405180830381600087803b15801561220757600080fd5b505af115801561221b573d6000803e3d6000fd5b505050505b61231e565b866060015180602001905181019061223d919061321e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90612296908b9087908690600401613a37565b602060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e8919061384f565b61231e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613bca565b5050505050505050565b6123358484846000612e33565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610ad760008585855a866125e9565b8151815181146123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141fe603d913960400191505060405180910390fd5b60005b8181101561243d576124358585838151811061241257fe5b602002602001015185848151811061242657fe5b60200260200101516001612e33565b6001016123fa565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156124eb5781810151838201526020016124d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561252a578181015183820152602001612512565b5050505090500194505050505060405180910390a450505050565b6125528483836001612e33565b61255f8383836000612e33565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126088573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15781810151838201526020016126a9565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561271157600080fd5b5087f1158015612725573d6000803e3d6000fd5b50505050506040513d602081101561273c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806142a46047913960600191505060405180910390fd5b8151835114612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806143e7603e913960400191505060405180910390fd5b8251156129545760008061284e856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320858452909152812054875193955091935091612897919084908890859061191a57fe5b86519091508360015b8281101561291b576128b78982815181106106b157fe5b90965094508186146129005773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61291184868a848151811061191a57fe5b93506001016128a0565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a015781810151838201526020016129e9565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a40578181015183820152602001612a28565b5050505090500194505050505060405180910390a4610ad760008585855a86611bd9565b600080825111612abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613fec6037913960400191505060405180910390fd5b81600183510381518110612acf57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180614366603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612bdd575060016103a4565b6103a182612fe9565b60006020840263ffffffff82846001811115612bfe57fe5b1415612ccc5784821b8701925086831015612c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b64010000000087831c8216860110612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b612def565b6001846001811115612cda57fe5b1415612d9e5784821b8703925086831115612d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b84818389901c161015612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806143a26045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612e2c57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612e3f85610bd3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612e7f90828686612be6565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b60208310612f8757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f4a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112613081578081fd5b813561309461308f82613eb8565b613e94565b8181529150602080830190848101818402860182018710156130b557600080fd5b60005b848110156130d4578135845292820192908201906001016130b8565b505050505092915050565b600082601f8301126130ef578081fd5b81356130fd61308f82613ed6565b915080825283602082850101111561311457600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261313d578081fd5b815161314b61308f82613ed6565b915080825283602082850101111561316257600080fd5b613173816020840160208601613f16565b5092915050565b60006080828403121561318b578081fd5b6040516080810167ffffffffffffffff82821081831117156131a957fe5b816040528293508451835260208501516020840152604085015191506131ce82613f42565b81604084015260608501519150808211156131e857600080fd5b506131f58582860161312d565b6060830152505092915050565b600060208284031215613213578081fd5b8135612e2c81613f42565b60006020828403121561322f578081fd5b8151612e2c81613f42565b6000806040838503121561324c578081fd5b825161325781613f42565b6020939093015192949293505050565b60008060408385031215613279578182fd5b823561328481613f42565b9150602083013561329481613f42565b809150509250929050565b60008060008060008060c087890312156132b7578182fd5b86356132c281613f42565b955060208701356132d281613f42565b9450604087013567ffffffffffffffff808211156132ee578384fd5b6132fa8a838b01613071565b9550606089013591508082111561330f578384fd5b61331b8a838b01613071565b94506080890135915061332d82613f67565b90925060a08801359080821115613342578283fd5b5061334f89828a016130df565b9150509295509295509295565b600080600080600060a08688031215613373578081fd5b853561337e81613f42565b9450602086013561338e81613f42565b9350604086013567ffffffffffffffff808211156133aa578283fd5b6133b689838a01613071565b945060608801359150808211156133cb578283fd5b6133d789838a01613071565b935060808801359150808211156133ec578283fd5b506133f9888289016130df565b9150509295509295909350565b600080600080600060a0868803121561341d578081fd5b853561342881613f42565b9450602086013561343881613f42565b9350604086013561344881613f67565b9250606086013561345881613f67565b9150608086013567ffffffffffffffff811115613473578182fd5b6133f9888289016130df565b60008060008060008060c08789031215613497578384fd5b86356134a281613f42565b955060208701356134b281613f42565b9450604087013593506060870135925060808701356134d081613f67565b915060a087013567ffffffffffffffff8111156134eb578182fd5b61334f89828a016130df565b600080600080600060a0868803121561350e578283fd5b853561351981613f42565b9450602086013561352981613f42565b93506040860135925060608601359150608086013567ffffffffffffffff811115613473578182fd5b600080600060608486031215613566578081fd5b833561357181613f42565b9250602084013567ffffffffffffffff8082111561358d578283fd5b61359987838801613071565b935060408601359150808211156135ae578283fd5b506135bb86828701613071565b9150509250925092565b600080600080608085870312156135da578182fd5b84356135e581613f42565b9350602085013567ffffffffffffffff80821115613601578384fd5b61360d88838901613071565b94506040870135915080821115613622578384fd5b61362e88838901613071565b93506060870135915080821115613643578283fd5b50613650878288016130df565b91505092959194509250565b6000806040838503121561366e578182fd5b823561367981613f42565b9150602083013561329481613f67565b6000806000806080858703121561369e578182fd5b84356136a981613f42565b935060208501359250604085013567ffffffffffffffff808211156136cc578384fd5b61362e888389016130df565b600080604083850312156136ea578182fd5b82356136f581613f42565b946020939093013593505050565b600080600060608486031215613717578081fd5b833561372281613f42565b95602085013595506040909401359392505050565b6000806000806080858703121561374c578182fd5b843561375781613f42565b93506020850135925060408501359150606085013567ffffffffffffffff811115613780578182fd5b613650878288016130df565b6000806040838503121561379e578182fd5b823567ffffffffffffffff808211156137b5578384fd5b818501915085601f8301126137c8578384fd5b81356137d661308f82613eb8565b80828252602080830192508086018a8283870289010111156137f6578889fd5b8896505b8487101561382157803561380d81613f42565b8452600196909601959281019281016137fa565b509096508701359350505080821115613838578283fd5b5061384585828601613071565b9150509250929050565b600060208284031215613860578081fd5b8151612e2c81613f67565b60006020828403121561387c578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612e2c578182fd5b600080604083850312156138bd578182fd5b825167ffffffffffffffff808211156138d4578384fd5b6138e08683870161312d565b935060208501519150808211156138f5578283fd5b506138458582860161312d565b600060208284031215613913578081fd5b815167ffffffffffffffff811115613929578182fd5b61163b8482850161317a565b60008060408385031215613947578182fd5b825167ffffffffffffffff8082111561395e578384fd5b6138e08683870161317a565b60006020828403121561397b578081fd5b5035919050565b60008060408385031215613994578182fd5b50508035926020909101359150565b815160009082906020808601845b838110156139cd578151855293820193908201906001016139b1565b50929695505050505050565b600084516139eb818460208901613f16565b91909101928352506020820152604001919050565b60008451613a12818460208901613f16565b82018481528351613a2a816020808501908801613f16565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613ae557835183529284019291840191600101613ac9565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613b98816040850160208701613f16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613eb057fe5b604052919050565b600067ffffffffffffffff821115613ecc57fe5b5060209081020190565b600067ffffffffffffffff821115613eea57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613f31578181015183820152602001613f19565b83811115610ad75750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613f6457600080fd5b50565b8015158114613f6457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122019be05877fb85bb8642e043044f9c6ceb709fe50b18d08c0aa3d18114927e9bd64736f6c63430007040033", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162004715380380620047158339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620046de6037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516145c56200011960003980610bfb5280610c27525080610c585280610cb95280612cc35280612d8152506145c56000f3fe608060405234801561001057600080fd5b506004361061016b5760003560e01c8063bd7a6c41116100cd578063e985e9c511610081578063f242432a11610066578063f242432a1461032b578063f5d4c8201461033e578063fa4e12d7146103515761016b565b8063e985e9c514610305578063eaec5f81146103185761016b565b8063d7a0ad90116100b2578063d7a0ad90146102c9578063db90e83c146102dc578063ddcc74ab146102fd5761016b565b8063bd7a6c41146102a3578063ce0b514b146102b65761016b565b8063437ecbe911610124578063a22cb46511610109578063a22cb4651461026a578063a3d4926e1461027d578063a3f091f5146102905761016b565b8063437ecbe9146102375780634e1273f41461024a5761016b565b80630e89341c116101555780630e89341c146101ef5780632d0335ab1461020f5780632eb2c2d6146102225761016b565b8062fdd58e146101a657806301ffc9a7146101cf575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613f59565b60405180910390fd5b6101b96101b4366004613811565b610364565b6040516101c69190613fb6565b60405180910390f35b6101e26101dd3660046139a4565b6103b9565b6040516101c69190613c2a565b6102026101fd366004613aa3565b6103cc565b6040516101c69190613cb2565b6101b961021d36600461333b565b61051f565b610235610230366004613495565b610547565b005b61023561024536600461383c565b610652565b61025d6102583660046138c5565b610662565b6040516101c69190613be6565b610235610278366004613795565b6108e1565b61023561028b3660046133d8565b61097a565b61023561029e366004613870565b610aee565b6102356102b136600461368b565b610b00565b6102356102c43660046135b8565b610b0b565b6102356102d73660046136fe565b610bea565b6102ef6102ea366004613aa3565b610bf6565b6040516101c6929190613fbf565b6101b9610c56565b6101e26103133660046133a0565b610c7a565b6101b9610326366004613abb565b610cb5565b610235610339366004613630565b610d07565b61023561034c36600461353f565b610e0b565b6101e261035f3660046137c2565b610f3b565b600080600061037284610bf6565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506103b09082610cb5565b95945050505050565b60006103c48261171c565b90505b919050565b606060036103d983611779565b60405160200180838054600181600116156101000203166002900480156104375780601f10610415576101008083540402835291820191610437565b820191906000526020600020905b815481529060010190602001808311610423575b5050825160208401908083835b6020831061048157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610444565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061057057506105708533610c7a565b6105c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806142fb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806140e8603d913960400191505060405180910390fd5b61063d858585856118a5565b61064b858585855a86611cb2565b5050505050565b61065d838383611f1f565b505050565b815181516060919081146106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806140af6039913960400191505060405180910390fd5b6000806106e1856000815181106106d457fe5b6020026020010151610bf6565b915091506000806000886000815181106106f757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561076b57600080fd5b50604051908082528060200260200182016040528015610795578160200160208202803683370190505b5090506107a28385610cb5565b816000815181106107af57fe5b602090810291909101015260015b868110156108d4576107d48982815181106106d457fe5b9096509450828614158061083d57508981815181106107ef57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061081c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156108ab576000808b838151811061085157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108b58486610cb5565b8282815181106108c157fe5b60209081029190910101526001016107bd565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e79565b60606109d161316c565b6060610a8489857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c604051602001610a0f9190613adc565b604051602081830303815290604052805190602001208c604051602001610a369190613adc565b604051602081830303815290604052805190602001208c610a58576000610a5b565b60015b604051602001610a7096959493929190613c35565b604051602081830303815290604052611f89565b9050610a92898989896118a5565b8415610ad55780806020019051810190610aac9190613a6e565b8094508193505050610ac689898989866020015188611cb2565b610ad08983612158565b610ae3565b610ae3898989895a86611cb2565b505050505050505050565b610afa84848484612401565b50505050565b61065d838383612475565b73ffffffffffffffffffffffffffffffffffffffff8516610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e1b565b6060610b6261316c565b6060610b9a89857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a58576000610a5b565b9050610ba88989898961261e565b8415610bdc5780806020019051810190610bc29190613a6e565b8094508193505050610ac6898989898660200151886126c2565b610ae3898989895a866126c2565b610afa848484846128b3565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610c2257fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610c4e57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610d305750610d308533610c7a565b610d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141c96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610df1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806144676038913960400191505060405180910390fd5b610dfd8585858561261e565b61064b858585855a866126c2565b6060610e6786837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610e41576000610e44565b60015b89610e50576000610e53565b60015b604051602001610a70959493929190613c76565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610efb908890613c2a565b60405180910390a38215610f3357610f1161316c565b81806020019051810190610f259190613a3b565b9050610f318782612158565b505b505050505050565b600080825111610f96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806144246043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611002576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806143aa6033913960400191505060405180910390fd5b600061100d83612b3d565b60f81c90506005811061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b60008160ff16600581111561107c57fe5b905060008080808085600581111561109057fe5b14156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142006036913960400191505060405180910390fd5b60018560058111156110f557fe5b1415611238578751606114611155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b611160886000612bfa565b925061116d886020612bfa565b91508760408151811061117c57fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156111e6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506117149650505050505050565b600285600581111561124657fe5b14156113965787516061146112a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b6112b1886000612bfa565b92506112be886020612bfa565b9150876040815181106112cd57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156111e6573d6000803e3d6000fd5b60038560058111156113a457fe5b141561155c57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561143257818101518382015260200161141a565b50505050905090810190601f16801561145f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561149257818101518382015260200161147a565b50505050905090810190601f1680156114bf5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b600485600581111561156a57fe5b14156116c357604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156115fa5781810151838201526020016115e2565b50505050905090810190601f1680156116275780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561164557600080fd5b505afa158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611770575060016103c7565b6103c482612c62565b6060816117ba575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103c7565b818060005b82156117d357600101600a830492506117bf565b60608167ffffffffffffffff811180156117ec57600080fd5b506040519080825280601f01601f191660200182016040528015611817576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561189b57600a840660300160f81b8282806001900393508151811061186157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061183e565b5095945050505050565b815181518114611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806142366042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561193c5750600081115b15611b0e57600080611954856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916119ac919084908890859061199d57fe5b60200260200101516001612cbf565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611a0291908590899085906119f357fe5b60200260200101516000612cbf565b90508360015b86811015611abc57611a1f8982815181106106d457fe5b9096509450818614611a8e5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a9f84868a848151811061199d57fe5b9350611ab283868a84815181106119f357fe5b9250600101611a08565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611bab565b60005b81811015611ba957828181518110611b2557fe5b6020026020010151611b4a87868481518110611b3d57fe5b6020026020010151610364565b1015611ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143746036913960400191505060405180910390fd5b600101611b11565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611c57578181015183820152602001611c3f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611c96578181015183820152602001611c7e565b5050505090500194505050505060405180910390a45050505050565b611cd18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611d89578181015183820152602001611d71565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611dc8578181015183820152602001611db0565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611e04578181015183820152602001611dec565b50505050905090810190601f168015611e315780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611e5657600080fd5b5087f1158015611e6a573d6000803e3d6000fd5b50505050506040513d6020811015611e8157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180614278604c913960600191505060405180910390fd5b611f2c8383836001612f6c565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611fa091906139e4565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611fd8836041612bfa565b9050818110801590611fec57508160640181105b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d60565b600061205e8683878051906020012060405160200161204393929190613b12565b60405160208183030381529060405280519060200120612ff3565b9050606086838760405160200161207793929190613b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161210291613fb6565b60405180910390a261211689838388610f3b565b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613dbd565b50505050509392505050565b60006121678260600151612b3d565b60f81c9050600281106121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613efc565b60008160ff1660028111156121b757fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff16156121ed5786604001516121ef565b335b925060008560028111156121ff57fe5b14156122fe57866060015180602001905181019061221d9190613373565b909450915073ffffffffffffffffffffffffffffffffffffffff841630141561226e5761224c8884848461261e565b6122698884845a85604051806020016040528060008152506126c2565b6122f9565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906122c6908b90879087908790600401613ba1565b600060405180830381600087803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505050505b6123f7565b86606001518060200190518101906123169190613357565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd9061236f908b9087908690600401613b70565b602060405180830381600087803b15801561238957600080fd5b505af115801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613988565b6123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d03565b5050505050505050565b61240e8484846000612f6c565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610afa60008585855a866126c2565b8151815181146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614337603d913960400191505060405180910390fd5b60005b818110156125165761250e858583815181106124eb57fe5b60200260200101518584815181106124ff57fe5b60200260200101516001612f6c565b6001016124d3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156125c45781810151838201526020016125ac565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126035781810151838201526020016125eb565b5050505090500194505050505060405180910390a450505050565b61262b8483836001612f6c565b6126388383836000612f6c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126e18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561279a578181015183820152602001612782565b50505050905090810190601f1680156127c75780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156127ea57600080fd5b5087f11580156127fe573d6000803e3d6000fd5b50505050506040513d602081101561281557600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806143dd6047913960600191505060405180910390fd5b815183511461290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614520603e913960400191505060405180910390fd5b825115612a2d57600080612927856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161297091908490889085906119f357fe5b86519091508360015b828110156129f4576129908982815181106106d457fe5b90965094508186146129d95773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6129ea84868a84815181106119f357fe5b9350600101612979565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ada578181015183820152602001612ac2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612b19578181015183820152602001612b01565b5050505090500194505050505060405180910390a4610afa60008585855a86611cb2565b600080825111612b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141256037913960400191505060405180910390fd5b81600183510381518110612ba857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061449f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612cb6575060016103c7565b6103c482613122565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115612d1957fe5b1415612e055784821b8701925086831015612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b612f28565b6001846001811115612e1357fe5b1415612ed75784821b8703925086831115612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b84818389901c161015612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806144db6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612f6557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612f7885610bf6565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612fb890828686612cbf565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b602083106130c057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613083565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126131ba578081fd5b81356131cd6131c882613ff1565b613fcd565b8181529150602080830190848101818402860182018710156131ee57600080fd5b60005b8481101561320d578135845292820192908201906001016131f1565b505050505092915050565b600082601f830112613228578081fd5b81356132366131c88261400f565b915080825283602082850101111561324d57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613276578081fd5b81516132846131c88261400f565b915080825283602082850101111561329b57600080fd5b6132ac81602084016020860161404f565b5092915050565b6000608082840312156132c4578081fd5b6040516080810167ffffffffffffffff82821081831117156132e257fe5b816040528293508451835260208501516020840152604085015191506133078261407b565b816040840152606085015191508082111561332157600080fd5b5061332e85828601613266565b6060830152505092915050565b60006020828403121561334c578081fd5b8135612f658161407b565b600060208284031215613368578081fd5b8151612f658161407b565b60008060408385031215613385578081fd5b82516133908161407b565b6020939093015192949293505050565b600080604083850312156133b2578182fd5b82356133bd8161407b565b915060208301356133cd8161407b565b809150509250929050565b60008060008060008060c087890312156133f0578182fd5b86356133fb8161407b565b9550602087013561340b8161407b565b9450604087013567ffffffffffffffff80821115613427578384fd5b6134338a838b016131aa565b95506060890135915080821115613448578384fd5b6134548a838b016131aa565b945060808901359150613466826140a0565b90925060a0880135908082111561347b578283fd5b5061348889828a01613218565b9150509295509295509295565b600080600080600060a086880312156134ac578081fd5b85356134b78161407b565b945060208601356134c78161407b565b9350604086013567ffffffffffffffff808211156134e3578283fd5b6134ef89838a016131aa565b94506060880135915080821115613504578283fd5b61351089838a016131aa565b93506080880135915080821115613525578283fd5b5061353288828901613218565b9150509295509295909350565b600080600080600060a08688031215613556578081fd5b85356135618161407b565b945060208601356135718161407b565b93506040860135613581816140a0565b92506060860135613591816140a0565b9150608086013567ffffffffffffffff8111156135ac578182fd5b61353288828901613218565b60008060008060008060c087890312156135d0578384fd5b86356135db8161407b565b955060208701356135eb8161407b565b945060408701359350606087013592506080870135613609816140a0565b915060a087013567ffffffffffffffff811115613624578182fd5b61348889828a01613218565b600080600080600060a08688031215613647578283fd5b85356136528161407b565b945060208601356136628161407b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135ac578182fd5b60008060006060848603121561369f578081fd5b83356136aa8161407b565b9250602084013567ffffffffffffffff808211156136c6578283fd5b6136d2878388016131aa565b935060408601359150808211156136e7578283fd5b506136f4868287016131aa565b9150509250925092565b60008060008060808587031215613713578182fd5b843561371e8161407b565b9350602085013567ffffffffffffffff8082111561373a578384fd5b613746888389016131aa565b9450604087013591508082111561375b578384fd5b613767888389016131aa565b9350606087013591508082111561377c578283fd5b5061378987828801613218565b91505092959194509250565b600080604083850312156137a7578182fd5b82356137b28161407b565b915060208301356133cd816140a0565b600080600080608085870312156137d7578182fd5b84356137e28161407b565b935060208501359250604085013567ffffffffffffffff80821115613805578384fd5b61376788838901613218565b60008060408385031215613823578182fd5b823561382e8161407b565b946020939093013593505050565b600080600060608486031215613850578081fd5b833561385b8161407b565b95602085013595506040909401359392505050565b60008060008060808587031215613885578182fd5b84356138908161407b565b93506020850135925060408501359150606085013567ffffffffffffffff8111156138b9578182fd5b61378987828801613218565b600080604083850312156138d7578182fd5b823567ffffffffffffffff808211156138ee578384fd5b818501915085601f830112613901578384fd5b813561390f6131c882613ff1565b80828252602080830192508086018a82838702890101111561392f578889fd5b8896505b8487101561395a5780356139468161407b565b845260019690960195928101928101613933565b509096508701359350505080821115613971578283fd5b5061397e858286016131aa565b9150509250929050565b600060208284031215613999578081fd5b8151612f65816140a0565b6000602082840312156139b5578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612f65578182fd5b600080604083850312156139f6578182fd5b825167ffffffffffffffff80821115613a0d578384fd5b613a1986838701613266565b93506020850151915080821115613a2e578283fd5b5061397e85828601613266565b600060208284031215613a4c578081fd5b815167ffffffffffffffff811115613a62578182fd5b611714848285016132b3565b60008060408385031215613a80578182fd5b825167ffffffffffffffff80821115613a97578384fd5b613a19868387016132b3565b600060208284031215613ab4578081fd5b5035919050565b60008060408385031215613acd578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015613b0657815185529382019390820190600101613aea565b50929695505050505050565b60008451613b2481846020890161404f565b91909101928352506020820152604001919050565b60008451613b4b81846020890161404f565b82018481528351613b6381602080850190880161404f565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613cd181604085016020870161404f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613fe957fe5b604052919050565b600067ffffffffffffffff82111561400557fe5b5060209081020190565b600067ffffffffffffffff82111561402357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561406a578181015183820152602001614052565b83811115610afa5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461409d57600080fd5b50565b801515811461409d57600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220b93982974cd4d959f0f4fbc62d1e794e237e7a37f6c49d9f46719f5cdb53c13164736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061016b5760003560e01c8063bd7a6c41116100cd578063e985e9c511610081578063f242432a11610066578063f242432a1461032b578063f5d4c8201461033e578063fa4e12d7146103515761016b565b8063e985e9c514610305578063eaec5f81146103185761016b565b8063d7a0ad90116100b2578063d7a0ad90146102c9578063db90e83c146102dc578063ddcc74ab146102fd5761016b565b8063bd7a6c41146102a3578063ce0b514b146102b65761016b565b8063437ecbe911610124578063a22cb46511610109578063a22cb4651461026a578063a3d4926e1461027d578063a3f091f5146102905761016b565b8063437ecbe9146102375780634e1273f41461024a5761016b565b80630e89341c116101555780630e89341c146101ef5780632d0335ab1461020f5780632eb2c2d6146102225761016b565b8062fdd58e146101a657806301ffc9a7146101cf575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613f59565b60405180910390fd5b6101b96101b4366004613811565b610364565b6040516101c69190613fb6565b60405180910390f35b6101e26101dd3660046139a4565b6103b9565b6040516101c69190613c2a565b6102026101fd366004613aa3565b6103cc565b6040516101c69190613cb2565b6101b961021d36600461333b565b61051f565b610235610230366004613495565b610547565b005b61023561024536600461383c565b610652565b61025d6102583660046138c5565b610662565b6040516101c69190613be6565b610235610278366004613795565b6108e1565b61023561028b3660046133d8565b61097a565b61023561029e366004613870565b610aee565b6102356102b136600461368b565b610b00565b6102356102c43660046135b8565b610b0b565b6102356102d73660046136fe565b610bea565b6102ef6102ea366004613aa3565b610bf6565b6040516101c6929190613fbf565b6101b9610c56565b6101e26103133660046133a0565b610c7a565b6101b9610326366004613abb565b610cb5565b610235610339366004613630565b610d07565b61023561034c36600461353f565b610e0b565b6101e261035f3660046137c2565b610f3b565b600080600061037284610bf6565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506103b09082610cb5565b95945050505050565b60006103c48261171c565b90505b919050565b606060036103d983611779565b60405160200180838054600181600116156101000203166002900480156104375780601f10610415576101008083540402835291820191610437565b820191906000526020600020905b815481529060010190602001808311610423575b5050825160208401908083835b6020831061048157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610444565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061057057506105708533610c7a565b6105c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806142fb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806140e8603d913960400191505060405180910390fd5b61063d858585856118a5565b61064b858585855a86611cb2565b5050505050565b61065d838383611f1f565b505050565b815181516060919081146106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806140af6039913960400191505060405180910390fd5b6000806106e1856000815181106106d457fe5b6020026020010151610bf6565b915091506000806000886000815181106106f757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561076b57600080fd5b50604051908082528060200260200182016040528015610795578160200160208202803683370190505b5090506107a28385610cb5565b816000815181106107af57fe5b602090810291909101015260015b868110156108d4576107d48982815181106106d457fe5b9096509450828614158061083d57508981815181106107ef57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061081c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156108ab576000808b838151811061085157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108b58486610cb5565b8282815181106108c157fe5b60209081029190910101526001016107bd565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e79565b60606109d161316c565b6060610a8489857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c604051602001610a0f9190613adc565b604051602081830303815290604052805190602001208c604051602001610a369190613adc565b604051602081830303815290604052805190602001208c610a58576000610a5b565b60015b604051602001610a7096959493929190613c35565b604051602081830303815290604052611f89565b9050610a92898989896118a5565b8415610ad55780806020019051810190610aac9190613a6e565b8094508193505050610ac689898989866020015188611cb2565b610ad08983612158565b610ae3565b610ae3898989895a86611cb2565b505050505050505050565b610afa84848484612401565b50505050565b61065d838383612475565b73ffffffffffffffffffffffffffffffffffffffff8516610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e1b565b6060610b6261316c565b6060610b9a89857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a58576000610a5b565b9050610ba88989898961261e565b8415610bdc5780806020019051810190610bc29190613a6e565b8094508193505050610ac6898989898660200151886126c2565b610ae3898989895a866126c2565b610afa848484846128b3565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610c2257fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610c4e57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610d305750610d308533610c7a565b610d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141c96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610df1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806144676038913960400191505060405180910390fd5b610dfd8585858561261e565b61064b858585855a866126c2565b6060610e6786837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610e41576000610e44565b60015b89610e50576000610e53565b60015b604051602001610a70959493929190613c76565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610efb908890613c2a565b60405180910390a38215610f3357610f1161316c565b81806020019051810190610f259190613a3b565b9050610f318782612158565b505b505050505050565b600080825111610f96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806144246043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611002576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806143aa6033913960400191505060405180910390fd5b600061100d83612b3d565b60f81c90506005811061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b60008160ff16600581111561107c57fe5b905060008080808085600581111561109057fe5b14156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142006036913960400191505060405180910390fd5b60018560058111156110f557fe5b1415611238578751606114611155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b611160886000612bfa565b925061116d886020612bfa565b91508760408151811061117c57fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156111e6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506117149650505050505050565b600285600581111561124657fe5b14156113965787516061146112a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b6112b1886000612bfa565b92506112be886020612bfa565b9150876040815181106112cd57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156111e6573d6000803e3d6000fd5b60038560058111156113a457fe5b141561155c57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561143257818101518382015260200161141a565b50505050905090810190601f16801561145f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561149257818101518382015260200161147a565b50505050905090810190601f1680156114bf5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b600485600581111561156a57fe5b14156116c357604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156115fa5781810151838201526020016115e2565b50505050905090810190601f1680156116275780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561164557600080fd5b505afa158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611770575060016103c7565b6103c482612c62565b6060816117ba575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103c7565b818060005b82156117d357600101600a830492506117bf565b60608167ffffffffffffffff811180156117ec57600080fd5b506040519080825280601f01601f191660200182016040528015611817576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561189b57600a840660300160f81b8282806001900393508151811061186157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061183e565b5095945050505050565b815181518114611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806142366042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561193c5750600081115b15611b0e57600080611954856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916119ac919084908890859061199d57fe5b60200260200101516001612cbf565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611a0291908590899085906119f357fe5b60200260200101516000612cbf565b90508360015b86811015611abc57611a1f8982815181106106d457fe5b9096509450818614611a8e5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a9f84868a848151811061199d57fe5b9350611ab283868a84815181106119f357fe5b9250600101611a08565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611bab565b60005b81811015611ba957828181518110611b2557fe5b6020026020010151611b4a87868481518110611b3d57fe5b6020026020010151610364565b1015611ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143746036913960400191505060405180910390fd5b600101611b11565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611c57578181015183820152602001611c3f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611c96578181015183820152602001611c7e565b5050505090500194505050505060405180910390a45050505050565b611cd18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611d89578181015183820152602001611d71565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611dc8578181015183820152602001611db0565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611e04578181015183820152602001611dec565b50505050905090810190601f168015611e315780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611e5657600080fd5b5087f1158015611e6a573d6000803e3d6000fd5b50505050506040513d6020811015611e8157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180614278604c913960600191505060405180910390fd5b611f2c8383836001612f6c565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611fa091906139e4565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611fd8836041612bfa565b9050818110801590611fec57508160640181105b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d60565b600061205e8683878051906020012060405160200161204393929190613b12565b60405160208183030381529060405280519060200120612ff3565b9050606086838760405160200161207793929190613b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161210291613fb6565b60405180910390a261211689838388610f3b565b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613dbd565b50505050509392505050565b60006121678260600151612b3d565b60f81c9050600281106121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613efc565b60008160ff1660028111156121b757fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff16156121ed5786604001516121ef565b335b925060008560028111156121ff57fe5b14156122fe57866060015180602001905181019061221d9190613373565b909450915073ffffffffffffffffffffffffffffffffffffffff841630141561226e5761224c8884848461261e565b6122698884845a85604051806020016040528060008152506126c2565b6122f9565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906122c6908b90879087908790600401613ba1565b600060405180830381600087803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505050505b6123f7565b86606001518060200190518101906123169190613357565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd9061236f908b9087908690600401613b70565b602060405180830381600087803b15801561238957600080fd5b505af115801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613988565b6123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d03565b5050505050505050565b61240e8484846000612f6c565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610afa60008585855a866126c2565b8151815181146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614337603d913960400191505060405180910390fd5b60005b818110156125165761250e858583815181106124eb57fe5b60200260200101518584815181106124ff57fe5b60200260200101516001612f6c565b6001016124d3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156125c45781810151838201526020016125ac565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126035781810151838201526020016125eb565b5050505090500194505050505060405180910390a450505050565b61262b8483836001612f6c565b6126388383836000612f6c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126e18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561279a578181015183820152602001612782565b50505050905090810190601f1680156127c75780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156127ea57600080fd5b5087f11580156127fe573d6000803e3d6000fd5b50505050506040513d602081101561281557600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806143dd6047913960600191505060405180910390fd5b815183511461290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614520603e913960400191505060405180910390fd5b825115612a2d57600080612927856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161297091908490889085906119f357fe5b86519091508360015b828110156129f4576129908982815181106106d457fe5b90965094508186146129d95773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6129ea84868a84815181106119f357fe5b9350600101612979565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ada578181015183820152602001612ac2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612b19578181015183820152602001612b01565b5050505090500194505050505060405180910390a4610afa60008585855a86611cb2565b600080825111612b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141256037913960400191505060405180910390fd5b81600183510381518110612ba857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061449f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612cb6575060016103c7565b6103c482613122565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115612d1957fe5b1415612e055784821b8701925086831015612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b612f28565b6001846001811115612e1357fe5b1415612ed75784821b8703925086831115612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b84818389901c161015612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806144db6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612f6557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612f7885610bf6565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612fb890828686612cbf565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b602083106130c057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613083565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126131ba578081fd5b81356131cd6131c882613ff1565b613fcd565b8181529150602080830190848101818402860182018710156131ee57600080fd5b60005b8481101561320d578135845292820192908201906001016131f1565b505050505092915050565b600082601f830112613228578081fd5b81356132366131c88261400f565b915080825283602082850101111561324d57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613276578081fd5b81516132846131c88261400f565b915080825283602082850101111561329b57600080fd5b6132ac81602084016020860161404f565b5092915050565b6000608082840312156132c4578081fd5b6040516080810167ffffffffffffffff82821081831117156132e257fe5b816040528293508451835260208501516020840152604085015191506133078261407b565b816040840152606085015191508082111561332157600080fd5b5061332e85828601613266565b6060830152505092915050565b60006020828403121561334c578081fd5b8135612f658161407b565b600060208284031215613368578081fd5b8151612f658161407b565b60008060408385031215613385578081fd5b82516133908161407b565b6020939093015192949293505050565b600080604083850312156133b2578182fd5b82356133bd8161407b565b915060208301356133cd8161407b565b809150509250929050565b60008060008060008060c087890312156133f0578182fd5b86356133fb8161407b565b9550602087013561340b8161407b565b9450604087013567ffffffffffffffff80821115613427578384fd5b6134338a838b016131aa565b95506060890135915080821115613448578384fd5b6134548a838b016131aa565b945060808901359150613466826140a0565b90925060a0880135908082111561347b578283fd5b5061348889828a01613218565b9150509295509295509295565b600080600080600060a086880312156134ac578081fd5b85356134b78161407b565b945060208601356134c78161407b565b9350604086013567ffffffffffffffff808211156134e3578283fd5b6134ef89838a016131aa565b94506060880135915080821115613504578283fd5b61351089838a016131aa565b93506080880135915080821115613525578283fd5b5061353288828901613218565b9150509295509295909350565b600080600080600060a08688031215613556578081fd5b85356135618161407b565b945060208601356135718161407b565b93506040860135613581816140a0565b92506060860135613591816140a0565b9150608086013567ffffffffffffffff8111156135ac578182fd5b61353288828901613218565b60008060008060008060c087890312156135d0578384fd5b86356135db8161407b565b955060208701356135eb8161407b565b945060408701359350606087013592506080870135613609816140a0565b915060a087013567ffffffffffffffff811115613624578182fd5b61348889828a01613218565b600080600080600060a08688031215613647578283fd5b85356136528161407b565b945060208601356136628161407b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135ac578182fd5b60008060006060848603121561369f578081fd5b83356136aa8161407b565b9250602084013567ffffffffffffffff808211156136c6578283fd5b6136d2878388016131aa565b935060408601359150808211156136e7578283fd5b506136f4868287016131aa565b9150509250925092565b60008060008060808587031215613713578182fd5b843561371e8161407b565b9350602085013567ffffffffffffffff8082111561373a578384fd5b613746888389016131aa565b9450604087013591508082111561375b578384fd5b613767888389016131aa565b9350606087013591508082111561377c578283fd5b5061378987828801613218565b91505092959194509250565b600080604083850312156137a7578182fd5b82356137b28161407b565b915060208301356133cd816140a0565b600080600080608085870312156137d7578182fd5b84356137e28161407b565b935060208501359250604085013567ffffffffffffffff80821115613805578384fd5b61376788838901613218565b60008060408385031215613823578182fd5b823561382e8161407b565b946020939093013593505050565b600080600060608486031215613850578081fd5b833561385b8161407b565b95602085013595506040909401359392505050565b60008060008060808587031215613885578182fd5b84356138908161407b565b93506020850135925060408501359150606085013567ffffffffffffffff8111156138b9578182fd5b61378987828801613218565b600080604083850312156138d7578182fd5b823567ffffffffffffffff808211156138ee578384fd5b818501915085601f830112613901578384fd5b813561390f6131c882613ff1565b80828252602080830192508086018a82838702890101111561392f578889fd5b8896505b8487101561395a5780356139468161407b565b845260019690960195928101928101613933565b509096508701359350505080821115613971578283fd5b5061397e858286016131aa565b9150509250929050565b600060208284031215613999578081fd5b8151612f65816140a0565b6000602082840312156139b5578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612f65578182fd5b600080604083850312156139f6578182fd5b825167ffffffffffffffff80821115613a0d578384fd5b613a1986838701613266565b93506020850151915080821115613a2e578283fd5b5061397e85828601613266565b600060208284031215613a4c578081fd5b815167ffffffffffffffff811115613a62578182fd5b611714848285016132b3565b60008060408385031215613a80578182fd5b825167ffffffffffffffff80821115613a97578384fd5b613a19868387016132b3565b600060208284031215613ab4578081fd5b5035919050565b60008060408385031215613acd578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015613b0657815185529382019390820190600101613aea565b50929695505050505050565b60008451613b2481846020890161404f565b91909101928352506020820152604001919050565b60008451613b4b81846020890161404f565b82018481528351613b6381602080850190880161404f565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613cd181604085016020870161404f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613fe957fe5b604052919050565b600067ffffffffffffffff82111561400557fe5b5060209081020190565b600067ffffffffffffffff82111561402357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561406a578181015183820152602001614052565b83811115610afa5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461409d57600080fd5b50565b801515811461409d57600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220b93982974cd4d959f0f4fbc62d1e794e237e7a37f6c49d9f46719f5cdb53c13164736f6c63430007040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/artifacts/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol/ERC1155MintBurnPackedBalanceMock.json b/src/artifacts/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol/ERC1155MintBurnPackedBalanceMock.json index 9d04ae8..64fbc6d 100644 --- a/src/artifacts/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol/ERC1155MintBurnPackedBalanceMock.json +++ b/src/artifacts/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol/ERC1155MintBurnPackedBalanceMock.json @@ -3,6 +3,17 @@ "contractName": "ERC1155MintBurnPackedBalanceMock", "sourceName": "contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol", "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_idsBitsSize", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -125,6 +136,19 @@ "stateMutability": "nonpayable", "type": "fallback" }, + { + "inputs": [], + "name": "IDS_BITS_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -268,7 +292,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -292,7 +316,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -470,8 +494,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50612796806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063a3f091f51161008c578063db90e83c11610066578063db90e83c14610221578063e985e9c514610242578063eaec5f8114610255578063f242432a14610268576100e9565b8063a3f091f5146101e8578063bd7a6c41146101fb578063d7a0ad901461020e576100e9565b80632eb2c2d6116100c85780632eb2c2d61461018d578063437ecbe9146101a25780634e1273f4146101b5578063a22cb465146101d5576100e9565b8062fdd58e1461012457806301ffc9a71461014d5780630e89341c1461016d575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011b90612359565b60405180910390fd5b6101376101323660046120b1565b61027b565b60405161014491906123b6565b60405180910390f35b61016061015b366004612220565b6102d0565b60405161014491906122dd565b61018061017b366004612260565b6102e3565b60405161014491906122e8565b6101a061019b366004611e68565b610436565b005b6101a06101b03660046120da565b610541565b6101c86101c336600461215f565b610551565b6040516101449190612299565b6101a06101e3366004612077565b6107d0565b6101a06101f636600461210c565b610869565b6101a0610209366004611f71565b61087b565b6101a061021c366004611fe2565b610886565b61023461022f366004612260565b610892565b6040516101449291906123bf565b610160610250366004611e36565b61089f565b610137610263366004612278565b6108da565b6101a0610276366004611f0e565b6108ed565b600080600061028984610892565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102c790826108da565b95945050505050565b60006102db826109f1565b90505b919050565b606060026102f083610a4e565b604051602001808380546001816001161561010002031660029004801561034e5780601f1061032c57610100808354040283529182019161034e565b820191906000526020600020905b81548152906001019060200180831161033a575b5050825160208401908083835b6020831061039857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161035b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061045f575061045f853361089f565b6104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061257e603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612449603d913960400191505060405180910390fd5b61052c85858585610b7a565b61053a858585855a86610f87565b5050505050565b61054c8383836111fe565b505050565b815181516060919081146105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806124106039913960400191505060405180910390fd5b6000806105d0856000815181106105c357fe5b6020026020010151610892565b915091506000806000886000815181106105e657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561065a57600080fd5b50604051908082528060200260200182016040528015610684578160200160208202803683370190505b50905061069183856108da565b8160008151811061069e57fe5b602090810291909101015260015b868110156107c3576106c38982815181106105c357fe5b9096509450828614158061072c57508981815181106106de57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061070b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561079a576000808b838151811061074057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107a484866108da565b8282815181106107b057fe5b60209081029190910101526001016106ac565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61087584848484611268565b50505050565b61054c8383836112dc565b61087584848484611485565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff861614806109165750610916853361089f565b61096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806124b96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806126746038913960400191505060405180910390fd5b6109e38585858561170f565b61053a858585855a866117b3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610a45575060016102de565b6102db826119a4565b606081610a8f575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102de565b818060005b8215610aa857600101600a83049250610a94565b60608167ffffffffffffffff81118015610ac157600080fd5b506040519080825280601f01601f191660200182016040528015610aec576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610b7057600a840660300160f81b82828060019003935081518110610b3657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610b13565b5095945050505050565b815181518114610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806124f06042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610c115750600081115b15610de357600080610c29856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610c819190849088908590610c7257fe5b60200260200101516001611a01565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610cd79190859089908590610cc857fe5b60200260200101516000611a01565b90508360015b86811015610d9157610cf48982815181106105c357fe5b9096509450818614610d635773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610d7484868a8481518110610c7257fe5b9350610d8783868a8481518110610cc857fe5b9250600101610cdd565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610e80565b60005b81811015610e7e57828181518110610dfa57fe5b6020026020010151610e1f87868481518110610e1257fe5b602002602001015161027b565b1015610e76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806125f76036913960400191505060405180910390fd5b600101610de6565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f2c578181015183820152602001610f14565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610f6b578181015183820152602001610f53565b5050505090500194505050505060405180910390a45050505050565b610fa68573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561105e578181015183820152602001611046565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561109d578181015183820152602001611085565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110d95781810151838201526020016110c1565b50505050905090810190601f1680156111065780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561112b57600080fd5b5087f115801561113f573d6000803e3d6000fd5b50505050506040513d602081101561115657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180612532604c913960600191505060405180910390fd5b505b505050505050565b61120b8383836001611c4e565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b6112758484846000611c4e565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461087560008585855a866117b3565b815181518114611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806125ba603d913960400191505060405180910390fd5b60005b8181101561137d576113758585838151811061135257fe5b602002602001015185848151811061136657fe5b60200260200101516001611c4e565b60010161133a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561142b578181015183820152602001611413565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561146a578181015183820152602001611452565b5050505090500194505050505060405180910390a450505050565b81518351146114df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806126f1603e913960400191505060405180910390fd5b8251156115ff576000806114f9856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916115429190849088908590610cc857fe5b86519091508360015b828110156115c6576115628982815181106105c357fe5b90965094508186146115ab5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6115bc84868a8481518110610cc857fe5b935060010161154b565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116ac578181015183820152602001611694565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156116eb5781810151838201526020016116d3565b5050505090500194505050505060405180910390a461087560008585855a86610f87565b61171c8483836001611c4e565b6117298383836000611c4e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6117d28573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561188b578181015183820152602001611873565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156118db57600080fd5b5087f11580156118ef573d6000803e3d6000fd5b50505050506040513d602081101561190657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604781526020018061262d6047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156119f8575060016102de565b6102db82611cd5565b60006020840263ffffffff82846001811115611a1957fe5b1415611ae75784821b8701925086831015611a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b64010000000087831c8216860110611ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b611c0a565b6001846001811115611af557fe5b1415611bb95784821b8703925086831115611b5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b84818389901c161015611ae2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806126ac6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611c4757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611c5a85610892565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611c9a90828686611a01565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102de57600080fd5b600082601f830112611d53578081fd5b8135611d66611d61826123f1565b6123cd565b818152915060208083019084810181840286018201871015611d8757600080fd5b60005b84811015611da657813584529282019290820190600101611d8a565b505050505092915050565b600082601f830112611dc1578081fd5b813567ffffffffffffffff811115611dd557fe5b611e0660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cd565b9150808252836020828501011115611e1d57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611e48578182fd5b611e5183611d1f565b9150611e5f60208401611d1f565b90509250929050565b600080600080600060a08688031215611e7f578081fd5b611e8886611d1f565b9450611e9660208701611d1f565b9350604086013567ffffffffffffffff80821115611eb2578283fd5b611ebe89838a01611d43565b94506060880135915080821115611ed3578283fd5b611edf89838a01611d43565b93506080880135915080821115611ef4578283fd5b50611f0188828901611db1565b9150509295509295909350565b600080600080600060a08688031215611f25578081fd5b611f2e86611d1f565b9450611f3c60208701611d1f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f65578182fd5b611f0188828901611db1565b600080600060608486031215611f85578283fd5b611f8e84611d1f565b9250602084013567ffffffffffffffff80821115611faa578384fd5b611fb687838801611d43565b93506040860135915080821115611fcb578283fd5b50611fd886828701611d43565b9150509250925092565b60008060008060808587031215611ff7578384fd5b61200085611d1f565b9350602085013567ffffffffffffffff8082111561201c578485fd5b61202888838901611d43565b9450604087013591508082111561203d578384fd5b61204988838901611d43565b9350606087013591508082111561205e578283fd5b5061206b87828801611db1565b91505092959194509250565b60008060408385031215612089578182fd5b61209283611d1f565b9150602083013580151581146120a6578182fd5b809150509250929050565b600080604083850312156120c3578182fd5b6120cc83611d1f565b946020939093013593505050565b6000806000606084860312156120ee578283fd5b6120f784611d1f565b95602085013595506040909401359392505050565b60008060008060808587031215612121578384fd5b61212a85611d1f565b93506020850135925060408501359150606085013567ffffffffffffffff811115612153578182fd5b61206b87828801611db1565b60008060408385031215612171578081fd5b823567ffffffffffffffff80821115612188578283fd5b818501915085601f83011261219b578283fd5b81356121a9611d61826123f1565b80828252602080830192508086018a8283870289010111156121c9578788fd5b8796505b848710156121f2576121de81611d1f565b8452600196909601959281019281016121cd565b509096508701359350505080821115612209578283fd5b5061221685828601611d43565b9150509250929050565b600060208284031215612231578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c47578182fd5b600060208284031215612271578081fd5b5035919050565b6000806040838503121561228a578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156122d1578351835292840192918401916001016122b5565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b81811015612314578581018301518582016040015282016122f8565b818111156123255783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123e957fe5b604052919050565b600067ffffffffffffffff82111561240557fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220cfaa0248ab3cd2216b2aa8933fcad401337cc5abff0d89fa02c42db1a3fc41cb64736f6c63430007040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100e95760003560e01c8063a3f091f51161008c578063db90e83c11610066578063db90e83c14610221578063e985e9c514610242578063eaec5f8114610255578063f242432a14610268576100e9565b8063a3f091f5146101e8578063bd7a6c41146101fb578063d7a0ad901461020e576100e9565b80632eb2c2d6116100c85780632eb2c2d61461018d578063437ecbe9146101a25780634e1273f4146101b5578063a22cb465146101d5576100e9565b8062fdd58e1461012457806301ffc9a71461014d5780630e89341c1461016d575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011b90612359565b60405180910390fd5b6101376101323660046120b1565b61027b565b60405161014491906123b6565b60405180910390f35b61016061015b366004612220565b6102d0565b60405161014491906122dd565b61018061017b366004612260565b6102e3565b60405161014491906122e8565b6101a061019b366004611e68565b610436565b005b6101a06101b03660046120da565b610541565b6101c86101c336600461215f565b610551565b6040516101449190612299565b6101a06101e3366004612077565b6107d0565b6101a06101f636600461210c565b610869565b6101a0610209366004611f71565b61087b565b6101a061021c366004611fe2565b610886565b61023461022f366004612260565b610892565b6040516101449291906123bf565b610160610250366004611e36565b61089f565b610137610263366004612278565b6108da565b6101a0610276366004611f0e565b6108ed565b600080600061028984610892565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102c790826108da565b95945050505050565b60006102db826109f1565b90505b919050565b606060026102f083610a4e565b604051602001808380546001816001161561010002031660029004801561034e5780601f1061032c57610100808354040283529182019161034e565b820191906000526020600020905b81548152906001019060200180831161033a575b5050825160208401908083835b6020831061039857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161035b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061045f575061045f853361089f565b6104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061257e603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612449603d913960400191505060405180910390fd5b61052c85858585610b7a565b61053a858585855a86610f87565b5050505050565b61054c8383836111fe565b505050565b815181516060919081146105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806124106039913960400191505060405180910390fd5b6000806105d0856000815181106105c357fe5b6020026020010151610892565b915091506000806000886000815181106105e657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561065a57600080fd5b50604051908082528060200260200182016040528015610684578160200160208202803683370190505b50905061069183856108da565b8160008151811061069e57fe5b602090810291909101015260015b868110156107c3576106c38982815181106105c357fe5b9096509450828614158061072c57508981815181106106de57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061070b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561079a576000808b838151811061074057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107a484866108da565b8282815181106107b057fe5b60209081029190910101526001016106ac565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61087584848484611268565b50505050565b61054c8383836112dc565b61087584848484611485565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff861614806109165750610916853361089f565b61096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806124b96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806126746038913960400191505060405180910390fd5b6109e38585858561170f565b61053a858585855a866117b3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610a45575060016102de565b6102db826119a4565b606081610a8f575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102de565b818060005b8215610aa857600101600a83049250610a94565b60608167ffffffffffffffff81118015610ac157600080fd5b506040519080825280601f01601f191660200182016040528015610aec576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610b7057600a840660300160f81b82828060019003935081518110610b3657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610b13565b5095945050505050565b815181518114610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806124f06042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610c115750600081115b15610de357600080610c29856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610c819190849088908590610c7257fe5b60200260200101516001611a01565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610cd79190859089908590610cc857fe5b60200260200101516000611a01565b90508360015b86811015610d9157610cf48982815181106105c357fe5b9096509450818614610d635773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610d7484868a8481518110610c7257fe5b9350610d8783868a8481518110610cc857fe5b9250600101610cdd565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610e80565b60005b81811015610e7e57828181518110610dfa57fe5b6020026020010151610e1f87868481518110610e1257fe5b602002602001015161027b565b1015610e76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806125f76036913960400191505060405180910390fd5b600101610de6565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f2c578181015183820152602001610f14565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610f6b578181015183820152602001610f53565b5050505090500194505050505060405180910390a45050505050565b610fa68573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561105e578181015183820152602001611046565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561109d578181015183820152602001611085565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110d95781810151838201526020016110c1565b50505050905090810190601f1680156111065780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561112b57600080fd5b5087f115801561113f573d6000803e3d6000fd5b50505050506040513d602081101561115657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180612532604c913960600191505060405180910390fd5b505b505050505050565b61120b8383836001611c4e565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b6112758484846000611c4e565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461087560008585855a866117b3565b815181518114611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806125ba603d913960400191505060405180910390fd5b60005b8181101561137d576113758585838151811061135257fe5b602002602001015185848151811061136657fe5b60200260200101516001611c4e565b60010161133a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561142b578181015183820152602001611413565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561146a578181015183820152602001611452565b5050505090500194505050505060405180910390a450505050565b81518351146114df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806126f1603e913960400191505060405180910390fd5b8251156115ff576000806114f9856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916115429190849088908590610cc857fe5b86519091508360015b828110156115c6576115628982815181106105c357fe5b90965094508186146115ab5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6115bc84868a8481518110610cc857fe5b935060010161154b565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116ac578181015183820152602001611694565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156116eb5781810151838201526020016116d3565b5050505090500194505050505060405180910390a461087560008585855a86610f87565b61171c8483836001611c4e565b6117298383836000611c4e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6117d28573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561188b578181015183820152602001611873565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156118db57600080fd5b5087f11580156118ef573d6000803e3d6000fd5b50505050506040513d602081101561190657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604781526020018061262d6047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156119f8575060016102de565b6102db82611cd5565b60006020840263ffffffff82846001811115611a1957fe5b1415611ae75784821b8701925086831015611a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b64010000000087831c8216860110611ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b611c0a565b6001846001811115611af557fe5b1415611bb95784821b8703925086831115611b5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b84818389901c161015611ae2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806126ac6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611c4757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611c5a85610892565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611c9a90828686611a01565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102de57600080fd5b600082601f830112611d53578081fd5b8135611d66611d61826123f1565b6123cd565b818152915060208083019084810181840286018201871015611d8757600080fd5b60005b84811015611da657813584529282019290820190600101611d8a565b505050505092915050565b600082601f830112611dc1578081fd5b813567ffffffffffffffff811115611dd557fe5b611e0660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cd565b9150808252836020828501011115611e1d57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611e48578182fd5b611e5183611d1f565b9150611e5f60208401611d1f565b90509250929050565b600080600080600060a08688031215611e7f578081fd5b611e8886611d1f565b9450611e9660208701611d1f565b9350604086013567ffffffffffffffff80821115611eb2578283fd5b611ebe89838a01611d43565b94506060880135915080821115611ed3578283fd5b611edf89838a01611d43565b93506080880135915080821115611ef4578283fd5b50611f0188828901611db1565b9150509295509295909350565b600080600080600060a08688031215611f25578081fd5b611f2e86611d1f565b9450611f3c60208701611d1f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f65578182fd5b611f0188828901611db1565b600080600060608486031215611f85578283fd5b611f8e84611d1f565b9250602084013567ffffffffffffffff80821115611faa578384fd5b611fb687838801611d43565b93506040860135915080821115611fcb578283fd5b50611fd886828701611d43565b9150509250925092565b60008060008060808587031215611ff7578384fd5b61200085611d1f565b9350602085013567ffffffffffffffff8082111561201c578485fd5b61202888838901611d43565b9450604087013591508082111561203d578384fd5b61204988838901611d43565b9350606087013591508082111561205e578283fd5b5061206b87828801611db1565b91505092959194509250565b60008060408385031215612089578182fd5b61209283611d1f565b9150602083013580151581146120a6578182fd5b809150509250929050565b600080604083850312156120c3578182fd5b6120cc83611d1f565b946020939093013593505050565b6000806000606084860312156120ee578283fd5b6120f784611d1f565b95602085013595506040909401359392505050565b60008060008060808587031215612121578384fd5b61212a85611d1f565b93506020850135925060408501359150606085013567ffffffffffffffff811115612153578182fd5b61206b87828801611db1565b60008060408385031215612171578081fd5b823567ffffffffffffffff80821115612188578283fd5b818501915085601f83011261219b578283fd5b81356121a9611d61826123f1565b80828252602080830192508086018a8283870289010111156121c9578788fd5b8796505b848710156121f2576121de81611d1f565b8452600196909601959281019281016121cd565b509096508701359350505080821115612209578283fd5b5061221685828601611d43565b9150509250929050565b600060208284031215612231578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c47578182fd5b600060208284031215612271578081fd5b5035919050565b6000806040838503121561228a578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156122d1578351835292840192918401916001016122b5565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b81811015612314578581018301518582016040015282016122f8565b818111156123255783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123e957fe5b604052919050565b600067ffffffffffffffff82111561240557fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220cfaa0248ab3cd2216b2aa8933fcad401337cc5abff0d89fa02c42db1a3fc41cb64736f6c63430007040033", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002a0f38038062002a0f8339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620029d86037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516128bf62000119600039806108aa52806108d652508061090752806109685280611ace5280611b8c52506128bf6000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c8063a3f091f511610097578063ddcc74ab11610066578063ddcc74ab1461024d578063e985e9c514610255578063eaec5f8114610268578063f242432a1461027b576100f4565b8063a3f091f5146101f3578063bd7a6c4114610206578063d7a0ad9014610219578063db90e83c1461022c576100f4565b80632eb2c2d6116100d35780632eb2c2d614610198578063437ecbe9146101ad5780634e1273f4146101c0578063a22cb465146101e0576100f4565b8062fdd58e1461012f57806301ffc9a7146101585780630e89341c14610178575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012690612482565b60405180910390fd5b61014261013d3660046121da565b61028e565b60405161014f91906124df565b60405180910390f35b61016b610166366004612349565b6102e3565b60405161014f9190612406565b61018b610186366004612389565b6102f6565b60405161014f9190612411565b6101ab6101a6366004611f91565b610449565b005b6101ab6101bb366004612203565b610554565b6101d36101ce366004612288565b610564565b60405161014f91906123c2565b6101ab6101ee3660046121a0565b6107e3565b6101ab610201366004612235565b61087c565b6101ab61021436600461209a565b61088e565b6101ab61022736600461210b565b610899565b61023f61023a366004612389565b6108a5565b60405161014f9291906124e8565b610142610905565b61016b610263366004611f5f565b610929565b6101426102763660046123a1565b610964565b6101ab610289366004612037565b6109b6565b600080600061029c846108a5565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102da9082610964565b95945050505050565b60006102ee82610aba565b90505b919050565b6060600261030383610b17565b60405160200180838054600181600116156101000203166002900480156103615780601f1061033f576101008083540402835291820191610361565b820191906000526020600020905b81548152906001019060200180831161034d575b5050825160208401908083835b602083106103ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161036e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061047257506104728533610929565b6104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806126a7603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612572603d913960400191505060405180910390fd5b61053f85858585610c43565b61054d858585855a86611050565b5050505050565b61055f8383836112c7565b505050565b815181516060919081146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806125396039913960400191505060405180910390fd5b6000806105e3856000815181106105d657fe5b60200260200101516108a5565b915091506000806000886000815181106105f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561066d57600080fd5b50604051908082528060200260200182016040528015610697578160200160208202803683370190505b5090506106a48385610964565b816000815181106106b157fe5b602090810291909101015260015b868110156107d6576106d68982815181106105d657fe5b9096509450828614158061073f57508981815181106106f157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061071e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156107ad576000808b838151811061075357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107b78486610964565b8282815181106107c357fe5b60209081029190910101526001016106bf565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61088884848484611331565b50505050565b61055f8383836113a5565b6108888484848461154e565b6000807f000000000000000000000000000000000000000000000000000000000000000083816108d157fe5b0491507f000000000000000000000000000000000000000000000000000000000000000083816108fd57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff861614806109df57506109df8533610929565b610a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806125e26037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061279d6038913960400191505060405180910390fd5b610aac858585856117d8565b61054d858585855a8661187c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610b0e575060016102f1565b6102ee82611a6d565b606081610b58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102f1565b818060005b8215610b7157600101600a83049250610b5d565b60608167ffffffffffffffff81118015610b8a57600080fd5b506040519080825280601f01601f191660200182016040528015610bb5576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610c3957600a840660300160f81b82828060019003935081518110610bff57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610bdc565b5095945050505050565b815181518114610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806126196042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610cda5750600081115b15610eac57600080610cf2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610d4a9190849088908590610d3b57fe5b60200260200101516001611aca565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610da09190859089908590610d9157fe5b60200260200101516000611aca565b90508360015b86811015610e5a57610dbd8982815181106105d657fe5b9096509450818614610e2c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610e3d84868a8481518110610d3b57fe5b9350610e5083868a8481518110610d9157fe5b9250600101610da6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610f49565b60005b81811015610f4757828181518110610ec357fe5b6020026020010151610ee887868481518110610edb57fe5b602002602001015161028e565b1015610f3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806127206036913960400191505060405180910390fd5b600101610eaf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610ff5578181015183820152602001610fdd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561103457818101518382015260200161101c565b5050505090500194505050505060405180910390a45050505050565b61106f8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561112757818101518382015260200161110f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561116657818101518382015260200161114e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156111a257818101518382015260200161118a565b50505050905090810190601f1680156111cf5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b1580156111f457600080fd5b5087f1158015611208573d6000803e3d6000fd5b50505050506040513d602081101561121f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061265b604c913960600191505060405180910390fd5b505b505050505050565b6112d48383836001611d77565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b61133e8484846000611d77565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461088860008585855a8661187c565b815181518114611400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806126e3603d913960400191505060405180910390fd5b60005b818110156114465761143e8585838151811061141b57fe5b602002602001015185848151811061142f57fe5b60200260200101516001611d77565b600101611403565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156114f45781810151838201526020016114dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561153357818101518382015260200161151b565b5050505090500194505050505060405180910390a450505050565b81518351146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061281a603e913960400191505060405180910390fd5b8251156116c8576000806115c2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161160b9190849088908590610d9157fe5b86519091508360015b8281101561168f5761162b8982815181106105d657fe5b90965094508186146116745773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61168584868a8481518110610d9157fe5b9350600101611614565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561177557818101518382015260200161175d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117b457818101518382015260200161179c565b5050505090500194505050505060405180910390a461088860008585855a86611050565b6117e58483836001611d77565b6117f28383836000611d77565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61189b8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561195457818101518382015260200161193c565b50505050905090810190601f1680156119815780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156119a457600080fd5b5087f11580156119b8573d6000803e3d6000fd5b50505050506040513d60208110156119cf57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806127566047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415611ac1575060016102f1565b6102ee82611dfe565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115611b2457fe5b1415611c105784821b8701925086831015611b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b611d33565b6001846001811115611c1e57fe5b1415611ce25784821b8703925086831115611c84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b84818389901c161015611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806127d56045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611d7057507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611d83856108a5565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611dc390828686611aca565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102f157600080fd5b600082601f830112611e7c578081fd5b8135611e8f611e8a8261251a565b6124f6565b818152915060208083019084810181840286018201871015611eb057600080fd5b60005b84811015611ecf57813584529282019290820190600101611eb3565b505050505092915050565b600082601f830112611eea578081fd5b813567ffffffffffffffff811115611efe57fe5b611f2f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016124f6565b9150808252836020828501011115611f4657600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611f71578182fd5b611f7a83611e48565b9150611f8860208401611e48565b90509250929050565b600080600080600060a08688031215611fa8578081fd5b611fb186611e48565b9450611fbf60208701611e48565b9350604086013567ffffffffffffffff80821115611fdb578283fd5b611fe789838a01611e6c565b94506060880135915080821115611ffc578283fd5b61200889838a01611e6c565b9350608088013591508082111561201d578283fd5b5061202a88828901611eda565b9150509295509295909350565b600080600080600060a0868803121561204e578081fd5b61205786611e48565b945061206560208701611e48565b93506040860135925060608601359150608086013567ffffffffffffffff81111561208e578182fd5b61202a88828901611eda565b6000806000606084860312156120ae578283fd5b6120b784611e48565b9250602084013567ffffffffffffffff808211156120d3578384fd5b6120df87838801611e6c565b935060408601359150808211156120f4578283fd5b5061210186828701611e6c565b9150509250925092565b60008060008060808587031215612120578384fd5b61212985611e48565b9350602085013567ffffffffffffffff80821115612145578485fd5b61215188838901611e6c565b94506040870135915080821115612166578384fd5b61217288838901611e6c565b93506060870135915080821115612187578283fd5b5061219487828801611eda565b91505092959194509250565b600080604083850312156121b2578182fd5b6121bb83611e48565b9150602083013580151581146121cf578182fd5b809150509250929050565b600080604083850312156121ec578182fd5b6121f583611e48565b946020939093013593505050565b600080600060608486031215612217578283fd5b61222084611e48565b95602085013595506040909401359392505050565b6000806000806080858703121561224a578384fd5b61225385611e48565b93506020850135925060408501359150606085013567ffffffffffffffff81111561227c578182fd5b61219487828801611eda565b6000806040838503121561229a578081fd5b823567ffffffffffffffff808211156122b1578283fd5b818501915085601f8301126122c4578283fd5b81356122d2611e8a8261251a565b80828252602080830192508086018a8283870289010111156122f2578788fd5b8796505b8487101561231b5761230781611e48565b8452600196909601959281019281016122f6565b509096508701359350505080821115612332578283fd5b5061233f85828601611e6c565b9150509250929050565b60006020828403121561235a578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611d70578182fd5b60006020828403121561239a578081fd5b5035919050565b600080604083850312156123b3578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156123fa578351835292840192918401916001016123de565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b8181101561243d57858101830151858201604001528201612421565b8181111561244e5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561251257fe5b604052919050565b600067ffffffffffffffff82111561252e57fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e9eceed9bc148fc04098eeda967b30a4621c103e39102ff8f1c6a325aa15da3e64736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f45760003560e01c8063a3f091f511610097578063ddcc74ab11610066578063ddcc74ab1461024d578063e985e9c514610255578063eaec5f8114610268578063f242432a1461027b576100f4565b8063a3f091f5146101f3578063bd7a6c4114610206578063d7a0ad9014610219578063db90e83c1461022c576100f4565b80632eb2c2d6116100d35780632eb2c2d614610198578063437ecbe9146101ad5780634e1273f4146101c0578063a22cb465146101e0576100f4565b8062fdd58e1461012f57806301ffc9a7146101585780630e89341c14610178575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012690612482565b60405180910390fd5b61014261013d3660046121da565b61028e565b60405161014f91906124df565b60405180910390f35b61016b610166366004612349565b6102e3565b60405161014f9190612406565b61018b610186366004612389565b6102f6565b60405161014f9190612411565b6101ab6101a6366004611f91565b610449565b005b6101ab6101bb366004612203565b610554565b6101d36101ce366004612288565b610564565b60405161014f91906123c2565b6101ab6101ee3660046121a0565b6107e3565b6101ab610201366004612235565b61087c565b6101ab61021436600461209a565b61088e565b6101ab61022736600461210b565b610899565b61023f61023a366004612389565b6108a5565b60405161014f9291906124e8565b610142610905565b61016b610263366004611f5f565b610929565b6101426102763660046123a1565b610964565b6101ab610289366004612037565b6109b6565b600080600061029c846108a5565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102da9082610964565b95945050505050565b60006102ee82610aba565b90505b919050565b6060600261030383610b17565b60405160200180838054600181600116156101000203166002900480156103615780601f1061033f576101008083540402835291820191610361565b820191906000526020600020905b81548152906001019060200180831161034d575b5050825160208401908083835b602083106103ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161036e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061047257506104728533610929565b6104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806126a7603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612572603d913960400191505060405180910390fd5b61053f85858585610c43565b61054d858585855a86611050565b5050505050565b61055f8383836112c7565b505050565b815181516060919081146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806125396039913960400191505060405180910390fd5b6000806105e3856000815181106105d657fe5b60200260200101516108a5565b915091506000806000886000815181106105f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561066d57600080fd5b50604051908082528060200260200182016040528015610697578160200160208202803683370190505b5090506106a48385610964565b816000815181106106b157fe5b602090810291909101015260015b868110156107d6576106d68982815181106105d657fe5b9096509450828614158061073f57508981815181106106f157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061071e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156107ad576000808b838151811061075357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107b78486610964565b8282815181106107c357fe5b60209081029190910101526001016106bf565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61088884848484611331565b50505050565b61055f8383836113a5565b6108888484848461154e565b6000807f000000000000000000000000000000000000000000000000000000000000000083816108d157fe5b0491507f000000000000000000000000000000000000000000000000000000000000000083816108fd57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff861614806109df57506109df8533610929565b610a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806125e26037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061279d6038913960400191505060405180910390fd5b610aac858585856117d8565b61054d858585855a8661187c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610b0e575060016102f1565b6102ee82611a6d565b606081610b58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102f1565b818060005b8215610b7157600101600a83049250610b5d565b60608167ffffffffffffffff81118015610b8a57600080fd5b506040519080825280601f01601f191660200182016040528015610bb5576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610c3957600a840660300160f81b82828060019003935081518110610bff57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610bdc565b5095945050505050565b815181518114610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806126196042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610cda5750600081115b15610eac57600080610cf2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610d4a9190849088908590610d3b57fe5b60200260200101516001611aca565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610da09190859089908590610d9157fe5b60200260200101516000611aca565b90508360015b86811015610e5a57610dbd8982815181106105d657fe5b9096509450818614610e2c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610e3d84868a8481518110610d3b57fe5b9350610e5083868a8481518110610d9157fe5b9250600101610da6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610f49565b60005b81811015610f4757828181518110610ec357fe5b6020026020010151610ee887868481518110610edb57fe5b602002602001015161028e565b1015610f3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806127206036913960400191505060405180910390fd5b600101610eaf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610ff5578181015183820152602001610fdd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561103457818101518382015260200161101c565b5050505090500194505050505060405180910390a45050505050565b61106f8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561112757818101518382015260200161110f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561116657818101518382015260200161114e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156111a257818101518382015260200161118a565b50505050905090810190601f1680156111cf5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b1580156111f457600080fd5b5087f1158015611208573d6000803e3d6000fd5b50505050506040513d602081101561121f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061265b604c913960600191505060405180910390fd5b505b505050505050565b6112d48383836001611d77565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b61133e8484846000611d77565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461088860008585855a8661187c565b815181518114611400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806126e3603d913960400191505060405180910390fd5b60005b818110156114465761143e8585838151811061141b57fe5b602002602001015185848151811061142f57fe5b60200260200101516001611d77565b600101611403565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156114f45781810151838201526020016114dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561153357818101518382015260200161151b565b5050505090500194505050505060405180910390a450505050565b81518351146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061281a603e913960400191505060405180910390fd5b8251156116c8576000806115c2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161160b9190849088908590610d9157fe5b86519091508360015b8281101561168f5761162b8982815181106105d657fe5b90965094508186146116745773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61168584868a8481518110610d9157fe5b9350600101611614565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561177557818101518382015260200161175d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117b457818101518382015260200161179c565b5050505090500194505050505060405180910390a461088860008585855a86611050565b6117e58483836001611d77565b6117f28383836000611d77565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61189b8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561195457818101518382015260200161193c565b50505050905090810190601f1680156119815780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156119a457600080fd5b5087f11580156119b8573d6000803e3d6000fd5b50505050506040513d60208110156119cf57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806127566047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415611ac1575060016102f1565b6102ee82611dfe565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115611b2457fe5b1415611c105784821b8701925086831015611b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b611d33565b6001846001811115611c1e57fe5b1415611ce25784821b8703925086831115611c84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b84818389901c161015611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806127d56045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611d7057507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611d83856108a5565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611dc390828686611aca565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102f157600080fd5b600082601f830112611e7c578081fd5b8135611e8f611e8a8261251a565b6124f6565b818152915060208083019084810181840286018201871015611eb057600080fd5b60005b84811015611ecf57813584529282019290820190600101611eb3565b505050505092915050565b600082601f830112611eea578081fd5b813567ffffffffffffffff811115611efe57fe5b611f2f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016124f6565b9150808252836020828501011115611f4657600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611f71578182fd5b611f7a83611e48565b9150611f8860208401611e48565b90509250929050565b600080600080600060a08688031215611fa8578081fd5b611fb186611e48565b9450611fbf60208701611e48565b9350604086013567ffffffffffffffff80821115611fdb578283fd5b611fe789838a01611e6c565b94506060880135915080821115611ffc578283fd5b61200889838a01611e6c565b9350608088013591508082111561201d578283fd5b5061202a88828901611eda565b9150509295509295909350565b600080600080600060a0868803121561204e578081fd5b61205786611e48565b945061206560208701611e48565b93506040860135925060608601359150608086013567ffffffffffffffff81111561208e578182fd5b61202a88828901611eda565b6000806000606084860312156120ae578283fd5b6120b784611e48565b9250602084013567ffffffffffffffff808211156120d3578384fd5b6120df87838801611e6c565b935060408601359150808211156120f4578283fd5b5061210186828701611e6c565b9150509250925092565b60008060008060808587031215612120578384fd5b61212985611e48565b9350602085013567ffffffffffffffff80821115612145578485fd5b61215188838901611e6c565b94506040870135915080821115612166578384fd5b61217288838901611e6c565b93506060870135915080821115612187578283fd5b5061219487828801611eda565b91505092959194509250565b600080604083850312156121b2578182fd5b6121bb83611e48565b9150602083013580151581146121cf578182fd5b809150509250929050565b600080604083850312156121ec578182fd5b6121f583611e48565b946020939093013593505050565b600080600060608486031215612217578283fd5b61222084611e48565b95602085013595506040909401359392505050565b6000806000806080858703121561224a578384fd5b61225385611e48565b93506020850135925060408501359150606085013567ffffffffffffffff81111561227c578182fd5b61219487828801611eda565b6000806040838503121561229a578081fd5b823567ffffffffffffffff808211156122b1578283fd5b818501915085601f8301126122c4578283fd5b81356122d2611e8a8261251a565b80828252602080830192508086018a8283870289010111156122f2578788fd5b8796505b8487101561231b5761230781611e48565b8452600196909601959281019281016122f6565b509096508701359350505080821115612332578283fd5b5061233f85828601611e6c565b9150509250929050565b60006020828403121561235a578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611d70578182fd5b60006020828403121561239a578081fd5b5035919050565b600080604083850312156123b3578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156123fa578351835292840192918401916001016123de565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b8181101561243d57858101830151858201604001528201612421565b8181111561244e5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561251257fe5b604052919050565b600067ffffffffffffffff82111561252e57fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e9eceed9bc148fc04098eeda967b30a4621c103e39102ff8f1c6a325aa15da3e64736f6c63430007040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol/ERC1155MetaPackedBalance.json b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol/ERC1155MetaPackedBalance.json index bf9f6af..c33dd08 100644 --- a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol/ERC1155MetaPackedBalance.json +++ b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol/ERC1155MetaPackedBalance.json @@ -121,6 +121,19 @@ "name": "TransferSingle", "type": "event" }, + { + "inputs": [], + "name": "IDS_BITS_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -190,7 +203,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -233,7 +246,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -507,8 +520,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b506138d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063ce0b514b1161008c578063eaec5f8111610066578063eaec5f81146101ec578063f242432a146101ff578063f5d4c82014610212578063fa4e12d714610225576100e9565b8063ce0b514b146101a5578063db90e83c146101b8578063e985e9c5146101d9576100e9565b80632eb2c2d6116100c85780632eb2c2d61461014a5780634e1273f41461015f578063a22cb4651461017f578063a3d4926e14610192576100e9565b8062fdd58e146100ee57806301ffc9a7146101175780632d0335ab14610137575b600080fd5b6101016100fc366004612ccb565b610238565b60405161010e9190613339565b60405180910390f35b61012a610125366004612dd5565b61028d565b60405161010e919061305b565b6101016101453660046128d1565b6102f2565b61015d610158366004612a2b565b61031a565b005b61017261016d366004612cf6565b610425565b60405161010e9190613017565b61015d61018d366004612c21565b6106a4565b61015d6101a036600461296e565b61073d565b61015d6101b3366004612b4e565b6108ba565b6101cb6101c6366004612ed4565b610999565b60405161010e929190613342565b61012a6101e7366004612936565b6109a6565b6101016101fa366004612eec565b6109e1565b61015d61020d366004612bc6565b6109f4565b61015d610220366004612ad5565b610af8565b61012a610233366004612c4e565b610c28565b600080600061024684610999565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061028490826109e1565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156102e1575060016102ed565b6102ea82611409565b90505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff86161480610343575061034385336109a6565b610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613682603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061346f603d913960400191505060405180910390fd5b61041085858585611453565b61041e858585855a86611860565b5050505050565b81518151606091908114610484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806134366039913960400191505060405180910390fd5b6000806104a48560008151811061049757fe5b6020026020010151610999565b915091506000806000886000815181106104ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561052e57600080fd5b50604051908082528060200260200182016040528015610558578160200160208202803683370190505b50905061056583856109e1565b8160008151811061057257fe5b602090810291909101015260015b868110156106975761059789828151811061049757fe5b9096509450828614158061060057508981815181106105b257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106105df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561066e576000808b838151811061061457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b61067884866109e1565b82828151811061068457fe5b6020908102919091010152600101610580565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8516610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613259565b60405180910390fd5b606061079d612702565b606061085089857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016107db9190612f0d565b604051602081830303815290604052805190602001208c6040516020016108029190612f0d565b604051602081830303815290604052805190602001208c610824576000610827565b60015b60405160200161083c96959493929190613066565b604051602081830303815290604052611acd565b905061085e89898989611453565b84156108a157808060200190518101906108789190612e9f565b809450819350505061089289898989866020015188611860565b61089c8983611c9c565b6108af565b6108af898989895a86611860565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906131fb565b6060610911612702565b606061094989857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610824576000610827565b905061095789898989611f45565b841561098b57808060200190518101906109719190612e9f565b809450819350505061089289898989866020015188611fe9565b6108af898989895a86611fe9565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610a1d5750610a1d85336109a6565b610a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806135506037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806137b16038913960400191505060405180910390fd5b610aea85858585611f45565b61041e858585855a86611fe9565b6060610b5486837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610b2e576000610b31565b60015b89610b3d576000610b40565b60015b60405160200161083c9594939291906130a7565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610be890889061305b565b60405180910390a38215610c2057610bfe612702565b81806020019051810190610c129190612e6c565b9050610c1e8782611c9c565b505b505050505050565b600080825111610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604381526020018061376e6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806136f46033913960400191505060405180910390fd5b6000610cfa836121da565b60f81c905060058110610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b60008160ff166005811115610d6957fe5b9050600080808080856005811115610d7d57fe5b1415610dd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806135876036913960400191505060405180910390fd5b6001856005811115610de257fe5b1415610f25578751606114610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610e4d886000612297565b9250610e5a886020612297565b915087604081518110610e6957fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ed3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506114019650505050505050565b6002856005811115610f3357fe5b1415611083578751606114610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610f9e886000612297565b9250610fab886020612297565b915087604081518110610fba57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015610ed3573d6000803e3d6000fd5b600385600581111561109157fe5b141561124957604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b600485600581111561125757fe5b14156113b057604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156112e75781810151838201526020016112cf565b50505050905090810190601f1680156113145780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b8151815181146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806135bd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156114ea5750600081115b156116bc576000806115028560008151811061049757fe5b73ffffffffffffffffffffffffffffffffffffffff891660009081526020818152604080832085845290915281205487519395509193509161155a919084908890859061154b57fe5b602002602001015160016122ff565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320878452909152812054875192935090916115b091908590899085906115a157fe5b602002602001015160006122ff565b90508360015b8681101561166a576115cd89828151811061049757fe5b909650945081861461163c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b61164d84868a848151811061154b57fe5b935061166083868a84815181106115a157fe5b92506001016115b6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611759565b60005b81811015611757578281815181106116d357fe5b60200260200101516116f8878684815181106116eb57fe5b6020026020010151610238565b101561174f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806136be6036913960400191505060405180910390fd5b6001016116bf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118055781810151838201526020016117ed565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561184457818101518382015260200161182c565b5050505090500194505050505060405180910390a45050505050565b61187f8573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561193757818101518382015260200161191f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561197657818101518382015260200161195e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119b257818101518382015260200161199a565b50505050905090810190601f1680156119df5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611a0457600080fd5b5087f1158015611a18573d6000803e3d6000fd5b50505050506040513d6020811015611a2f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806135ff604c913960600191505060405180910390fd5b60608083806020019051810190611ae49190612e15565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611b1c836041612297565b9050818110801590611b3057508160640181105b611b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613140565b6000611ba286838780519060200120604051602001611b8793929190612f43565b6040516020818303038152906040528051906020012061254c565b90506060868387604051602001611bbb93929190612f6a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf5991611c4691613339565b60405180910390a2611c5a89838388610c28565b611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a9061319d565b50505050509392505050565b6000611cab82606001516121da565b60f81c905060028110611cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906132dc565b60008160ff166002811115611cfb57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615611d31578660400151611d33565b335b92506000856002811115611d4357fe5b1415611e42578660600151806020019051810190611d619190612909565b909450915073ffffffffffffffffffffffffffffffffffffffff8416301415611db257611d9088848484611f45565b611dad8884845a8560405180602001604052806000815250611fe9565b611e3d565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a90611e0a908b90879087908790600401612fd2565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b611f3b565b8660600151806020019051810190611e5a91906128ed565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90611eb3908b9087908690600401612fa1565b602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f059190612db9565b611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906130e3565b5050505050505050565b611f52848383600161267b565b611f5f838383600061267b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6120088573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c15781810151838201526020016120a9565b50505050905090810190601f1680156120ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561211157600080fd5b5087f1158015612125573d6000803e3d6000fd5b50505050506040513d602081101561213c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806137276047913960600191505060405180910390fd5b600080825111612235576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806134ac6037913960400191505060405180910390fd5b8160018351038151811061224557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b600081602001835110156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806137e9603c913960400191505060405180910390fd5b50016020015190565b60006020840263ffffffff8284600181111561231757fe5b14156123e55784821b870192508683101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b64010000000087831c82168601106123e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b612508565b60018460018111156123f357fe5b14156124b75784821b8703925086831115612459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b84818389901c1610156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806138256045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061254557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b6020831061261957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016125dc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b60008061268785610999565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126c7908286866122ff565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112612750578081fd5b813561276361275e82613374565b613350565b81815291506020808301908481018184028601820187101561278457600080fd5b60005b848110156127a357813584529282019290820190600101612787565b505050505092915050565b600082601f8301126127be578081fd5b81356127cc61275e82613392565b91508082528360208285010111156127e357600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261280c578081fd5b815161281a61275e82613392565b915080825283602082850101111561283157600080fd5b6128428160208401602086016133d2565b5092915050565b60006080828403121561285a578081fd5b6040516080810167ffffffffffffffff828210818311171561287857fe5b8160405282935084518352602085015160208401526040850151915061289d82613402565b81604084015260608501519150808211156128b757600080fd5b506128c4858286016127fc565b6060830152505092915050565b6000602082840312156128e2578081fd5b813561254581613402565b6000602082840312156128fe578081fd5b815161254581613402565b6000806040838503121561291b578081fd5b825161292681613402565b6020939093015192949293505050565b60008060408385031215612948578182fd5b823561295381613402565b9150602083013561296381613402565b809150509250929050565b60008060008060008060c08789031215612986578182fd5b863561299181613402565b955060208701356129a181613402565b9450604087013567ffffffffffffffff808211156129bd578384fd5b6129c98a838b01612740565b955060608901359150808211156129de578384fd5b6129ea8a838b01612740565b9450608089013591506129fc82613427565b90925060a08801359080821115612a11578283fd5b50612a1e89828a016127ae565b9150509295509295509295565b600080600080600060a08688031215612a42578081fd5b8535612a4d81613402565b94506020860135612a5d81613402565b9350604086013567ffffffffffffffff80821115612a79578283fd5b612a8589838a01612740565b94506060880135915080821115612a9a578283fd5b612aa689838a01612740565b93506080880135915080821115612abb578283fd5b50612ac8888289016127ae565b9150509295509295909350565b600080600080600060a08688031215612aec578081fd5b8535612af781613402565b94506020860135612b0781613402565b93506040860135612b1781613427565b92506060860135612b2781613427565b9150608086013567ffffffffffffffff811115612b42578182fd5b612ac8888289016127ae565b60008060008060008060c08789031215612b66578384fd5b8635612b7181613402565b95506020870135612b8181613402565b945060408701359350606087013592506080870135612b9f81613427565b915060a087013567ffffffffffffffff811115612bba578182fd5b612a1e89828a016127ae565b600080600080600060a08688031215612bdd578283fd5b8535612be881613402565b94506020860135612bf881613402565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b42578182fd5b60008060408385031215612c33578182fd5b8235612c3e81613402565b9150602083013561296381613427565b60008060008060808587031215612c63578182fd5b8435612c6e81613402565b935060208501359250604085013567ffffffffffffffff80821115612c91578384fd5b612c9d888389016127ae565b93506060870135915080821115612cb2578283fd5b50612cbf878288016127ae565b91505092959194509250565b60008060408385031215612cdd578182fd5b8235612ce881613402565b946020939093013593505050565b60008060408385031215612d08578182fd5b823567ffffffffffffffff80821115612d1f578384fd5b818501915085601f830112612d32578384fd5b8135612d4061275e82613374565b80828252602080830192508086018a828387028901011115612d60578889fd5b8896505b84871015612d8b578035612d7781613402565b845260019690960195928101928101612d64565b509096508701359350505080821115612da2578283fd5b50612daf85828601612740565b9150509250929050565b600060208284031215612dca578081fd5b815161254581613427565b600060208284031215612de6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612545578182fd5b60008060408385031215612e27578182fd5b825167ffffffffffffffff80821115612e3e578384fd5b612e4a868387016127fc565b93506020850151915080821115612e5f578283fd5b50612daf858286016127fc565b600060208284031215612e7d578081fd5b815167ffffffffffffffff811115612e93578182fd5b61140184828501612849565b60008060408385031215612eb1578182fd5b825167ffffffffffffffff80821115612ec8578384fd5b612e4a86838701612849565b600060208284031215612ee5578081fd5b5035919050565b60008060408385031215612efe578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015612f3757815185529382019390820190600101612f1b565b50929695505050505050565b60008451612f558184602089016133d2565b91909101928352506020820152604001919050565b60008451612f7c8184602089016133d2565b82018481528351612f948160208085019088016133d2565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b8181101561304f57835183529284019291840191600101613033565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561336c57fe5b604052919050565b600067ffffffffffffffff82111561338857fe5b5060209081020190565b600067ffffffffffffffff8211156133a657fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156133ed5781810151838201526020016133d5565b838111156133fc576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461342457600080fd5b50565b801515811461342457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212205897b43ca940988411a9f040c1ba519b60953d2345ff071831c70be55f1e60f664736f6c63430007040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100e95760003560e01c8063ce0b514b1161008c578063eaec5f8111610066578063eaec5f81146101ec578063f242432a146101ff578063f5d4c82014610212578063fa4e12d714610225576100e9565b8063ce0b514b146101a5578063db90e83c146101b8578063e985e9c5146101d9576100e9565b80632eb2c2d6116100c85780632eb2c2d61461014a5780634e1273f41461015f578063a22cb4651461017f578063a3d4926e14610192576100e9565b8062fdd58e146100ee57806301ffc9a7146101175780632d0335ab14610137575b600080fd5b6101016100fc366004612ccb565b610238565b60405161010e9190613339565b60405180910390f35b61012a610125366004612dd5565b61028d565b60405161010e919061305b565b6101016101453660046128d1565b6102f2565b61015d610158366004612a2b565b61031a565b005b61017261016d366004612cf6565b610425565b60405161010e9190613017565b61015d61018d366004612c21565b6106a4565b61015d6101a036600461296e565b61073d565b61015d6101b3366004612b4e565b6108ba565b6101cb6101c6366004612ed4565b610999565b60405161010e929190613342565b61012a6101e7366004612936565b6109a6565b6101016101fa366004612eec565b6109e1565b61015d61020d366004612bc6565b6109f4565b61015d610220366004612ad5565b610af8565b61012a610233366004612c4e565b610c28565b600080600061024684610999565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061028490826109e1565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156102e1575060016102ed565b6102ea82611409565b90505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff86161480610343575061034385336109a6565b610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613682603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061346f603d913960400191505060405180910390fd5b61041085858585611453565b61041e858585855a86611860565b5050505050565b81518151606091908114610484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806134366039913960400191505060405180910390fd5b6000806104a48560008151811061049757fe5b6020026020010151610999565b915091506000806000886000815181106104ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561052e57600080fd5b50604051908082528060200260200182016040528015610558578160200160208202803683370190505b50905061056583856109e1565b8160008151811061057257fe5b602090810291909101015260015b868110156106975761059789828151811061049757fe5b9096509450828614158061060057508981815181106105b257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106105df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561066e576000808b838151811061061457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b61067884866109e1565b82828151811061068457fe5b6020908102919091010152600101610580565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8516610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613259565b60405180910390fd5b606061079d612702565b606061085089857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016107db9190612f0d565b604051602081830303815290604052805190602001208c6040516020016108029190612f0d565b604051602081830303815290604052805190602001208c610824576000610827565b60015b60405160200161083c96959493929190613066565b604051602081830303815290604052611acd565b905061085e89898989611453565b84156108a157808060200190518101906108789190612e9f565b809450819350505061089289898989866020015188611860565b61089c8983611c9c565b6108af565b6108af898989895a86611860565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906131fb565b6060610911612702565b606061094989857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610824576000610827565b905061095789898989611f45565b841561098b57808060200190518101906109719190612e9f565b809450819350505061089289898989866020015188611fe9565b6108af898989895a86611fe9565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610a1d5750610a1d85336109a6565b610a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806135506037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806137b16038913960400191505060405180910390fd5b610aea85858585611f45565b61041e858585855a86611fe9565b6060610b5486837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610b2e576000610b31565b60015b89610b3d576000610b40565b60015b60405160200161083c9594939291906130a7565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610be890889061305b565b60405180910390a38215610c2057610bfe612702565b81806020019051810190610c129190612e6c565b9050610c1e8782611c9c565b505b505050505050565b600080825111610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604381526020018061376e6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806136f46033913960400191505060405180910390fd5b6000610cfa836121da565b60f81c905060058110610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b60008160ff166005811115610d6957fe5b9050600080808080856005811115610d7d57fe5b1415610dd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806135876036913960400191505060405180910390fd5b6001856005811115610de257fe5b1415610f25578751606114610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610e4d886000612297565b9250610e5a886020612297565b915087604081518110610e6957fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ed3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506114019650505050505050565b6002856005811115610f3357fe5b1415611083578751606114610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610f9e886000612297565b9250610fab886020612297565b915087604081518110610fba57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015610ed3573d6000803e3d6000fd5b600385600581111561109157fe5b141561124957604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b600485600581111561125757fe5b14156113b057604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156112e75781810151838201526020016112cf565b50505050905090810190601f1680156113145780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b8151815181146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806135bd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156114ea5750600081115b156116bc576000806115028560008151811061049757fe5b73ffffffffffffffffffffffffffffffffffffffff891660009081526020818152604080832085845290915281205487519395509193509161155a919084908890859061154b57fe5b602002602001015160016122ff565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320878452909152812054875192935090916115b091908590899085906115a157fe5b602002602001015160006122ff565b90508360015b8681101561166a576115cd89828151811061049757fe5b909650945081861461163c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b61164d84868a848151811061154b57fe5b935061166083868a84815181106115a157fe5b92506001016115b6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611759565b60005b81811015611757578281815181106116d357fe5b60200260200101516116f8878684815181106116eb57fe5b6020026020010151610238565b101561174f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806136be6036913960400191505060405180910390fd5b6001016116bf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118055781810151838201526020016117ed565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561184457818101518382015260200161182c565b5050505090500194505050505060405180910390a45050505050565b61187f8573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561193757818101518382015260200161191f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561197657818101518382015260200161195e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119b257818101518382015260200161199a565b50505050905090810190601f1680156119df5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611a0457600080fd5b5087f1158015611a18573d6000803e3d6000fd5b50505050506040513d6020811015611a2f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806135ff604c913960600191505060405180910390fd5b60608083806020019051810190611ae49190612e15565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611b1c836041612297565b9050818110801590611b3057508160640181105b611b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613140565b6000611ba286838780519060200120604051602001611b8793929190612f43565b6040516020818303038152906040528051906020012061254c565b90506060868387604051602001611bbb93929190612f6a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf5991611c4691613339565b60405180910390a2611c5a89838388610c28565b611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a9061319d565b50505050509392505050565b6000611cab82606001516121da565b60f81c905060028110611cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906132dc565b60008160ff166002811115611cfb57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615611d31578660400151611d33565b335b92506000856002811115611d4357fe5b1415611e42578660600151806020019051810190611d619190612909565b909450915073ffffffffffffffffffffffffffffffffffffffff8416301415611db257611d9088848484611f45565b611dad8884845a8560405180602001604052806000815250611fe9565b611e3d565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a90611e0a908b90879087908790600401612fd2565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b611f3b565b8660600151806020019051810190611e5a91906128ed565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90611eb3908b9087908690600401612fa1565b602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f059190612db9565b611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906130e3565b5050505050505050565b611f52848383600161267b565b611f5f838383600061267b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6120088573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c15781810151838201526020016120a9565b50505050905090810190601f1680156120ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561211157600080fd5b5087f1158015612125573d6000803e3d6000fd5b50505050506040513d602081101561213c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806137276047913960600191505060405180910390fd5b600080825111612235576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806134ac6037913960400191505060405180910390fd5b8160018351038151811061224557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b600081602001835110156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806137e9603c913960400191505060405180910390fd5b50016020015190565b60006020840263ffffffff8284600181111561231757fe5b14156123e55784821b870192508683101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b64010000000087831c82168601106123e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b612508565b60018460018111156123f357fe5b14156124b75784821b8703925086831115612459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b84818389901c1610156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806138256045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061254557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b6020831061261957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016125dc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b60008061268785610999565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126c7908286866122ff565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112612750578081fd5b813561276361275e82613374565b613350565b81815291506020808301908481018184028601820187101561278457600080fd5b60005b848110156127a357813584529282019290820190600101612787565b505050505092915050565b600082601f8301126127be578081fd5b81356127cc61275e82613392565b91508082528360208285010111156127e357600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261280c578081fd5b815161281a61275e82613392565b915080825283602082850101111561283157600080fd5b6128428160208401602086016133d2565b5092915050565b60006080828403121561285a578081fd5b6040516080810167ffffffffffffffff828210818311171561287857fe5b8160405282935084518352602085015160208401526040850151915061289d82613402565b81604084015260608501519150808211156128b757600080fd5b506128c4858286016127fc565b6060830152505092915050565b6000602082840312156128e2578081fd5b813561254581613402565b6000602082840312156128fe578081fd5b815161254581613402565b6000806040838503121561291b578081fd5b825161292681613402565b6020939093015192949293505050565b60008060408385031215612948578182fd5b823561295381613402565b9150602083013561296381613402565b809150509250929050565b60008060008060008060c08789031215612986578182fd5b863561299181613402565b955060208701356129a181613402565b9450604087013567ffffffffffffffff808211156129bd578384fd5b6129c98a838b01612740565b955060608901359150808211156129de578384fd5b6129ea8a838b01612740565b9450608089013591506129fc82613427565b90925060a08801359080821115612a11578283fd5b50612a1e89828a016127ae565b9150509295509295509295565b600080600080600060a08688031215612a42578081fd5b8535612a4d81613402565b94506020860135612a5d81613402565b9350604086013567ffffffffffffffff80821115612a79578283fd5b612a8589838a01612740565b94506060880135915080821115612a9a578283fd5b612aa689838a01612740565b93506080880135915080821115612abb578283fd5b50612ac8888289016127ae565b9150509295509295909350565b600080600080600060a08688031215612aec578081fd5b8535612af781613402565b94506020860135612b0781613402565b93506040860135612b1781613427565b92506060860135612b2781613427565b9150608086013567ffffffffffffffff811115612b42578182fd5b612ac8888289016127ae565b60008060008060008060c08789031215612b66578384fd5b8635612b7181613402565b95506020870135612b8181613402565b945060408701359350606087013592506080870135612b9f81613427565b915060a087013567ffffffffffffffff811115612bba578182fd5b612a1e89828a016127ae565b600080600080600060a08688031215612bdd578283fd5b8535612be881613402565b94506020860135612bf881613402565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b42578182fd5b60008060408385031215612c33578182fd5b8235612c3e81613402565b9150602083013561296381613427565b60008060008060808587031215612c63578182fd5b8435612c6e81613402565b935060208501359250604085013567ffffffffffffffff80821115612c91578384fd5b612c9d888389016127ae565b93506060870135915080821115612cb2578283fd5b50612cbf878288016127ae565b91505092959194509250565b60008060408385031215612cdd578182fd5b8235612ce881613402565b946020939093013593505050565b60008060408385031215612d08578182fd5b823567ffffffffffffffff80821115612d1f578384fd5b818501915085601f830112612d32578384fd5b8135612d4061275e82613374565b80828252602080830192508086018a828387028901011115612d60578889fd5b8896505b84871015612d8b578035612d7781613402565b845260019690960195928101928101612d64565b509096508701359350505080821115612da2578283fd5b50612daf85828601612740565b9150509250929050565b600060208284031215612dca578081fd5b815161254581613427565b600060208284031215612de6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612545578182fd5b60008060408385031215612e27578182fd5b825167ffffffffffffffff80821115612e3e578384fd5b612e4a868387016127fc565b93506020850151915080821115612e5f578283fd5b50612daf858286016127fc565b600060208284031215612e7d578081fd5b815167ffffffffffffffff811115612e93578182fd5b61140184828501612849565b60008060408385031215612eb1578182fd5b825167ffffffffffffffff80821115612ec8578384fd5b612e4a86838701612849565b600060208284031215612ee5578081fd5b5035919050565b60008060408385031215612efe578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015612f3757815185529382019390820190600101612f1b565b50929695505050505050565b60008451612f558184602089016133d2565b91909101928352506020820152604001919050565b60008451612f7c8184602089016133d2565b82018481528351612f948160208085019088016133d2565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b8181101561304f57835183529284019291840191600101613033565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561336c57fe5b604052919050565b600067ffffffffffffffff82111561338857fe5b5060209081020190565b600067ffffffffffffffff8211156133a657fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156133ed5781810151838201526020016133d5565b838111156133fc576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461342457600080fd5b50565b801515811461342457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212205897b43ca940988411a9f040c1ba519b60953d2345ff071831c70be55f1e60f664736f6c63430007040033", + "bytecode": "0x", + "deployedBytecode": "0x", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol/ERC1155MintBurnPackedBalance.json b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol/ERC1155MintBurnPackedBalance.json index 995c93b..893c15c 100644 --- a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol/ERC1155MintBurnPackedBalance.json +++ b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol/ERC1155MintBurnPackedBalance.json @@ -3,6 +3,17 @@ "contractName": "ERC1155MintBurnPackedBalance", "sourceName": "contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol", "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_idsBitsSize", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -102,6 +113,19 @@ "name": "TransferSingle", "type": "event" }, + { + "inputs": [], + "name": "IDS_BITS_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -171,7 +195,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -195,7 +219,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -326,8 +350,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122016d211e8d7ce96dd72d95f3bf7388c9f0a939a36f9dd3414b2dd60a18209e35d64736f6c63430007040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122016d211e8d7ce96dd72d95f3bf7388c9f0a939a36f9dd3414b2dd60a18209e35d64736f6c63430007040033", + "bytecode": "0x60c060405234801561001057600080fd5b50604051611e1a380380611e1a8339818101604052602081101561003357600080fd5b505180610100811080156100505750806101008161004d57fe5b06155b6100a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de36037913960400191505060405180910390fd5b608081905280610100816100b557fe5b0460a052505060805160a051611cf16100f260003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122024d596a506a0fa20fb9dbabc6455c7aad0aef6bfa1553bbb3a8b6aa09f7d6af664736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122024d596a506a0fa20fb9dbabc6455c7aad0aef6bfa1553bbb3a8b6aa09f7d6af664736f6c63430007040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol/ERC1155PackedBalance.json b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol/ERC1155PackedBalance.json index a518884..98cb2c1 100644 --- a/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol/ERC1155PackedBalance.json +++ b/src/artifacts/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol/ERC1155PackedBalance.json @@ -3,6 +3,17 @@ "contractName": "ERC1155PackedBalance", "sourceName": "contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol", "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_idsBitsSize", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, { "anonymous": false, "inputs": [ @@ -102,6 +113,19 @@ "name": "TransferSingle", "type": "event" }, + { + "inputs": [], + "name": "IDS_BITS_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -171,7 +195,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -195,7 +219,7 @@ "type": "uint256" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -326,8 +350,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122086dcb9e8276fb8960941393e4916f63931eba4a32b7a348a28b7172cc63ca14d64736f6c63430007040033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122086dcb9e8276fb8960941393e4916f63931eba4a32b7a348a28b7172cc63ca14d64736f6c63430007040033", + "bytecode": "0x60c060405234801561001057600080fd5b50604051611e18380380611e188339818101604052602081101561003357600080fd5b50516101008110801561004f5750806101008161004c57fe5b06155b6100a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de16037913960400191505060405180910390fd5b608081905280610100816100b457fe5b0460a0525060805160a051611cf16100f060003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e7e6bb069cbf5f70df75d93ef378d3f4973c734157f1b98614c00dec99423b5264736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e7e6bb069cbf5f70df75d93ef378d3f4973c734157f1b98614c00dec99423b5264736f6c63430007040033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/src/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol b/src/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol index 58bccaf..df5a33e 100644 --- a/src/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol +++ b/src/contracts/mocks/ERC1155MetaMintBurnPackedBalanceMock.sol @@ -9,6 +9,12 @@ import "../tokens/ERC1155/ERC1155Metadata.sol"; contract ERC1155MetaMintBurnPackedBalanceMock is ERC1155MintBurnPackedBalance, ERC1155MetaPackedBalance, ERC1155Metadata { + /** + * @notice Cretes a new ERC1155PackedBalance contract + * @param _idsBitsSize Bits used for storing balances (determines the maximum balance amount for a token ID) + */ + constructor(uint256 _idsBitsSize) ERC1155MintBurnPackedBalance(_idsBitsSize) { } + /***********************************| | ERC165 | |__________________________________*/ diff --git a/src/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol b/src/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol index 4a57950..997c56a 100644 --- a/src/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol +++ b/src/contracts/mocks/ERC1155MintBurnPackedBalanceMock.sol @@ -7,6 +7,11 @@ import "../tokens/ERC1155/ERC1155Metadata.sol"; contract ERC1155MintBurnPackedBalanceMock is ERC1155MintBurnPackedBalance, ERC1155Metadata { + /** + * @notice Cretes a new ERC1155PackedBalance contract + * @param _idsBitsSize Bits used for storing balances (determines the maximum balance amount for a token ID) + */ + constructor(uint256 _idsBitsSize) ERC1155MintBurnPackedBalance(_idsBitsSize) { } /***********************************| | ERC165 | diff --git a/src/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol b/src/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol index b8d91c1..865da11 100644 --- a/src/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol +++ b/src/contracts/tokens/ERC1155PackedBalance/ERC1155MetaPackedBalance.sol @@ -16,7 +16,7 @@ import "../../utils/SignatureValidator.sol"; * Note: This contract is identical to the ERC1155Meta.sol contract, * except for the ERC1155PackedBalance parent contract. */ -contract ERC1155MetaPackedBalance is ERC1155PackedBalance, SignatureValidator { +abstract contract ERC1155MetaPackedBalance is ERC1155PackedBalance, SignatureValidator { using LibBytes for bytes; /***********************************| diff --git a/src/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol b/src/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol index 988bf7c..abe63f5 100644 --- a/src/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol +++ b/src/contracts/tokens/ERC1155PackedBalance/ERC1155MintBurnPackedBalance.sol @@ -10,6 +10,12 @@ import "./ERC1155PackedBalance.sol"; */ contract ERC1155MintBurnPackedBalance is ERC1155PackedBalance { + /** + * @notice Cretes a new ERC1155PackedBalance contract + * @param _idsBitsSize Bits used for storing balances (determines the maximum balance amount for a token ID) + */ + constructor(uint256 _idsBitsSize) ERC1155PackedBalance(_idsBitsSize) { } + /****************************************| | Minting Functions | |_______________________________________*/ diff --git a/src/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol b/src/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol index ffe64ef..7ced776 100644 --- a/src/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol +++ b/src/contracts/tokens/ERC1155PackedBalance/ERC1155PackedBalance.sol @@ -29,9 +29,9 @@ contract ERC1155PackedBalance is IERC1155, ERC165 { bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81; // Constants regarding bin sizes for balance packing - // IDS_BITS_SIZE **MUST** be a power of 2 (e.g. 2, 4, 8, 16, 32, 64, 128) - uint256 internal constant IDS_BITS_SIZE = 32; // Max balance amount in bits per token ID - uint256 internal constant IDS_PER_UINT256 = 256 / IDS_BITS_SIZE; // Number of ids per uint256 + // IDS_BITS_SIZE **MUST** be a divisor of 256 (e.g. 1, 2, 4, 8, 16, 32, 64, 128) + uint256 public immutable IDS_BITS_SIZE; // Max balance amount in bits per token ID + uint256 internal immutable IDS_PER_UINT256; // Number of ids per uint256 // Operations for _updateIDBalance enum Operations { Add, Sub } @@ -42,6 +42,15 @@ contract ERC1155PackedBalance is IERC1155, ERC165 { // Operators mapping (address => mapping(address => bool)) internal operators; + /** + * @notice Cretes a new ERC1155PackedBalance contract + * @param _idsBitsSize Bits used for storing balances (determines the maximum balance amount for a token ID) + */ + constructor(uint256 _idsBitsSize) { + require(_idsBitsSize < 256 && (256 % _idsBitsSize) == 0, "ERC1155PackedBalance#constructor: Invalid IDS_BITS_SIZE"); + IDS_BITS_SIZE = _idsBitsSize; + IDS_PER_UINT256 = 256 / _idsBitsSize; + } /***********************************| | Public Transfer Functions | @@ -323,7 +332,7 @@ contract ERC1155PackedBalance is IERC1155, ERC165 { * Operations.Sub: Substract _amount from value in _binValues at _index */ function _viewUpdateBinValue(uint256 _binValues, uint256 _index, uint256 _amount, Operations _operation) - internal pure returns (uint256 newBinValues) + internal view returns (uint256 newBinValues) { uint256 shift = IDS_BITS_SIZE * _index; uint256 mask = (uint256(1) << IDS_BITS_SIZE) - 1; @@ -357,7 +366,7 @@ contract ERC1155PackedBalance is IERC1155, ERC165 { * @return bin index (Bin number, ID"s index within that bin) */ function getIDBinIndex(uint256 _id) - public pure returns (uint256 bin, uint256 index) + public view returns (uint256 bin, uint256 index) { bin = _id / IDS_PER_UINT256; index = _id % IDS_PER_UINT256; @@ -371,7 +380,7 @@ contract ERC1155PackedBalance is IERC1155, ERC165 { * @return amount at given _index in _bin */ function getValueInBin(uint256 _binValues, uint256 _index) - public pure returns (uint256) + public view returns (uint256) { // require(_index < IDS_PER_UINT256) is not required since getIDBinIndex ensures `_index < IDS_PER_UINT256` diff --git a/src/gen/adapter/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.js b/src/gen/adapter/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.js index b83bace..088e608 100644 --- a/src/gen/adapter/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.js +++ b/src/gen/adapter/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.js @@ -25,11 +25,11 @@ var ERC1155MetaMintBurnPackedBalanceMock__factory = /** @class */ (function (_su function ERC1155MetaMintBurnPackedBalanceMock__factory(signer) { return _super.call(this, _abi, _bytecode, signer) || this; } - ERC1155MetaMintBurnPackedBalanceMock__factory.prototype.deploy = function (overrides) { - return _super.prototype.deploy.call(this, overrides || {}); + ERC1155MetaMintBurnPackedBalanceMock__factory.prototype.deploy = function (_idsBitsSize, overrides) { + return _super.prototype.deploy.call(this, _idsBitsSize, overrides || {}); }; - ERC1155MetaMintBurnPackedBalanceMock__factory.prototype.getDeployTransaction = function (overrides) { - return _super.prototype.getDeployTransaction.call(this, overrides || {}); + ERC1155MetaMintBurnPackedBalanceMock__factory.prototype.getDeployTransaction = function (_idsBitsSize, overrides) { + return _super.prototype.getDeployTransaction.call(this, _idsBitsSize, overrides || {}); }; ERC1155MetaMintBurnPackedBalanceMock__factory.prototype.attach = function (address) { return _super.prototype.attach.call(this, address); @@ -44,6 +44,17 @@ var ERC1155MetaMintBurnPackedBalanceMock__factory = /** @class */ (function (_su }(ethers_1.ContractFactory)); exports.ERC1155MetaMintBurnPackedBalanceMock__factory = ERC1155MetaMintBurnPackedBalanceMock__factory; var _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256" + }, + ], + stateMutability: "nonpayable", + type: "constructor" + }, { anonymous: false, inputs: [ @@ -185,6 +196,19 @@ var _abi = [ stateMutability: "nonpayable", type: "fallback" }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + }, + ], + stateMutability: "view", + type: "function" + }, { inputs: [ { @@ -328,7 +352,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -371,7 +395,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -692,4 +716,4 @@ var _abi = [ type: "function" }, ]; -var _bytecode = "0x608060405234801561001057600080fd5b5061448c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101505760003560e01c8063a3f091f5116100cd578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5d4c8201461031b578063fa4e12d71461032e57610150565b8063e985e9c5146102e2578063eaec5f81146102f557610150565b8063ce0b514b116100b2578063ce0b514b1461029b578063d7a0ad90146102ae578063db90e83c146102c157610150565b8063a3f091f514610275578063bd7a6c411461028857610150565b80632eb2c2d6116101245780634e1273f4116101095780634e1273f41461022f578063a22cb4651461024f578063a3d4926e1461026257610150565b80632eb2c2d614610207578063437ecbe91461021c57610150565b8062fdd58e1461018b57806301ffc9a7146101b45780630e89341c146101d45780632d0335ab146101f4575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613e20565b60405180910390fd5b61019e6101993660046136d8565b610341565b6040516101ab9190613e7d565b60405180910390f35b6101c76101c236600461386b565b610396565b6040516101ab9190613af1565b6101e76101e236600461396a565b6103a9565b6040516101ab9190613b79565b61019e610202366004613202565b6104fc565b61021a61021536600461335c565b610524565b005b61021a61022a366004613703565b61062f565b61024261023d36600461378c565b61063f565b6040516101ab9190613aad565b61021a61025d36600461365c565b6108be565b61021a61027036600461329f565b610957565b61021a610283366004613737565b610acb565b61021a610296366004613552565b610add565b61021a6102a936600461347f565b610ae8565b61021a6102bc3660046135c5565b610bc7565b6102d46102cf36600461396a565b610bd3565b6040516101ab929190613e86565b6101c76102f0366004613267565b610be0565b61019e610303366004613982565b610c1b565b61021a6103163660046134f7565b610c2e565b61021a610329366004613406565b610d32565b6101c761033c366004613689565b610e62565b600080600061034f84610bd3565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610c1b565b95945050505050565b60006103a182611643565b90505b919050565b606060036103b6836116a0565b60405160200180838054600181600116156101000203166002900480156104145780601f106103f2576101008083540402835291820191610414565b820191906000526020600020905b815481529060010190602001808311610400575b5050825160208401908083835b6020831061045e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610421565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061054d575061054d8533610be0565b6105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806141c2603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613faf603d913960400191505060405180910390fd5b61061a858585856117cc565b610628858585855a86611bd9565b5050505050565b61063a838383611e46565b505050565b8151815160609190811461069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613f766039913960400191505060405180910390fd5b6000806106be856000815181106106b157fe5b6020026020010151610bd3565b915091506000806000886000815181106106d457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561074857600080fd5b50604051908082528060200260200182016040528015610772578160200160208202803683370190505b50905061077f8385610c1b565b8160008151811061078c57fe5b602090810291909101015260015b868110156108b1576107b18982815181106106b157fe5b9096509450828614158061081a57508981815181106107cc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106107f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610888576000808b838151811061082e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108928486610c1b565b82828151811061089e57fe5b602090810291909101015260010161079a565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613d40565b60606109ae613033565b6060610a6189857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016109ec91906139a3565b604051602081830303815290604052805190602001208c604051602001610a1391906139a3565b604051602081830303815290604052805190602001208c610a35576000610a38565b60015b604051602001610a4d96959493929190613afc565b604051602081830303815290604052611eb0565b9050610a6f898989896117cc565b8415610ab25780806020019051810190610a899190613935565b8094508193505050610aa389898989866020015188611bd9565b610aad898361207f565b610ac0565b610ac0898989895a86611bd9565b505050505050505050565b610ad784848484612328565b50505050565b61063a83838361239c565b73ffffffffffffffffffffffffffffffffffffffff8516610b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613ce2565b6060610b3f613033565b6060610b7789857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a35576000610a38565b9050610b8589898989612545565b8415610bb95780806020019051810190610b9f9190613935565b8094508193505050610aa3898989898660200151886125e9565b610ac0898989895a866125e9565b610ad7848484846127da565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c575750610c578533610be0565b610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806140906037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061432e6038913960400191505060405180910390fd5b610d2485858585612545565b610628858585855a866125e9565b6060610d8e86837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610d68576000610d6b565b60015b89610d77576000610d7a565b60015b604051602001610a4d959493929190613b3d565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610e22908890613af1565b60405180910390a38215610e5a57610e38613033565b81806020019051810190610e4c9190613902565b9050610e58878261207f565b505b505050505050565b600080825111610ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142eb6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806142716033913960400191505060405180910390fd5b6000610f3483612a64565b60f81c905060058110610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b60008160ff166005811115610fa357fe5b9050600080808080856005811115610fb757fe5b141561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806140c76036913960400191505060405180910390fd5b600185600581111561101c57fe5b141561115f57875160611461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b611087886000612b21565b9250611094886020612b21565b9150876040815181106110a357fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561110d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d8116911614975061163b9650505050505050565b600285600581111561116d57fe5b14156112bd5787516061146111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b6111d8886000612b21565b92506111e5886020612b21565b9150876040815181106111f457fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561110d573d6000803e3d6000fd5b60038560058111156112cb57fe5b141561148357604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b83811015611359578181015183820152602001611341565b50505050905090810190601f1680156113865780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d602081101561142f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b600485600581111561149157fe5b14156115ea57604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b83811015611521578181015183820152602001611509565b50505050905090810190601f16801561154e5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d602081101561159657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611697575060016103a4565b6103a182612b89565b6060816116e1575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103a4565b818060005b82156116fa57600101600a830492506116e6565b60608167ffffffffffffffff8111801561171357600080fd5b506040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b83156117c257600a840660300160f81b8282806001900393508151811061178857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611765565b5095945050505050565b815181518114611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806140fd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156118635750600081115b15611a355760008061187b856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118d391908490889085906118c457fe5b60200260200101516001612be6565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611929919085908990859061191a57fe5b60200260200101516000612be6565b90508360015b868110156119e3576119468982815181106106b157fe5b90965094508186146119b55773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6119c684868a84815181106118c457fe5b93506119d983868a848151811061191a57fe5b925060010161192f565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611ad2565b60005b81811015611ad057828181518110611a4c57fe5b6020026020010151611a7187868481518110611a6457fe5b6020026020010151610341565b1015611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061423b6036913960400191505060405180910390fd5b600101611a38565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611b7e578181015183820152602001611b66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bbd578181015183820152602001611ba5565b5050505090500194505050505060405180910390a45050505050565b611bf88573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611cb0578181015183820152602001611c98565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611cef578181015183820152602001611cd7565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611d2b578181015183820152602001611d13565b50505050905090810190601f168015611d585780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611d7d57600080fd5b5087f1158015611d91573d6000803e3d6000fd5b50505050506040513d6020811015611da857600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061413f604c913960600191505060405180910390fd5b611e538383836001612e33565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611ec791906138ab565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611eff836041612b21565b9050818110801590611f1357508160640181105b611f49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c27565b6000611f8586838780519060200120604051602001611f6a939291906139d9565b60405160208183030381529060405280519060200120612eba565b90506060868387604051602001611f9e93929190613a00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161202991613e7d565b60405180910390a261203d89838388610e62565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c84565b50505050509392505050565b600061208e8260600151612a64565b60f81c9050600281106120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613dc3565b60008160ff1660028111156120de57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615612114578660400151612116565b335b9250600085600281111561212657fe5b1415612225578660600151806020019051810190612144919061323a565b909450915073ffffffffffffffffffffffffffffffffffffffff84163014156121955761217388848484612545565b6121908884845a85604051806020016040528060008152506125e9565b612220565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906121ed908b90879087908790600401613a68565b600060405180830381600087803b15801561220757600080fd5b505af115801561221b573d6000803e3d6000fd5b505050505b61231e565b866060015180602001905181019061223d919061321e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90612296908b9087908690600401613a37565b602060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e8919061384f565b61231e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613bca565b5050505050505050565b6123358484846000612e33565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610ad760008585855a866125e9565b8151815181146123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141fe603d913960400191505060405180910390fd5b60005b8181101561243d576124358585838151811061241257fe5b602002602001015185848151811061242657fe5b60200260200101516001612e33565b6001016123fa565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156124eb5781810151838201526020016124d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561252a578181015183820152602001612512565b5050505090500194505050505060405180910390a450505050565b6125528483836001612e33565b61255f8383836000612e33565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126088573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15781810151838201526020016126a9565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561271157600080fd5b5087f1158015612725573d6000803e3d6000fd5b50505050506040513d602081101561273c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806142a46047913960600191505060405180910390fd5b8151835114612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806143e7603e913960400191505060405180910390fd5b8251156129545760008061284e856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320858452909152812054875193955091935091612897919084908890859061191a57fe5b86519091508360015b8281101561291b576128b78982815181106106b157fe5b90965094508186146129005773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61291184868a848151811061191a57fe5b93506001016128a0565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a015781810151838201526020016129e9565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a40578181015183820152602001612a28565b5050505090500194505050505060405180910390a4610ad760008585855a86611bd9565b600080825111612abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613fec6037913960400191505060405180910390fd5b81600183510381518110612acf57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180614366603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612bdd575060016103a4565b6103a182612fe9565b60006020840263ffffffff82846001811115612bfe57fe5b1415612ccc5784821b8701925086831015612c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b64010000000087831c8216860110612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b612def565b6001846001811115612cda57fe5b1415612d9e5784821b8703925086831115612d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b84818389901c161015612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806143a26045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612e2c57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612e3f85610bd3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612e7f90828686612be6565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b60208310612f8757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f4a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112613081578081fd5b813561309461308f82613eb8565b613e94565b8181529150602080830190848101818402860182018710156130b557600080fd5b60005b848110156130d4578135845292820192908201906001016130b8565b505050505092915050565b600082601f8301126130ef578081fd5b81356130fd61308f82613ed6565b915080825283602082850101111561311457600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261313d578081fd5b815161314b61308f82613ed6565b915080825283602082850101111561316257600080fd5b613173816020840160208601613f16565b5092915050565b60006080828403121561318b578081fd5b6040516080810167ffffffffffffffff82821081831117156131a957fe5b816040528293508451835260208501516020840152604085015191506131ce82613f42565b81604084015260608501519150808211156131e857600080fd5b506131f58582860161312d565b6060830152505092915050565b600060208284031215613213578081fd5b8135612e2c81613f42565b60006020828403121561322f578081fd5b8151612e2c81613f42565b6000806040838503121561324c578081fd5b825161325781613f42565b6020939093015192949293505050565b60008060408385031215613279578182fd5b823561328481613f42565b9150602083013561329481613f42565b809150509250929050565b60008060008060008060c087890312156132b7578182fd5b86356132c281613f42565b955060208701356132d281613f42565b9450604087013567ffffffffffffffff808211156132ee578384fd5b6132fa8a838b01613071565b9550606089013591508082111561330f578384fd5b61331b8a838b01613071565b94506080890135915061332d82613f67565b90925060a08801359080821115613342578283fd5b5061334f89828a016130df565b9150509295509295509295565b600080600080600060a08688031215613373578081fd5b853561337e81613f42565b9450602086013561338e81613f42565b9350604086013567ffffffffffffffff808211156133aa578283fd5b6133b689838a01613071565b945060608801359150808211156133cb578283fd5b6133d789838a01613071565b935060808801359150808211156133ec578283fd5b506133f9888289016130df565b9150509295509295909350565b600080600080600060a0868803121561341d578081fd5b853561342881613f42565b9450602086013561343881613f42565b9350604086013561344881613f67565b9250606086013561345881613f67565b9150608086013567ffffffffffffffff811115613473578182fd5b6133f9888289016130df565b60008060008060008060c08789031215613497578384fd5b86356134a281613f42565b955060208701356134b281613f42565b9450604087013593506060870135925060808701356134d081613f67565b915060a087013567ffffffffffffffff8111156134eb578182fd5b61334f89828a016130df565b600080600080600060a0868803121561350e578283fd5b853561351981613f42565b9450602086013561352981613f42565b93506040860135925060608601359150608086013567ffffffffffffffff811115613473578182fd5b600080600060608486031215613566578081fd5b833561357181613f42565b9250602084013567ffffffffffffffff8082111561358d578283fd5b61359987838801613071565b935060408601359150808211156135ae578283fd5b506135bb86828701613071565b9150509250925092565b600080600080608085870312156135da578182fd5b84356135e581613f42565b9350602085013567ffffffffffffffff80821115613601578384fd5b61360d88838901613071565b94506040870135915080821115613622578384fd5b61362e88838901613071565b93506060870135915080821115613643578283fd5b50613650878288016130df565b91505092959194509250565b6000806040838503121561366e578182fd5b823561367981613f42565b9150602083013561329481613f67565b6000806000806080858703121561369e578182fd5b84356136a981613f42565b935060208501359250604085013567ffffffffffffffff808211156136cc578384fd5b61362e888389016130df565b600080604083850312156136ea578182fd5b82356136f581613f42565b946020939093013593505050565b600080600060608486031215613717578081fd5b833561372281613f42565b95602085013595506040909401359392505050565b6000806000806080858703121561374c578182fd5b843561375781613f42565b93506020850135925060408501359150606085013567ffffffffffffffff811115613780578182fd5b613650878288016130df565b6000806040838503121561379e578182fd5b823567ffffffffffffffff808211156137b5578384fd5b818501915085601f8301126137c8578384fd5b81356137d661308f82613eb8565b80828252602080830192508086018a8283870289010111156137f6578889fd5b8896505b8487101561382157803561380d81613f42565b8452600196909601959281019281016137fa565b509096508701359350505080821115613838578283fd5b5061384585828601613071565b9150509250929050565b600060208284031215613860578081fd5b8151612e2c81613f67565b60006020828403121561387c578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612e2c578182fd5b600080604083850312156138bd578182fd5b825167ffffffffffffffff808211156138d4578384fd5b6138e08683870161312d565b935060208501519150808211156138f5578283fd5b506138458582860161312d565b600060208284031215613913578081fd5b815167ffffffffffffffff811115613929578182fd5b61163b8482850161317a565b60008060408385031215613947578182fd5b825167ffffffffffffffff8082111561395e578384fd5b6138e08683870161317a565b60006020828403121561397b578081fd5b5035919050565b60008060408385031215613994578182fd5b50508035926020909101359150565b815160009082906020808601845b838110156139cd578151855293820193908201906001016139b1565b50929695505050505050565b600084516139eb818460208901613f16565b91909101928352506020820152604001919050565b60008451613a12818460208901613f16565b82018481528351613a2a816020808501908801613f16565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613ae557835183529284019291840191600101613ac9565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613b98816040850160208701613f16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613eb057fe5b604052919050565b600067ffffffffffffffff821115613ecc57fe5b5060209081020190565b600067ffffffffffffffff821115613eea57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613f31578181015183820152602001613f19565b83811115610ad75750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613f6457600080fd5b50565b8015158114613f6457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122019be05877fb85bb8642e043044f9c6ceb709fe50b18d08c0aa3d18114927e9bd64736f6c63430007040033"; +var _bytecode = "0x60c06040523480156200001157600080fd5b5060405162004715380380620047158339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620046de6037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516145c56200011960003980610bfb5280610c27525080610c585280610cb95280612cc35280612d8152506145c56000f3fe608060405234801561001057600080fd5b506004361061016b5760003560e01c8063bd7a6c41116100cd578063e985e9c511610081578063f242432a11610066578063f242432a1461032b578063f5d4c8201461033e578063fa4e12d7146103515761016b565b8063e985e9c514610305578063eaec5f81146103185761016b565b8063d7a0ad90116100b2578063d7a0ad90146102c9578063db90e83c146102dc578063ddcc74ab146102fd5761016b565b8063bd7a6c41146102a3578063ce0b514b146102b65761016b565b8063437ecbe911610124578063a22cb46511610109578063a22cb4651461026a578063a3d4926e1461027d578063a3f091f5146102905761016b565b8063437ecbe9146102375780634e1273f41461024a5761016b565b80630e89341c116101555780630e89341c146101ef5780632d0335ab1461020f5780632eb2c2d6146102225761016b565b8062fdd58e146101a657806301ffc9a7146101cf575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613f59565b60405180910390fd5b6101b96101b4366004613811565b610364565b6040516101c69190613fb6565b60405180910390f35b6101e26101dd3660046139a4565b6103b9565b6040516101c69190613c2a565b6102026101fd366004613aa3565b6103cc565b6040516101c69190613cb2565b6101b961021d36600461333b565b61051f565b610235610230366004613495565b610547565b005b61023561024536600461383c565b610652565b61025d6102583660046138c5565b610662565b6040516101c69190613be6565b610235610278366004613795565b6108e1565b61023561028b3660046133d8565b61097a565b61023561029e366004613870565b610aee565b6102356102b136600461368b565b610b00565b6102356102c43660046135b8565b610b0b565b6102356102d73660046136fe565b610bea565b6102ef6102ea366004613aa3565b610bf6565b6040516101c6929190613fbf565b6101b9610c56565b6101e26103133660046133a0565b610c7a565b6101b9610326366004613abb565b610cb5565b610235610339366004613630565b610d07565b61023561034c36600461353f565b610e0b565b6101e261035f3660046137c2565b610f3b565b600080600061037284610bf6565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506103b09082610cb5565b95945050505050565b60006103c48261171c565b90505b919050565b606060036103d983611779565b60405160200180838054600181600116156101000203166002900480156104375780601f10610415576101008083540402835291820191610437565b820191906000526020600020905b815481529060010190602001808311610423575b5050825160208401908083835b6020831061048157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610444565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061057057506105708533610c7a565b6105c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806142fb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806140e8603d913960400191505060405180910390fd5b61063d858585856118a5565b61064b858585855a86611cb2565b5050505050565b61065d838383611f1f565b505050565b815181516060919081146106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806140af6039913960400191505060405180910390fd5b6000806106e1856000815181106106d457fe5b6020026020010151610bf6565b915091506000806000886000815181106106f757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561076b57600080fd5b50604051908082528060200260200182016040528015610795578160200160208202803683370190505b5090506107a28385610cb5565b816000815181106107af57fe5b602090810291909101015260015b868110156108d4576107d48982815181106106d457fe5b9096509450828614158061083d57508981815181106107ef57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061081c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156108ab576000808b838151811061085157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108b58486610cb5565b8282815181106108c157fe5b60209081029190910101526001016107bd565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e79565b60606109d161316c565b6060610a8489857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c604051602001610a0f9190613adc565b604051602081830303815290604052805190602001208c604051602001610a369190613adc565b604051602081830303815290604052805190602001208c610a58576000610a5b565b60015b604051602001610a7096959493929190613c35565b604051602081830303815290604052611f89565b9050610a92898989896118a5565b8415610ad55780806020019051810190610aac9190613a6e565b8094508193505050610ac689898989866020015188611cb2565b610ad08983612158565b610ae3565b610ae3898989895a86611cb2565b505050505050505050565b610afa84848484612401565b50505050565b61065d838383612475565b73ffffffffffffffffffffffffffffffffffffffff8516610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e1b565b6060610b6261316c565b6060610b9a89857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a58576000610a5b565b9050610ba88989898961261e565b8415610bdc5780806020019051810190610bc29190613a6e565b8094508193505050610ac6898989898660200151886126c2565b610ae3898989895a866126c2565b610afa848484846128b3565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610c2257fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610c4e57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610d305750610d308533610c7a565b610d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141c96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610df1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806144676038913960400191505060405180910390fd5b610dfd8585858561261e565b61064b858585855a866126c2565b6060610e6786837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610e41576000610e44565b60015b89610e50576000610e53565b60015b604051602001610a70959493929190613c76565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610efb908890613c2a565b60405180910390a38215610f3357610f1161316c565b81806020019051810190610f259190613a3b565b9050610f318782612158565b505b505050505050565b600080825111610f96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806144246043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611002576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806143aa6033913960400191505060405180910390fd5b600061100d83612b3d565b60f81c90506005811061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b60008160ff16600581111561107c57fe5b905060008080808085600581111561109057fe5b14156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142006036913960400191505060405180910390fd5b60018560058111156110f557fe5b1415611238578751606114611155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b611160886000612bfa565b925061116d886020612bfa565b91508760408151811061117c57fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156111e6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506117149650505050505050565b600285600581111561124657fe5b14156113965787516061146112a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b6112b1886000612bfa565b92506112be886020612bfa565b9150876040815181106112cd57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156111e6573d6000803e3d6000fd5b60038560058111156113a457fe5b141561155c57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561143257818101518382015260200161141a565b50505050905090810190601f16801561145f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561149257818101518382015260200161147a565b50505050905090810190601f1680156114bf5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b600485600581111561156a57fe5b14156116c357604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156115fa5781810151838201526020016115e2565b50505050905090810190601f1680156116275780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561164557600080fd5b505afa158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611770575060016103c7565b6103c482612c62565b6060816117ba575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103c7565b818060005b82156117d357600101600a830492506117bf565b60608167ffffffffffffffff811180156117ec57600080fd5b506040519080825280601f01601f191660200182016040528015611817576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561189b57600a840660300160f81b8282806001900393508151811061186157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061183e565b5095945050505050565b815181518114611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806142366042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561193c5750600081115b15611b0e57600080611954856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916119ac919084908890859061199d57fe5b60200260200101516001612cbf565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611a0291908590899085906119f357fe5b60200260200101516000612cbf565b90508360015b86811015611abc57611a1f8982815181106106d457fe5b9096509450818614611a8e5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a9f84868a848151811061199d57fe5b9350611ab283868a84815181106119f357fe5b9250600101611a08565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611bab565b60005b81811015611ba957828181518110611b2557fe5b6020026020010151611b4a87868481518110611b3d57fe5b6020026020010151610364565b1015611ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143746036913960400191505060405180910390fd5b600101611b11565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611c57578181015183820152602001611c3f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611c96578181015183820152602001611c7e565b5050505090500194505050505060405180910390a45050505050565b611cd18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611d89578181015183820152602001611d71565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611dc8578181015183820152602001611db0565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611e04578181015183820152602001611dec565b50505050905090810190601f168015611e315780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611e5657600080fd5b5087f1158015611e6a573d6000803e3d6000fd5b50505050506040513d6020811015611e8157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180614278604c913960600191505060405180910390fd5b611f2c8383836001612f6c565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611fa091906139e4565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611fd8836041612bfa565b9050818110801590611fec57508160640181105b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d60565b600061205e8683878051906020012060405160200161204393929190613b12565b60405160208183030381529060405280519060200120612ff3565b9050606086838760405160200161207793929190613b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161210291613fb6565b60405180910390a261211689838388610f3b565b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613dbd565b50505050509392505050565b60006121678260600151612b3d565b60f81c9050600281106121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613efc565b60008160ff1660028111156121b757fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff16156121ed5786604001516121ef565b335b925060008560028111156121ff57fe5b14156122fe57866060015180602001905181019061221d9190613373565b909450915073ffffffffffffffffffffffffffffffffffffffff841630141561226e5761224c8884848461261e565b6122698884845a85604051806020016040528060008152506126c2565b6122f9565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906122c6908b90879087908790600401613ba1565b600060405180830381600087803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505050505b6123f7565b86606001518060200190518101906123169190613357565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd9061236f908b9087908690600401613b70565b602060405180830381600087803b15801561238957600080fd5b505af115801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613988565b6123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d03565b5050505050505050565b61240e8484846000612f6c565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610afa60008585855a866126c2565b8151815181146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614337603d913960400191505060405180910390fd5b60005b818110156125165761250e858583815181106124eb57fe5b60200260200101518584815181106124ff57fe5b60200260200101516001612f6c565b6001016124d3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156125c45781810151838201526020016125ac565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126035781810151838201526020016125eb565b5050505090500194505050505060405180910390a450505050565b61262b8483836001612f6c565b6126388383836000612f6c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126e18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561279a578181015183820152602001612782565b50505050905090810190601f1680156127c75780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156127ea57600080fd5b5087f11580156127fe573d6000803e3d6000fd5b50505050506040513d602081101561281557600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806143dd6047913960600191505060405180910390fd5b815183511461290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614520603e913960400191505060405180910390fd5b825115612a2d57600080612927856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161297091908490889085906119f357fe5b86519091508360015b828110156129f4576129908982815181106106d457fe5b90965094508186146129d95773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6129ea84868a84815181106119f357fe5b9350600101612979565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ada578181015183820152602001612ac2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612b19578181015183820152602001612b01565b5050505090500194505050505060405180910390a4610afa60008585855a86611cb2565b600080825111612b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141256037913960400191505060405180910390fd5b81600183510381518110612ba857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061449f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612cb6575060016103c7565b6103c482613122565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115612d1957fe5b1415612e055784821b8701925086831015612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b612f28565b6001846001811115612e1357fe5b1415612ed75784821b8703925086831115612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b84818389901c161015612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806144db6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612f6557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612f7885610bf6565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612fb890828686612cbf565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b602083106130c057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613083565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126131ba578081fd5b81356131cd6131c882613ff1565b613fcd565b8181529150602080830190848101818402860182018710156131ee57600080fd5b60005b8481101561320d578135845292820192908201906001016131f1565b505050505092915050565b600082601f830112613228578081fd5b81356132366131c88261400f565b915080825283602082850101111561324d57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613276578081fd5b81516132846131c88261400f565b915080825283602082850101111561329b57600080fd5b6132ac81602084016020860161404f565b5092915050565b6000608082840312156132c4578081fd5b6040516080810167ffffffffffffffff82821081831117156132e257fe5b816040528293508451835260208501516020840152604085015191506133078261407b565b816040840152606085015191508082111561332157600080fd5b5061332e85828601613266565b6060830152505092915050565b60006020828403121561334c578081fd5b8135612f658161407b565b600060208284031215613368578081fd5b8151612f658161407b565b60008060408385031215613385578081fd5b82516133908161407b565b6020939093015192949293505050565b600080604083850312156133b2578182fd5b82356133bd8161407b565b915060208301356133cd8161407b565b809150509250929050565b60008060008060008060c087890312156133f0578182fd5b86356133fb8161407b565b9550602087013561340b8161407b565b9450604087013567ffffffffffffffff80821115613427578384fd5b6134338a838b016131aa565b95506060890135915080821115613448578384fd5b6134548a838b016131aa565b945060808901359150613466826140a0565b90925060a0880135908082111561347b578283fd5b5061348889828a01613218565b9150509295509295509295565b600080600080600060a086880312156134ac578081fd5b85356134b78161407b565b945060208601356134c78161407b565b9350604086013567ffffffffffffffff808211156134e3578283fd5b6134ef89838a016131aa565b94506060880135915080821115613504578283fd5b61351089838a016131aa565b93506080880135915080821115613525578283fd5b5061353288828901613218565b9150509295509295909350565b600080600080600060a08688031215613556578081fd5b85356135618161407b565b945060208601356135718161407b565b93506040860135613581816140a0565b92506060860135613591816140a0565b9150608086013567ffffffffffffffff8111156135ac578182fd5b61353288828901613218565b60008060008060008060c087890312156135d0578384fd5b86356135db8161407b565b955060208701356135eb8161407b565b945060408701359350606087013592506080870135613609816140a0565b915060a087013567ffffffffffffffff811115613624578182fd5b61348889828a01613218565b600080600080600060a08688031215613647578283fd5b85356136528161407b565b945060208601356136628161407b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135ac578182fd5b60008060006060848603121561369f578081fd5b83356136aa8161407b565b9250602084013567ffffffffffffffff808211156136c6578283fd5b6136d2878388016131aa565b935060408601359150808211156136e7578283fd5b506136f4868287016131aa565b9150509250925092565b60008060008060808587031215613713578182fd5b843561371e8161407b565b9350602085013567ffffffffffffffff8082111561373a578384fd5b613746888389016131aa565b9450604087013591508082111561375b578384fd5b613767888389016131aa565b9350606087013591508082111561377c578283fd5b5061378987828801613218565b91505092959194509250565b600080604083850312156137a7578182fd5b82356137b28161407b565b915060208301356133cd816140a0565b600080600080608085870312156137d7578182fd5b84356137e28161407b565b935060208501359250604085013567ffffffffffffffff80821115613805578384fd5b61376788838901613218565b60008060408385031215613823578182fd5b823561382e8161407b565b946020939093013593505050565b600080600060608486031215613850578081fd5b833561385b8161407b565b95602085013595506040909401359392505050565b60008060008060808587031215613885578182fd5b84356138908161407b565b93506020850135925060408501359150606085013567ffffffffffffffff8111156138b9578182fd5b61378987828801613218565b600080604083850312156138d7578182fd5b823567ffffffffffffffff808211156138ee578384fd5b818501915085601f830112613901578384fd5b813561390f6131c882613ff1565b80828252602080830192508086018a82838702890101111561392f578889fd5b8896505b8487101561395a5780356139468161407b565b845260019690960195928101928101613933565b509096508701359350505080821115613971578283fd5b5061397e858286016131aa565b9150509250929050565b600060208284031215613999578081fd5b8151612f65816140a0565b6000602082840312156139b5578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612f65578182fd5b600080604083850312156139f6578182fd5b825167ffffffffffffffff80821115613a0d578384fd5b613a1986838701613266565b93506020850151915080821115613a2e578283fd5b5061397e85828601613266565b600060208284031215613a4c578081fd5b815167ffffffffffffffff811115613a62578182fd5b611714848285016132b3565b60008060408385031215613a80578182fd5b825167ffffffffffffffff80821115613a97578384fd5b613a19868387016132b3565b600060208284031215613ab4578081fd5b5035919050565b60008060408385031215613acd578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015613b0657815185529382019390820190600101613aea565b50929695505050505050565b60008451613b2481846020890161404f565b91909101928352506020820152604001919050565b60008451613b4b81846020890161404f565b82018481528351613b6381602080850190880161404f565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613cd181604085016020870161404f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613fe957fe5b604052919050565b600067ffffffffffffffff82111561400557fe5b5060209081020190565b600067ffffffffffffffff82111561402357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561406a578181015183820152602001614052565b83811115610afa5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461409d57600080fd5b50565b801515811461409d57600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220b93982974cd4d959f0f4fbc62d1e794e237e7a37f6c49d9f46719f5cdb53c13164736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/adapter/factories/ERC1155MetaPackedBalance__factory.js b/src/gen/adapter/factories/ERC1155MetaPackedBalance__factory.js index 5b8ab7c..14cdc90 100644 --- a/src/gen/adapter/factories/ERC1155MetaPackedBalance__factory.js +++ b/src/gen/adapter/factories/ERC1155MetaPackedBalance__factory.js @@ -2,46 +2,17 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); exports.__esModule = true; exports.ERC1155MetaPackedBalance__factory = void 0; var ethers_1 = require("ethers"); -var ERC1155MetaPackedBalance__factory = /** @class */ (function (_super) { - __extends(ERC1155MetaPackedBalance__factory, _super); - function ERC1155MetaPackedBalance__factory(signer) { - return _super.call(this, _abi, _bytecode, signer) || this; +var ERC1155MetaPackedBalance__factory = /** @class */ (function () { + function ERC1155MetaPackedBalance__factory() { } - ERC1155MetaPackedBalance__factory.prototype.deploy = function (overrides) { - return _super.prototype.deploy.call(this, overrides || {}); - }; - ERC1155MetaPackedBalance__factory.prototype.getDeployTransaction = function (overrides) { - return _super.prototype.getDeployTransaction.call(this, overrides || {}); - }; - ERC1155MetaPackedBalance__factory.prototype.attach = function (address) { - return _super.prototype.attach.call(this, address); - }; - ERC1155MetaPackedBalance__factory.prototype.connect = function (signer) { - return _super.prototype.connect.call(this, signer); - }; ERC1155MetaPackedBalance__factory.connect = function (address, signerOrProvider) { return new ethers_1.Contract(address, _abi, signerOrProvider); }; return ERC1155MetaPackedBalance__factory; -}(ethers_1.ContractFactory)); +}()); exports.ERC1155MetaPackedBalance__factory = ERC1155MetaPackedBalance__factory; var _abi = [ { @@ -162,6 +133,19 @@ var _abi = [ name: "TransferSingle", type: "event" }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + }, + ], + stateMutability: "view", + type: "function" + }, { inputs: [ { @@ -231,7 +215,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -274,7 +258,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -548,4 +532,3 @@ var _abi = [ type: "function" }, ]; -var _bytecode = "0x608060405234801561001057600080fd5b506138d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063ce0b514b1161008c578063eaec5f8111610066578063eaec5f81146101ec578063f242432a146101ff578063f5d4c82014610212578063fa4e12d714610225576100e9565b8063ce0b514b146101a5578063db90e83c146101b8578063e985e9c5146101d9576100e9565b80632eb2c2d6116100c85780632eb2c2d61461014a5780634e1273f41461015f578063a22cb4651461017f578063a3d4926e14610192576100e9565b8062fdd58e146100ee57806301ffc9a7146101175780632d0335ab14610137575b600080fd5b6101016100fc366004612ccb565b610238565b60405161010e9190613339565b60405180910390f35b61012a610125366004612dd5565b61028d565b60405161010e919061305b565b6101016101453660046128d1565b6102f2565b61015d610158366004612a2b565b61031a565b005b61017261016d366004612cf6565b610425565b60405161010e9190613017565b61015d61018d366004612c21565b6106a4565b61015d6101a036600461296e565b61073d565b61015d6101b3366004612b4e565b6108ba565b6101cb6101c6366004612ed4565b610999565b60405161010e929190613342565b61012a6101e7366004612936565b6109a6565b6101016101fa366004612eec565b6109e1565b61015d61020d366004612bc6565b6109f4565b61015d610220366004612ad5565b610af8565b61012a610233366004612c4e565b610c28565b600080600061024684610999565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061028490826109e1565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156102e1575060016102ed565b6102ea82611409565b90505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff86161480610343575061034385336109a6565b610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613682603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061346f603d913960400191505060405180910390fd5b61041085858585611453565b61041e858585855a86611860565b5050505050565b81518151606091908114610484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806134366039913960400191505060405180910390fd5b6000806104a48560008151811061049757fe5b6020026020010151610999565b915091506000806000886000815181106104ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561052e57600080fd5b50604051908082528060200260200182016040528015610558578160200160208202803683370190505b50905061056583856109e1565b8160008151811061057257fe5b602090810291909101015260015b868110156106975761059789828151811061049757fe5b9096509450828614158061060057508981815181106105b257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106105df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561066e576000808b838151811061061457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b61067884866109e1565b82828151811061068457fe5b6020908102919091010152600101610580565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8516610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613259565b60405180910390fd5b606061079d612702565b606061085089857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016107db9190612f0d565b604051602081830303815290604052805190602001208c6040516020016108029190612f0d565b604051602081830303815290604052805190602001208c610824576000610827565b60015b60405160200161083c96959493929190613066565b604051602081830303815290604052611acd565b905061085e89898989611453565b84156108a157808060200190518101906108789190612e9f565b809450819350505061089289898989866020015188611860565b61089c8983611c9c565b6108af565b6108af898989895a86611860565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906131fb565b6060610911612702565b606061094989857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610824576000610827565b905061095789898989611f45565b841561098b57808060200190518101906109719190612e9f565b809450819350505061089289898989866020015188611fe9565b6108af898989895a86611fe9565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610a1d5750610a1d85336109a6565b610a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806135506037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806137b16038913960400191505060405180910390fd5b610aea85858585611f45565b61041e858585855a86611fe9565b6060610b5486837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610b2e576000610b31565b60015b89610b3d576000610b40565b60015b60405160200161083c9594939291906130a7565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610be890889061305b565b60405180910390a38215610c2057610bfe612702565b81806020019051810190610c129190612e6c565b9050610c1e8782611c9c565b505b505050505050565b600080825111610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604381526020018061376e6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806136f46033913960400191505060405180910390fd5b6000610cfa836121da565b60f81c905060058110610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b60008160ff166005811115610d6957fe5b9050600080808080856005811115610d7d57fe5b1415610dd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806135876036913960400191505060405180910390fd5b6001856005811115610de257fe5b1415610f25578751606114610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610e4d886000612297565b9250610e5a886020612297565b915087604081518110610e6957fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ed3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506114019650505050505050565b6002856005811115610f3357fe5b1415611083578751606114610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610f9e886000612297565b9250610fab886020612297565b915087604081518110610fba57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015610ed3573d6000803e3d6000fd5b600385600581111561109157fe5b141561124957604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b600485600581111561125757fe5b14156113b057604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156112e75781810151838201526020016112cf565b50505050905090810190601f1680156113145780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b8151815181146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806135bd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156114ea5750600081115b156116bc576000806115028560008151811061049757fe5b73ffffffffffffffffffffffffffffffffffffffff891660009081526020818152604080832085845290915281205487519395509193509161155a919084908890859061154b57fe5b602002602001015160016122ff565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320878452909152812054875192935090916115b091908590899085906115a157fe5b602002602001015160006122ff565b90508360015b8681101561166a576115cd89828151811061049757fe5b909650945081861461163c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b61164d84868a848151811061154b57fe5b935061166083868a84815181106115a157fe5b92506001016115b6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611759565b60005b81811015611757578281815181106116d357fe5b60200260200101516116f8878684815181106116eb57fe5b6020026020010151610238565b101561174f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806136be6036913960400191505060405180910390fd5b6001016116bf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118055781810151838201526020016117ed565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561184457818101518382015260200161182c565b5050505090500194505050505060405180910390a45050505050565b61187f8573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561193757818101518382015260200161191f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561197657818101518382015260200161195e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119b257818101518382015260200161199a565b50505050905090810190601f1680156119df5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611a0457600080fd5b5087f1158015611a18573d6000803e3d6000fd5b50505050506040513d6020811015611a2f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806135ff604c913960600191505060405180910390fd5b60608083806020019051810190611ae49190612e15565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611b1c836041612297565b9050818110801590611b3057508160640181105b611b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613140565b6000611ba286838780519060200120604051602001611b8793929190612f43565b6040516020818303038152906040528051906020012061254c565b90506060868387604051602001611bbb93929190612f6a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf5991611c4691613339565b60405180910390a2611c5a89838388610c28565b611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a9061319d565b50505050509392505050565b6000611cab82606001516121da565b60f81c905060028110611cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906132dc565b60008160ff166002811115611cfb57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615611d31578660400151611d33565b335b92506000856002811115611d4357fe5b1415611e42578660600151806020019051810190611d619190612909565b909450915073ffffffffffffffffffffffffffffffffffffffff8416301415611db257611d9088848484611f45565b611dad8884845a8560405180602001604052806000815250611fe9565b611e3d565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a90611e0a908b90879087908790600401612fd2565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b611f3b565b8660600151806020019051810190611e5a91906128ed565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90611eb3908b9087908690600401612fa1565b602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f059190612db9565b611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906130e3565b5050505050505050565b611f52848383600161267b565b611f5f838383600061267b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6120088573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c15781810151838201526020016120a9565b50505050905090810190601f1680156120ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561211157600080fd5b5087f1158015612125573d6000803e3d6000fd5b50505050506040513d602081101561213c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806137276047913960600191505060405180910390fd5b600080825111612235576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806134ac6037913960400191505060405180910390fd5b8160018351038151811061224557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b600081602001835110156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806137e9603c913960400191505060405180910390fd5b50016020015190565b60006020840263ffffffff8284600181111561231757fe5b14156123e55784821b870192508683101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b64010000000087831c82168601106123e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b612508565b60018460018111156123f357fe5b14156124b75784821b8703925086831115612459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b84818389901c1610156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806138256045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061254557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b6020831061261957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016125dc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b60008061268785610999565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126c7908286866122ff565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112612750578081fd5b813561276361275e82613374565b613350565b81815291506020808301908481018184028601820187101561278457600080fd5b60005b848110156127a357813584529282019290820190600101612787565b505050505092915050565b600082601f8301126127be578081fd5b81356127cc61275e82613392565b91508082528360208285010111156127e357600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261280c578081fd5b815161281a61275e82613392565b915080825283602082850101111561283157600080fd5b6128428160208401602086016133d2565b5092915050565b60006080828403121561285a578081fd5b6040516080810167ffffffffffffffff828210818311171561287857fe5b8160405282935084518352602085015160208401526040850151915061289d82613402565b81604084015260608501519150808211156128b757600080fd5b506128c4858286016127fc565b6060830152505092915050565b6000602082840312156128e2578081fd5b813561254581613402565b6000602082840312156128fe578081fd5b815161254581613402565b6000806040838503121561291b578081fd5b825161292681613402565b6020939093015192949293505050565b60008060408385031215612948578182fd5b823561295381613402565b9150602083013561296381613402565b809150509250929050565b60008060008060008060c08789031215612986578182fd5b863561299181613402565b955060208701356129a181613402565b9450604087013567ffffffffffffffff808211156129bd578384fd5b6129c98a838b01612740565b955060608901359150808211156129de578384fd5b6129ea8a838b01612740565b9450608089013591506129fc82613427565b90925060a08801359080821115612a11578283fd5b50612a1e89828a016127ae565b9150509295509295509295565b600080600080600060a08688031215612a42578081fd5b8535612a4d81613402565b94506020860135612a5d81613402565b9350604086013567ffffffffffffffff80821115612a79578283fd5b612a8589838a01612740565b94506060880135915080821115612a9a578283fd5b612aa689838a01612740565b93506080880135915080821115612abb578283fd5b50612ac8888289016127ae565b9150509295509295909350565b600080600080600060a08688031215612aec578081fd5b8535612af781613402565b94506020860135612b0781613402565b93506040860135612b1781613427565b92506060860135612b2781613427565b9150608086013567ffffffffffffffff811115612b42578182fd5b612ac8888289016127ae565b60008060008060008060c08789031215612b66578384fd5b8635612b7181613402565b95506020870135612b8181613402565b945060408701359350606087013592506080870135612b9f81613427565b915060a087013567ffffffffffffffff811115612bba578182fd5b612a1e89828a016127ae565b600080600080600060a08688031215612bdd578283fd5b8535612be881613402565b94506020860135612bf881613402565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b42578182fd5b60008060408385031215612c33578182fd5b8235612c3e81613402565b9150602083013561296381613427565b60008060008060808587031215612c63578182fd5b8435612c6e81613402565b935060208501359250604085013567ffffffffffffffff80821115612c91578384fd5b612c9d888389016127ae565b93506060870135915080821115612cb2578283fd5b50612cbf878288016127ae565b91505092959194509250565b60008060408385031215612cdd578182fd5b8235612ce881613402565b946020939093013593505050565b60008060408385031215612d08578182fd5b823567ffffffffffffffff80821115612d1f578384fd5b818501915085601f830112612d32578384fd5b8135612d4061275e82613374565b80828252602080830192508086018a828387028901011115612d60578889fd5b8896505b84871015612d8b578035612d7781613402565b845260019690960195928101928101612d64565b509096508701359350505080821115612da2578283fd5b50612daf85828601612740565b9150509250929050565b600060208284031215612dca578081fd5b815161254581613427565b600060208284031215612de6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612545578182fd5b60008060408385031215612e27578182fd5b825167ffffffffffffffff80821115612e3e578384fd5b612e4a868387016127fc565b93506020850151915080821115612e5f578283fd5b50612daf858286016127fc565b600060208284031215612e7d578081fd5b815167ffffffffffffffff811115612e93578182fd5b61140184828501612849565b60008060408385031215612eb1578182fd5b825167ffffffffffffffff80821115612ec8578384fd5b612e4a86838701612849565b600060208284031215612ee5578081fd5b5035919050565b60008060408385031215612efe578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015612f3757815185529382019390820190600101612f1b565b50929695505050505050565b60008451612f558184602089016133d2565b91909101928352506020820152604001919050565b60008451612f7c8184602089016133d2565b82018481528351612f948160208085019088016133d2565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b8181101561304f57835183529284019291840191600101613033565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561336c57fe5b604052919050565b600067ffffffffffffffff82111561338857fe5b5060209081020190565b600067ffffffffffffffff8211156133a657fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156133ed5781810151838201526020016133d5565b838111156133fc576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461342457600080fd5b50565b801515811461342457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212205897b43ca940988411a9f040c1ba519b60953d2345ff071831c70be55f1e60f664736f6c63430007040033"; diff --git a/src/gen/adapter/factories/ERC1155MintBurnPackedBalanceMock__factory.js b/src/gen/adapter/factories/ERC1155MintBurnPackedBalanceMock__factory.js index 984e033..47bf202 100644 --- a/src/gen/adapter/factories/ERC1155MintBurnPackedBalanceMock__factory.js +++ b/src/gen/adapter/factories/ERC1155MintBurnPackedBalanceMock__factory.js @@ -25,11 +25,11 @@ var ERC1155MintBurnPackedBalanceMock__factory = /** @class */ (function (_super) function ERC1155MintBurnPackedBalanceMock__factory(signer) { return _super.call(this, _abi, _bytecode, signer) || this; } - ERC1155MintBurnPackedBalanceMock__factory.prototype.deploy = function (overrides) { - return _super.prototype.deploy.call(this, overrides || {}); + ERC1155MintBurnPackedBalanceMock__factory.prototype.deploy = function (_idsBitsSize, overrides) { + return _super.prototype.deploy.call(this, _idsBitsSize, overrides || {}); }; - ERC1155MintBurnPackedBalanceMock__factory.prototype.getDeployTransaction = function (overrides) { - return _super.prototype.getDeployTransaction.call(this, overrides || {}); + ERC1155MintBurnPackedBalanceMock__factory.prototype.getDeployTransaction = function (_idsBitsSize, overrides) { + return _super.prototype.getDeployTransaction.call(this, _idsBitsSize, overrides || {}); }; ERC1155MintBurnPackedBalanceMock__factory.prototype.attach = function (address) { return _super.prototype.attach.call(this, address); @@ -44,6 +44,17 @@ var ERC1155MintBurnPackedBalanceMock__factory = /** @class */ (function (_super) }(ethers_1.ContractFactory)); exports.ERC1155MintBurnPackedBalanceMock__factory = ERC1155MintBurnPackedBalanceMock__factory; var _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256" + }, + ], + stateMutability: "nonpayable", + type: "constructor" + }, { anonymous: false, inputs: [ @@ -166,6 +177,19 @@ var _abi = [ stateMutability: "nonpayable", type: "fallback" }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + }, + ], + stateMutability: "view", + type: "function" + }, { inputs: [ { @@ -309,7 +333,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -333,7 +357,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -511,4 +535,4 @@ var _abi = [ type: "function" }, ]; -var _bytecode = "0x608060405234801561001057600080fd5b50612796806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063a3f091f51161008c578063db90e83c11610066578063db90e83c14610221578063e985e9c514610242578063eaec5f8114610255578063f242432a14610268576100e9565b8063a3f091f5146101e8578063bd7a6c41146101fb578063d7a0ad901461020e576100e9565b80632eb2c2d6116100c85780632eb2c2d61461018d578063437ecbe9146101a25780634e1273f4146101b5578063a22cb465146101d5576100e9565b8062fdd58e1461012457806301ffc9a71461014d5780630e89341c1461016d575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011b90612359565b60405180910390fd5b6101376101323660046120b1565b61027b565b60405161014491906123b6565b60405180910390f35b61016061015b366004612220565b6102d0565b60405161014491906122dd565b61018061017b366004612260565b6102e3565b60405161014491906122e8565b6101a061019b366004611e68565b610436565b005b6101a06101b03660046120da565b610541565b6101c86101c336600461215f565b610551565b6040516101449190612299565b6101a06101e3366004612077565b6107d0565b6101a06101f636600461210c565b610869565b6101a0610209366004611f71565b61087b565b6101a061021c366004611fe2565b610886565b61023461022f366004612260565b610892565b6040516101449291906123bf565b610160610250366004611e36565b61089f565b610137610263366004612278565b6108da565b6101a0610276366004611f0e565b6108ed565b600080600061028984610892565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102c790826108da565b95945050505050565b60006102db826109f1565b90505b919050565b606060026102f083610a4e565b604051602001808380546001816001161561010002031660029004801561034e5780601f1061032c57610100808354040283529182019161034e565b820191906000526020600020905b81548152906001019060200180831161033a575b5050825160208401908083835b6020831061039857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161035b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061045f575061045f853361089f565b6104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061257e603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612449603d913960400191505060405180910390fd5b61052c85858585610b7a565b61053a858585855a86610f87565b5050505050565b61054c8383836111fe565b505050565b815181516060919081146105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806124106039913960400191505060405180910390fd5b6000806105d0856000815181106105c357fe5b6020026020010151610892565b915091506000806000886000815181106105e657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561065a57600080fd5b50604051908082528060200260200182016040528015610684578160200160208202803683370190505b50905061069183856108da565b8160008151811061069e57fe5b602090810291909101015260015b868110156107c3576106c38982815181106105c357fe5b9096509450828614158061072c57508981815181106106de57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061070b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561079a576000808b838151811061074057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107a484866108da565b8282815181106107b057fe5b60209081029190910101526001016106ac565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61087584848484611268565b50505050565b61054c8383836112dc565b61087584848484611485565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff861614806109165750610916853361089f565b61096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806124b96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806126746038913960400191505060405180910390fd5b6109e38585858561170f565b61053a858585855a866117b3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610a45575060016102de565b6102db826119a4565b606081610a8f575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102de565b818060005b8215610aa857600101600a83049250610a94565b60608167ffffffffffffffff81118015610ac157600080fd5b506040519080825280601f01601f191660200182016040528015610aec576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610b7057600a840660300160f81b82828060019003935081518110610b3657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610b13565b5095945050505050565b815181518114610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806124f06042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610c115750600081115b15610de357600080610c29856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610c819190849088908590610c7257fe5b60200260200101516001611a01565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610cd79190859089908590610cc857fe5b60200260200101516000611a01565b90508360015b86811015610d9157610cf48982815181106105c357fe5b9096509450818614610d635773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610d7484868a8481518110610c7257fe5b9350610d8783868a8481518110610cc857fe5b9250600101610cdd565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610e80565b60005b81811015610e7e57828181518110610dfa57fe5b6020026020010151610e1f87868481518110610e1257fe5b602002602001015161027b565b1015610e76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806125f76036913960400191505060405180910390fd5b600101610de6565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f2c578181015183820152602001610f14565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610f6b578181015183820152602001610f53565b5050505090500194505050505060405180910390a45050505050565b610fa68573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561105e578181015183820152602001611046565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561109d578181015183820152602001611085565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110d95781810151838201526020016110c1565b50505050905090810190601f1680156111065780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561112b57600080fd5b5087f115801561113f573d6000803e3d6000fd5b50505050506040513d602081101561115657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180612532604c913960600191505060405180910390fd5b505b505050505050565b61120b8383836001611c4e565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b6112758484846000611c4e565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461087560008585855a866117b3565b815181518114611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806125ba603d913960400191505060405180910390fd5b60005b8181101561137d576113758585838151811061135257fe5b602002602001015185848151811061136657fe5b60200260200101516001611c4e565b60010161133a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561142b578181015183820152602001611413565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561146a578181015183820152602001611452565b5050505090500194505050505060405180910390a450505050565b81518351146114df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806126f1603e913960400191505060405180910390fd5b8251156115ff576000806114f9856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916115429190849088908590610cc857fe5b86519091508360015b828110156115c6576115628982815181106105c357fe5b90965094508186146115ab5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6115bc84868a8481518110610cc857fe5b935060010161154b565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116ac578181015183820152602001611694565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156116eb5781810151838201526020016116d3565b5050505090500194505050505060405180910390a461087560008585855a86610f87565b61171c8483836001611c4e565b6117298383836000611c4e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6117d28573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561188b578181015183820152602001611873565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156118db57600080fd5b5087f11580156118ef573d6000803e3d6000fd5b50505050506040513d602081101561190657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604781526020018061262d6047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156119f8575060016102de565b6102db82611cd5565b60006020840263ffffffff82846001811115611a1957fe5b1415611ae75784821b8701925086831015611a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b64010000000087831c8216860110611ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b611c0a565b6001846001811115611af557fe5b1415611bb95784821b8703925086831115611b5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b84818389901c161015611ae2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806126ac6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611c4757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611c5a85610892565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611c9a90828686611a01565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102de57600080fd5b600082601f830112611d53578081fd5b8135611d66611d61826123f1565b6123cd565b818152915060208083019084810181840286018201871015611d8757600080fd5b60005b84811015611da657813584529282019290820190600101611d8a565b505050505092915050565b600082601f830112611dc1578081fd5b813567ffffffffffffffff811115611dd557fe5b611e0660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cd565b9150808252836020828501011115611e1d57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611e48578182fd5b611e5183611d1f565b9150611e5f60208401611d1f565b90509250929050565b600080600080600060a08688031215611e7f578081fd5b611e8886611d1f565b9450611e9660208701611d1f565b9350604086013567ffffffffffffffff80821115611eb2578283fd5b611ebe89838a01611d43565b94506060880135915080821115611ed3578283fd5b611edf89838a01611d43565b93506080880135915080821115611ef4578283fd5b50611f0188828901611db1565b9150509295509295909350565b600080600080600060a08688031215611f25578081fd5b611f2e86611d1f565b9450611f3c60208701611d1f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f65578182fd5b611f0188828901611db1565b600080600060608486031215611f85578283fd5b611f8e84611d1f565b9250602084013567ffffffffffffffff80821115611faa578384fd5b611fb687838801611d43565b93506040860135915080821115611fcb578283fd5b50611fd886828701611d43565b9150509250925092565b60008060008060808587031215611ff7578384fd5b61200085611d1f565b9350602085013567ffffffffffffffff8082111561201c578485fd5b61202888838901611d43565b9450604087013591508082111561203d578384fd5b61204988838901611d43565b9350606087013591508082111561205e578283fd5b5061206b87828801611db1565b91505092959194509250565b60008060408385031215612089578182fd5b61209283611d1f565b9150602083013580151581146120a6578182fd5b809150509250929050565b600080604083850312156120c3578182fd5b6120cc83611d1f565b946020939093013593505050565b6000806000606084860312156120ee578283fd5b6120f784611d1f565b95602085013595506040909401359392505050565b60008060008060808587031215612121578384fd5b61212a85611d1f565b93506020850135925060408501359150606085013567ffffffffffffffff811115612153578182fd5b61206b87828801611db1565b60008060408385031215612171578081fd5b823567ffffffffffffffff80821115612188578283fd5b818501915085601f83011261219b578283fd5b81356121a9611d61826123f1565b80828252602080830192508086018a8283870289010111156121c9578788fd5b8796505b848710156121f2576121de81611d1f565b8452600196909601959281019281016121cd565b509096508701359350505080821115612209578283fd5b5061221685828601611d43565b9150509250929050565b600060208284031215612231578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c47578182fd5b600060208284031215612271578081fd5b5035919050565b6000806040838503121561228a578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156122d1578351835292840192918401916001016122b5565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b81811015612314578581018301518582016040015282016122f8565b818111156123255783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123e957fe5b604052919050565b600067ffffffffffffffff82111561240557fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220cfaa0248ab3cd2216b2aa8933fcad401337cc5abff0d89fa02c42db1a3fc41cb64736f6c63430007040033"; +var _bytecode = "0x60c06040523480156200001157600080fd5b5060405162002a0f38038062002a0f8339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620029d86037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516128bf62000119600039806108aa52806108d652508061090752806109685280611ace5280611b8c52506128bf6000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c8063a3f091f511610097578063ddcc74ab11610066578063ddcc74ab1461024d578063e985e9c514610255578063eaec5f8114610268578063f242432a1461027b576100f4565b8063a3f091f5146101f3578063bd7a6c4114610206578063d7a0ad9014610219578063db90e83c1461022c576100f4565b80632eb2c2d6116100d35780632eb2c2d614610198578063437ecbe9146101ad5780634e1273f4146101c0578063a22cb465146101e0576100f4565b8062fdd58e1461012f57806301ffc9a7146101585780630e89341c14610178575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012690612482565b60405180910390fd5b61014261013d3660046121da565b61028e565b60405161014f91906124df565b60405180910390f35b61016b610166366004612349565b6102e3565b60405161014f9190612406565b61018b610186366004612389565b6102f6565b60405161014f9190612411565b6101ab6101a6366004611f91565b610449565b005b6101ab6101bb366004612203565b610554565b6101d36101ce366004612288565b610564565b60405161014f91906123c2565b6101ab6101ee3660046121a0565b6107e3565b6101ab610201366004612235565b61087c565b6101ab61021436600461209a565b61088e565b6101ab61022736600461210b565b610899565b61023f61023a366004612389565b6108a5565b60405161014f9291906124e8565b610142610905565b61016b610263366004611f5f565b610929565b6101426102763660046123a1565b610964565b6101ab610289366004612037565b6109b6565b600080600061029c846108a5565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102da9082610964565b95945050505050565b60006102ee82610aba565b90505b919050565b6060600261030383610b17565b60405160200180838054600181600116156101000203166002900480156103615780601f1061033f576101008083540402835291820191610361565b820191906000526020600020905b81548152906001019060200180831161034d575b5050825160208401908083835b602083106103ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161036e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061047257506104728533610929565b6104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806126a7603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612572603d913960400191505060405180910390fd5b61053f85858585610c43565b61054d858585855a86611050565b5050505050565b61055f8383836112c7565b505050565b815181516060919081146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806125396039913960400191505060405180910390fd5b6000806105e3856000815181106105d657fe5b60200260200101516108a5565b915091506000806000886000815181106105f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561066d57600080fd5b50604051908082528060200260200182016040528015610697578160200160208202803683370190505b5090506106a48385610964565b816000815181106106b157fe5b602090810291909101015260015b868110156107d6576106d68982815181106105d657fe5b9096509450828614158061073f57508981815181106106f157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061071e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156107ad576000808b838151811061075357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107b78486610964565b8282815181106107c357fe5b60209081029190910101526001016106bf565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61088884848484611331565b50505050565b61055f8383836113a5565b6108888484848461154e565b6000807f000000000000000000000000000000000000000000000000000000000000000083816108d157fe5b0491507f000000000000000000000000000000000000000000000000000000000000000083816108fd57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff861614806109df57506109df8533610929565b610a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806125e26037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061279d6038913960400191505060405180910390fd5b610aac858585856117d8565b61054d858585855a8661187c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610b0e575060016102f1565b6102ee82611a6d565b606081610b58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102f1565b818060005b8215610b7157600101600a83049250610b5d565b60608167ffffffffffffffff81118015610b8a57600080fd5b506040519080825280601f01601f191660200182016040528015610bb5576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610c3957600a840660300160f81b82828060019003935081518110610bff57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610bdc565b5095945050505050565b815181518114610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806126196042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610cda5750600081115b15610eac57600080610cf2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610d4a9190849088908590610d3b57fe5b60200260200101516001611aca565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610da09190859089908590610d9157fe5b60200260200101516000611aca565b90508360015b86811015610e5a57610dbd8982815181106105d657fe5b9096509450818614610e2c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610e3d84868a8481518110610d3b57fe5b9350610e5083868a8481518110610d9157fe5b9250600101610da6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610f49565b60005b81811015610f4757828181518110610ec357fe5b6020026020010151610ee887868481518110610edb57fe5b602002602001015161028e565b1015610f3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806127206036913960400191505060405180910390fd5b600101610eaf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610ff5578181015183820152602001610fdd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561103457818101518382015260200161101c565b5050505090500194505050505060405180910390a45050505050565b61106f8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561112757818101518382015260200161110f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561116657818101518382015260200161114e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156111a257818101518382015260200161118a565b50505050905090810190601f1680156111cf5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b1580156111f457600080fd5b5087f1158015611208573d6000803e3d6000fd5b50505050506040513d602081101561121f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061265b604c913960600191505060405180910390fd5b505b505050505050565b6112d48383836001611d77565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b61133e8484846000611d77565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461088860008585855a8661187c565b815181518114611400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806126e3603d913960400191505060405180910390fd5b60005b818110156114465761143e8585838151811061141b57fe5b602002602001015185848151811061142f57fe5b60200260200101516001611d77565b600101611403565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156114f45781810151838201526020016114dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561153357818101518382015260200161151b565b5050505090500194505050505060405180910390a450505050565b81518351146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061281a603e913960400191505060405180910390fd5b8251156116c8576000806115c2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161160b9190849088908590610d9157fe5b86519091508360015b8281101561168f5761162b8982815181106105d657fe5b90965094508186146116745773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61168584868a8481518110610d9157fe5b9350600101611614565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561177557818101518382015260200161175d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117b457818101518382015260200161179c565b5050505090500194505050505060405180910390a461088860008585855a86611050565b6117e58483836001611d77565b6117f28383836000611d77565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61189b8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561195457818101518382015260200161193c565b50505050905090810190601f1680156119815780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156119a457600080fd5b5087f11580156119b8573d6000803e3d6000fd5b50505050506040513d60208110156119cf57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806127566047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415611ac1575060016102f1565b6102ee82611dfe565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115611b2457fe5b1415611c105784821b8701925086831015611b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b611d33565b6001846001811115611c1e57fe5b1415611ce25784821b8703925086831115611c84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b84818389901c161015611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806127d56045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611d7057507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611d83856108a5565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611dc390828686611aca565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102f157600080fd5b600082601f830112611e7c578081fd5b8135611e8f611e8a8261251a565b6124f6565b818152915060208083019084810181840286018201871015611eb057600080fd5b60005b84811015611ecf57813584529282019290820190600101611eb3565b505050505092915050565b600082601f830112611eea578081fd5b813567ffffffffffffffff811115611efe57fe5b611f2f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016124f6565b9150808252836020828501011115611f4657600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611f71578182fd5b611f7a83611e48565b9150611f8860208401611e48565b90509250929050565b600080600080600060a08688031215611fa8578081fd5b611fb186611e48565b9450611fbf60208701611e48565b9350604086013567ffffffffffffffff80821115611fdb578283fd5b611fe789838a01611e6c565b94506060880135915080821115611ffc578283fd5b61200889838a01611e6c565b9350608088013591508082111561201d578283fd5b5061202a88828901611eda565b9150509295509295909350565b600080600080600060a0868803121561204e578081fd5b61205786611e48565b945061206560208701611e48565b93506040860135925060608601359150608086013567ffffffffffffffff81111561208e578182fd5b61202a88828901611eda565b6000806000606084860312156120ae578283fd5b6120b784611e48565b9250602084013567ffffffffffffffff808211156120d3578384fd5b6120df87838801611e6c565b935060408601359150808211156120f4578283fd5b5061210186828701611e6c565b9150509250925092565b60008060008060808587031215612120578384fd5b61212985611e48565b9350602085013567ffffffffffffffff80821115612145578485fd5b61215188838901611e6c565b94506040870135915080821115612166578384fd5b61217288838901611e6c565b93506060870135915080821115612187578283fd5b5061219487828801611eda565b91505092959194509250565b600080604083850312156121b2578182fd5b6121bb83611e48565b9150602083013580151581146121cf578182fd5b809150509250929050565b600080604083850312156121ec578182fd5b6121f583611e48565b946020939093013593505050565b600080600060608486031215612217578283fd5b61222084611e48565b95602085013595506040909401359392505050565b6000806000806080858703121561224a578384fd5b61225385611e48565b93506020850135925060408501359150606085013567ffffffffffffffff81111561227c578182fd5b61219487828801611eda565b6000806040838503121561229a578081fd5b823567ffffffffffffffff808211156122b1578283fd5b818501915085601f8301126122c4578283fd5b81356122d2611e8a8261251a565b80828252602080830192508086018a8283870289010111156122f2578788fd5b8796505b8487101561231b5761230781611e48565b8452600196909601959281019281016122f6565b509096508701359350505080821115612332578283fd5b5061233f85828601611e6c565b9150509250929050565b60006020828403121561235a578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611d70578182fd5b60006020828403121561239a578081fd5b5035919050565b600080604083850312156123b3578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156123fa578351835292840192918401916001016123de565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b8181101561243d57858101830151858201604001528201612421565b8181111561244e5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561251257fe5b604052919050565b600067ffffffffffffffff82111561252e57fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e9eceed9bc148fc04098eeda967b30a4621c103e39102ff8f1c6a325aa15da3e64736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/adapter/factories/ERC1155MintBurnPackedBalance__factory.js b/src/gen/adapter/factories/ERC1155MintBurnPackedBalance__factory.js index c19f8e0..695a5d8 100644 --- a/src/gen/adapter/factories/ERC1155MintBurnPackedBalance__factory.js +++ b/src/gen/adapter/factories/ERC1155MintBurnPackedBalance__factory.js @@ -25,11 +25,11 @@ var ERC1155MintBurnPackedBalance__factory = /** @class */ (function (_super) { function ERC1155MintBurnPackedBalance__factory(signer) { return _super.call(this, _abi, _bytecode, signer) || this; } - ERC1155MintBurnPackedBalance__factory.prototype.deploy = function (overrides) { - return _super.prototype.deploy.call(this, overrides || {}); + ERC1155MintBurnPackedBalance__factory.prototype.deploy = function (_idsBitsSize, overrides) { + return _super.prototype.deploy.call(this, _idsBitsSize, overrides || {}); }; - ERC1155MintBurnPackedBalance__factory.prototype.getDeployTransaction = function (overrides) { - return _super.prototype.getDeployTransaction.call(this, overrides || {}); + ERC1155MintBurnPackedBalance__factory.prototype.getDeployTransaction = function (_idsBitsSize, overrides) { + return _super.prototype.getDeployTransaction.call(this, _idsBitsSize, overrides || {}); }; ERC1155MintBurnPackedBalance__factory.prototype.attach = function (address) { return _super.prototype.attach.call(this, address); @@ -44,6 +44,17 @@ var ERC1155MintBurnPackedBalance__factory = /** @class */ (function (_super) { }(ethers_1.ContractFactory)); exports.ERC1155MintBurnPackedBalance__factory = ERC1155MintBurnPackedBalance__factory; var _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256" + }, + ], + stateMutability: "nonpayable", + type: "constructor" + }, { anonymous: false, inputs: [ @@ -143,6 +154,19 @@ var _abi = [ name: "TransferSingle", type: "event" }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + }, + ], + stateMutability: "view", + type: "function" + }, { inputs: [ { @@ -212,7 +236,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -236,7 +260,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -367,4 +391,4 @@ var _abi = [ type: "function" }, ]; -var _bytecode = "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122016d211e8d7ce96dd72d95f3bf7388c9f0a939a36f9dd3414b2dd60a18209e35d64736f6c63430007040033"; +var _bytecode = "0x60c060405234801561001057600080fd5b50604051611e1a380380611e1a8339818101604052602081101561003357600080fd5b505180610100811080156100505750806101008161004d57fe5b06155b6100a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de36037913960400191505060405180910390fd5b608081905280610100816100b557fe5b0460a052505060805160a051611cf16100f260003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122024d596a506a0fa20fb9dbabc6455c7aad0aef6bfa1553bbb3a8b6aa09f7d6af664736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/adapter/factories/ERC1155PackedBalance__factory.js b/src/gen/adapter/factories/ERC1155PackedBalance__factory.js index 3fd6529..9bf6a63 100644 --- a/src/gen/adapter/factories/ERC1155PackedBalance__factory.js +++ b/src/gen/adapter/factories/ERC1155PackedBalance__factory.js @@ -25,11 +25,11 @@ var ERC1155PackedBalance__factory = /** @class */ (function (_super) { function ERC1155PackedBalance__factory(signer) { return _super.call(this, _abi, _bytecode, signer) || this; } - ERC1155PackedBalance__factory.prototype.deploy = function (overrides) { - return _super.prototype.deploy.call(this, overrides || {}); + ERC1155PackedBalance__factory.prototype.deploy = function (_idsBitsSize, overrides) { + return _super.prototype.deploy.call(this, _idsBitsSize, overrides || {}); }; - ERC1155PackedBalance__factory.prototype.getDeployTransaction = function (overrides) { - return _super.prototype.getDeployTransaction.call(this, overrides || {}); + ERC1155PackedBalance__factory.prototype.getDeployTransaction = function (_idsBitsSize, overrides) { + return _super.prototype.getDeployTransaction.call(this, _idsBitsSize, overrides || {}); }; ERC1155PackedBalance__factory.prototype.attach = function (address) { return _super.prototype.attach.call(this, address); @@ -44,6 +44,17 @@ var ERC1155PackedBalance__factory = /** @class */ (function (_super) { }(ethers_1.ContractFactory)); exports.ERC1155PackedBalance__factory = ERC1155PackedBalance__factory; var _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256" + }, + ], + stateMutability: "nonpayable", + type: "constructor" + }, { anonymous: false, inputs: [ @@ -143,6 +154,19 @@ var _abi = [ name: "TransferSingle", type: "event" }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256" + }, + ], + stateMutability: "view", + type: "function" + }, { inputs: [ { @@ -212,7 +236,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -236,7 +260,7 @@ var _abi = [ type: "uint256" }, ], - stateMutability: "pure", + stateMutability: "view", type: "function" }, { @@ -367,4 +391,4 @@ var _abi = [ type: "function" }, ]; -var _bytecode = "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122086dcb9e8276fb8960941393e4916f63931eba4a32b7a348a28b7172cc63ca14d64736f6c63430007040033"; +var _bytecode = "0x60c060405234801561001057600080fd5b50604051611e18380380611e188339818101604052602081101561003357600080fd5b50516101008110801561004f5750806101008161004c57fe5b06155b6100a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de16037913960400191505060405180910390fd5b608081905280610100816100b457fe5b0460a0525060805160a051611cf16100f060003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e7e6bb069cbf5f70df75d93ef378d3f4973c734157f1b98614c00dec99423b5264736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/typechain/ERC1155MetaMintBurnPackedBalanceMock.d.ts b/src/gen/typechain/ERC1155MetaMintBurnPackedBalanceMock.d.ts index 642597c..c1e3ad9 100644 --- a/src/gen/typechain/ERC1155MetaMintBurnPackedBalanceMock.d.ts +++ b/src/gen/typechain/ERC1155MetaMintBurnPackedBalanceMock.d.ts @@ -22,6 +22,7 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface ERC1155MetaMintBurnPackedBalanceMockInterface extends ethers.utils.Interface { functions: { + "IDS_BITS_SIZE()": FunctionFragment; "balanceOf(address,uint256)": FunctionFragment; "balanceOfBatch(address[],uint256[])": FunctionFragment; "batchBurnMock(address,uint256[],uint256[])": FunctionFragment; @@ -43,6 +44,10 @@ interface ERC1155MetaMintBurnPackedBalanceMockInterface "uri(uint256)": FunctionFragment; }; + encodeFunctionData( + functionFragment: "IDS_BITS_SIZE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "balanceOf", values: [string, BigNumberish] @@ -114,6 +119,10 @@ interface ERC1155MetaMintBurnPackedBalanceMockInterface ): string; encodeFunctionData(functionFragment: "uri", values: [BigNumberish]): string; + decodeFunctionResult( + functionFragment: "IDS_BITS_SIZE", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; decodeFunctionResult( functionFragment: "balanceOfBatch", @@ -235,6 +244,10 @@ export class ERC1155MetaMintBurnPackedBalanceMock extends Contract { interface: ERC1155MetaMintBurnPackedBalanceMockInterface; functions: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise<[BigNumber]>; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise<[BigNumber]>; + balanceOf( _owner: string, _id: BigNumberish, @@ -503,6 +516,10 @@ export class ERC1155MetaMintBurnPackedBalanceMock extends Contract { ): Promise<[string]>; }; + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -765,6 +782,10 @@ export class ERC1155MetaMintBurnPackedBalanceMock extends Contract { "uri(uint256)"(_id: BigNumberish, overrides?: CallOverrides): Promise; callStatic: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -1089,6 +1110,10 @@ export class ERC1155MetaMintBurnPackedBalanceMock extends Contract { }; estimateGas: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -1355,6 +1380,10 @@ export class ERC1155MetaMintBurnPackedBalanceMock extends Contract { }; populateTransaction: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, diff --git a/src/gen/typechain/ERC1155MetaPackedBalance.d.ts b/src/gen/typechain/ERC1155MetaPackedBalance.d.ts index 4b7e176..3b9240d 100644 --- a/src/gen/typechain/ERC1155MetaPackedBalance.d.ts +++ b/src/gen/typechain/ERC1155MetaPackedBalance.d.ts @@ -21,6 +21,7 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface ERC1155MetaPackedBalanceInterface extends ethers.utils.Interface { functions: { + "IDS_BITS_SIZE()": FunctionFragment; "balanceOf(address,uint256)": FunctionFragment; "balanceOfBatch(address[],uint256[])": FunctionFragment; "getIDBinIndex(uint256)": FunctionFragment; @@ -37,6 +38,10 @@ interface ERC1155MetaPackedBalanceInterface extends ethers.utils.Interface { "supportsInterface(bytes4)": FunctionFragment; }; + encodeFunctionData( + functionFragment: "IDS_BITS_SIZE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "balanceOf", values: [string, BigNumberish] @@ -91,6 +96,10 @@ interface ERC1155MetaPackedBalanceInterface extends ethers.utils.Interface { values: [BytesLike] ): string; + decodeFunctionResult( + functionFragment: "IDS_BITS_SIZE", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; decodeFunctionResult( functionFragment: "balanceOfBatch", @@ -199,6 +208,10 @@ export class ERC1155MetaPackedBalance extends Contract { interface: ERC1155MetaPackedBalanceInterface; functions: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise<[BigNumber]>; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise<[BigNumber]>; + balanceOf( _owner: string, _id: BigNumberish, @@ -400,6 +413,10 @@ export class ERC1155MetaPackedBalance extends Contract { ): Promise<[boolean]>; }; + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -598,6 +615,10 @@ export class ERC1155MetaPackedBalance extends Contract { ): Promise; callStatic: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -850,6 +871,10 @@ export class ERC1155MetaPackedBalance extends Contract { }; estimateGas: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -1049,6 +1074,10 @@ export class ERC1155MetaPackedBalance extends Contract { }; populateTransaction: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, diff --git a/src/gen/typechain/ERC1155MintBurnPackedBalance.d.ts b/src/gen/typechain/ERC1155MintBurnPackedBalance.d.ts index 1e65ca0..fc8830f 100644 --- a/src/gen/typechain/ERC1155MintBurnPackedBalance.d.ts +++ b/src/gen/typechain/ERC1155MintBurnPackedBalance.d.ts @@ -21,6 +21,7 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface ERC1155MintBurnPackedBalanceInterface extends ethers.utils.Interface { functions: { + "IDS_BITS_SIZE()": FunctionFragment; "balanceOf(address,uint256)": FunctionFragment; "balanceOfBatch(address[],uint256[])": FunctionFragment; "getIDBinIndex(uint256)": FunctionFragment; @@ -32,6 +33,10 @@ interface ERC1155MintBurnPackedBalanceInterface extends ethers.utils.Interface { "supportsInterface(bytes4)": FunctionFragment; }; + encodeFunctionData( + functionFragment: "IDS_BITS_SIZE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "balanceOf", values: [string, BigNumberish] @@ -69,6 +74,10 @@ interface ERC1155MintBurnPackedBalanceInterface extends ethers.utils.Interface { values: [BytesLike] ): string; + decodeFunctionResult( + functionFragment: "IDS_BITS_SIZE", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; decodeFunctionResult( functionFragment: "balanceOfBatch", @@ -158,6 +167,10 @@ export class ERC1155MintBurnPackedBalance extends Contract { interface: ERC1155MintBurnPackedBalanceInterface; functions: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise<[BigNumber]>; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise<[BigNumber]>; + balanceOf( _owner: string, _id: BigNumberish, @@ -275,6 +288,10 @@ export class ERC1155MintBurnPackedBalance extends Contract { ): Promise<[boolean]>; }; + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -392,6 +409,10 @@ export class ERC1155MintBurnPackedBalance extends Contract { ): Promise; callStatic: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -555,6 +576,10 @@ export class ERC1155MintBurnPackedBalance extends Contract { }; estimateGas: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -673,6 +698,10 @@ export class ERC1155MintBurnPackedBalance extends Contract { }; populateTransaction: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, diff --git a/src/gen/typechain/ERC1155MintBurnPackedBalanceMock.d.ts b/src/gen/typechain/ERC1155MintBurnPackedBalanceMock.d.ts index 5b43948..d201afa 100644 --- a/src/gen/typechain/ERC1155MintBurnPackedBalanceMock.d.ts +++ b/src/gen/typechain/ERC1155MintBurnPackedBalanceMock.d.ts @@ -22,6 +22,7 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface ERC1155MintBurnPackedBalanceMockInterface extends ethers.utils.Interface { functions: { + "IDS_BITS_SIZE()": FunctionFragment; "balanceOf(address,uint256)": FunctionFragment; "balanceOfBatch(address[],uint256[])": FunctionFragment; "batchBurnMock(address,uint256[],uint256[])": FunctionFragment; @@ -38,6 +39,10 @@ interface ERC1155MintBurnPackedBalanceMockInterface "uri(uint256)": FunctionFragment; }; + encodeFunctionData( + functionFragment: "IDS_BITS_SIZE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "balanceOf", values: [string, BigNumberish] @@ -92,6 +97,10 @@ interface ERC1155MintBurnPackedBalanceMockInterface ): string; encodeFunctionData(functionFragment: "uri", values: [BigNumberish]): string; + decodeFunctionResult( + functionFragment: "IDS_BITS_SIZE", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; decodeFunctionResult( functionFragment: "balanceOfBatch", @@ -194,6 +203,10 @@ export class ERC1155MintBurnPackedBalanceMock extends Contract { interface: ERC1155MintBurnPackedBalanceMockInterface; functions: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise<[BigNumber]>; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise<[BigNumber]>; + balanceOf( _owner: string, _id: BigNumberish, @@ -378,6 +391,10 @@ export class ERC1155MintBurnPackedBalanceMock extends Contract { ): Promise<[string]>; }; + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -559,6 +576,10 @@ export class ERC1155MintBurnPackedBalanceMock extends Contract { "uri(uint256)"(_id: BigNumberish, overrides?: CallOverrides): Promise; callStatic: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -794,6 +815,10 @@ export class ERC1155MintBurnPackedBalanceMock extends Contract { }; estimateGas: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -979,6 +1004,10 @@ export class ERC1155MintBurnPackedBalanceMock extends Contract { }; populateTransaction: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, diff --git a/src/gen/typechain/ERC1155PackedBalance.d.ts b/src/gen/typechain/ERC1155PackedBalance.d.ts index cd570f6..90f8dc6 100644 --- a/src/gen/typechain/ERC1155PackedBalance.d.ts +++ b/src/gen/typechain/ERC1155PackedBalance.d.ts @@ -21,6 +21,7 @@ import { TypedEventFilter, TypedEvent, TypedListener } from "./commons"; interface ERC1155PackedBalanceInterface extends ethers.utils.Interface { functions: { + "IDS_BITS_SIZE()": FunctionFragment; "balanceOf(address,uint256)": FunctionFragment; "balanceOfBatch(address[],uint256[])": FunctionFragment; "getIDBinIndex(uint256)": FunctionFragment; @@ -32,6 +33,10 @@ interface ERC1155PackedBalanceInterface extends ethers.utils.Interface { "supportsInterface(bytes4)": FunctionFragment; }; + encodeFunctionData( + functionFragment: "IDS_BITS_SIZE", + values?: undefined + ): string; encodeFunctionData( functionFragment: "balanceOf", values: [string, BigNumberish] @@ -69,6 +74,10 @@ interface ERC1155PackedBalanceInterface extends ethers.utils.Interface { values: [BytesLike] ): string; + decodeFunctionResult( + functionFragment: "IDS_BITS_SIZE", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; decodeFunctionResult( functionFragment: "balanceOfBatch", @@ -158,6 +167,10 @@ export class ERC1155PackedBalance extends Contract { interface: ERC1155PackedBalanceInterface; functions: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise<[BigNumber]>; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise<[BigNumber]>; + balanceOf( _owner: string, _id: BigNumberish, @@ -275,6 +288,10 @@ export class ERC1155PackedBalance extends Contract { ): Promise<[boolean]>; }; + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -392,6 +409,10 @@ export class ERC1155PackedBalance extends Contract { ): Promise; callStatic: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -555,6 +576,10 @@ export class ERC1155PackedBalance extends Contract { }; estimateGas: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, @@ -673,6 +698,10 @@ export class ERC1155PackedBalance extends Contract { }; populateTransaction: { + IDS_BITS_SIZE(overrides?: CallOverrides): Promise; + + "IDS_BITS_SIZE()"(overrides?: CallOverrides): Promise; + balanceOf( _owner: string, _id: BigNumberish, diff --git a/src/gen/typechain/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.ts b/src/gen/typechain/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.ts index 48ea916..d6c2fc8 100644 --- a/src/gen/typechain/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.ts +++ b/src/gen/typechain/factories/ERC1155MetaMintBurnPackedBalanceMock__factory.ts @@ -2,7 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, Contract, ContractFactory, Overrides } from "ethers"; +import { + Signer, + BigNumberish, + Contract, + ContractFactory, + Overrides, +} from "ethers"; import { Provider, TransactionRequest } from "@ethersproject/providers"; import type { ERC1155MetaMintBurnPackedBalanceMock } from "../ERC1155MetaMintBurnPackedBalanceMock"; @@ -13,16 +19,19 @@ export class ERC1155MetaMintBurnPackedBalanceMock__factory extends ContractFacto } deploy( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): Promise { return super.deploy( + _idsBitsSize, overrides || {} ) as Promise; } getDeployTransaction( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): TransactionRequest { - return super.getDeployTransaction(overrides || {}); + return super.getDeployTransaction(_idsBitsSize, overrides || {}); } attach(address: string): ERC1155MetaMintBurnPackedBalanceMock { return super.attach(address) as ERC1155MetaMintBurnPackedBalanceMock; @@ -45,6 +54,17 @@ export class ERC1155MetaMintBurnPackedBalanceMock__factory extends ContractFacto } const _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, { anonymous: false, inputs: [ @@ -186,6 +206,19 @@ const _abi = [ stateMutability: "nonpayable", type: "fallback", }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -329,7 +362,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -372,7 +405,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -695,4 +728,4 @@ const _abi = [ ]; const _bytecode = - "0x608060405234801561001057600080fd5b5061448c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101505760003560e01c8063a3f091f5116100cd578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5d4c8201461031b578063fa4e12d71461032e57610150565b8063e985e9c5146102e2578063eaec5f81146102f557610150565b8063ce0b514b116100b2578063ce0b514b1461029b578063d7a0ad90146102ae578063db90e83c146102c157610150565b8063a3f091f514610275578063bd7a6c411461028857610150565b80632eb2c2d6116101245780634e1273f4116101095780634e1273f41461022f578063a22cb4651461024f578063a3d4926e1461026257610150565b80632eb2c2d614610207578063437ecbe91461021c57610150565b8062fdd58e1461018b57806301ffc9a7146101b45780630e89341c146101d45780632d0335ab146101f4575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613e20565b60405180910390fd5b61019e6101993660046136d8565b610341565b6040516101ab9190613e7d565b60405180910390f35b6101c76101c236600461386b565b610396565b6040516101ab9190613af1565b6101e76101e236600461396a565b6103a9565b6040516101ab9190613b79565b61019e610202366004613202565b6104fc565b61021a61021536600461335c565b610524565b005b61021a61022a366004613703565b61062f565b61024261023d36600461378c565b61063f565b6040516101ab9190613aad565b61021a61025d36600461365c565b6108be565b61021a61027036600461329f565b610957565b61021a610283366004613737565b610acb565b61021a610296366004613552565b610add565b61021a6102a936600461347f565b610ae8565b61021a6102bc3660046135c5565b610bc7565b6102d46102cf36600461396a565b610bd3565b6040516101ab929190613e86565b6101c76102f0366004613267565b610be0565b61019e610303366004613982565b610c1b565b61021a6103163660046134f7565b610c2e565b61021a610329366004613406565b610d32565b6101c761033c366004613689565b610e62565b600080600061034f84610bd3565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610c1b565b95945050505050565b60006103a182611643565b90505b919050565b606060036103b6836116a0565b60405160200180838054600181600116156101000203166002900480156104145780601f106103f2576101008083540402835291820191610414565b820191906000526020600020905b815481529060010190602001808311610400575b5050825160208401908083835b6020831061045e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610421565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061054d575061054d8533610be0565b6105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806141c2603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613faf603d913960400191505060405180910390fd5b61061a858585856117cc565b610628858585855a86611bd9565b5050505050565b61063a838383611e46565b505050565b8151815160609190811461069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613f766039913960400191505060405180910390fd5b6000806106be856000815181106106b157fe5b6020026020010151610bd3565b915091506000806000886000815181106106d457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561074857600080fd5b50604051908082528060200260200182016040528015610772578160200160208202803683370190505b50905061077f8385610c1b565b8160008151811061078c57fe5b602090810291909101015260015b868110156108b1576107b18982815181106106b157fe5b9096509450828614158061081a57508981815181106107cc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106107f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610888576000808b838151811061082e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108928486610c1b565b82828151811061089e57fe5b602090810291909101015260010161079a565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613d40565b60606109ae613033565b6060610a6189857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016109ec91906139a3565b604051602081830303815290604052805190602001208c604051602001610a1391906139a3565b604051602081830303815290604052805190602001208c610a35576000610a38565b60015b604051602001610a4d96959493929190613afc565b604051602081830303815290604052611eb0565b9050610a6f898989896117cc565b8415610ab25780806020019051810190610a899190613935565b8094508193505050610aa389898989866020015188611bd9565b610aad898361207f565b610ac0565b610ac0898989895a86611bd9565b505050505050505050565b610ad784848484612328565b50505050565b61063a83838361239c565b73ffffffffffffffffffffffffffffffffffffffff8516610b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613ce2565b6060610b3f613033565b6060610b7789857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a35576000610a38565b9050610b8589898989612545565b8415610bb95780806020019051810190610b9f9190613935565b8094508193505050610aa3898989898660200151886125e9565b610ac0898989895a866125e9565b610ad7848484846127da565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c575750610c578533610be0565b610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806140906037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061432e6038913960400191505060405180910390fd5b610d2485858585612545565b610628858585855a866125e9565b6060610d8e86837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610d68576000610d6b565b60015b89610d77576000610d7a565b60015b604051602001610a4d959493929190613b3d565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610e22908890613af1565b60405180910390a38215610e5a57610e38613033565b81806020019051810190610e4c9190613902565b9050610e58878261207f565b505b505050505050565b600080825111610ebd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806142eb6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806142716033913960400191505060405180910390fd5b6000610f3483612a64565b60f81c905060058110610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b60008160ff166005811115610fa357fe5b9050600080808080856005811115610fb757fe5b141561100e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806140c76036913960400191505060405180910390fd5b600185600581111561101c57fe5b141561115f57875160611461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b611087886000612b21565b9250611094886020612b21565b9150876040815181106110a357fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561110d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d8116911614975061163b9650505050505050565b600285600581111561116d57fe5b14156112bd5787516061146111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061418b6037913960400191505060405180910390fd5b6111d8886000612b21565b92506111e5886020612b21565b9150876040815181106111f457fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561110d573d6000803e3d6000fd5b60038560058111156112cb57fe5b141561148357604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b83811015611359578181015183820152602001611341565b50505050905090810190601f1680156113865780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b15801561140557600080fd5b505afa158015611419573d6000803e3d6000fd5b505050506040513d602081101561142f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b600485600581111561149157fe5b14156115ea57604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b83811015611521578181015183820152602001611509565b50505050905090810190601f16801561154e5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d602081101561159657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061163b95505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614056603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611697575060016103a4565b6103a182612b89565b6060816116e1575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103a4565b818060005b82156116fa57600101600a830492506116e6565b60608167ffffffffffffffff8111801561171357600080fd5b506040519080825280601f01601f19166020018201604052801561173e576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b83156117c257600a840660300160f81b8282806001900393508151811061178857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611765565b5095945050505050565b815181518114611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806140fd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156118635750600081115b15611a355760008061187b856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118d391908490889085906118c457fe5b60200260200101516001612be6565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611929919085908990859061191a57fe5b60200260200101516000612be6565b90508360015b868110156119e3576119468982815181106106b157fe5b90965094508186146119b55773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b6119c684868a84815181106118c457fe5b93506119d983868a848151811061191a57fe5b925060010161192f565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611ad2565b60005b81811015611ad057828181518110611a4c57fe5b6020026020010151611a7187868481518110611a6457fe5b6020026020010151610341565b1015611ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061423b6036913960400191505060405180910390fd5b600101611a38565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611b7e578181015183820152602001611b66565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611bbd578181015183820152602001611ba5565b5050505090500194505050505060405180910390a45050505050565b611bf88573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611cb0578181015183820152602001611c98565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611cef578181015183820152602001611cd7565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611d2b578181015183820152602001611d13565b50505050905090810190601f168015611d585780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611d7d57600080fd5b5087f1158015611d91573d6000803e3d6000fd5b50505050506040513d6020811015611da857600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061413f604c913960600191505060405180910390fd5b611e538383836001612e33565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611ec791906138ab565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611eff836041612b21565b9050818110801590611f1357508160640181105b611f49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c27565b6000611f8586838780519060200120604051602001611f6a939291906139d9565b60405160208183030381529060405280519060200120612eba565b90506060868387604051602001611f9e93929190613a00565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161202991613e7d565b60405180910390a261203d89838388610e62565b612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613c84565b50505050509392505050565b600061208e8260600151612a64565b60f81c9050600281106120cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613dc3565b60008160ff1660028111156120de57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615612114578660400151612116565b335b9250600085600281111561212657fe5b1415612225578660600151806020019051810190612144919061323a565b909450915073ffffffffffffffffffffffffffffffffffffffff84163014156121955761217388848484612545565b6121908884845a85604051806020016040528060008152506125e9565b612220565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906121ed908b90879087908790600401613a68565b600060405180830381600087803b15801561220757600080fd5b505af115801561221b573d6000803e3d6000fd5b505050505b61231e565b866060015180602001905181019061223d919061321e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90612296908b9087908690600401613a37565b602060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e8919061384f565b61231e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161018290613bca565b5050505050505050565b6123358484846000612e33565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610ad760008585855a866125e9565b8151815181146123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806141fe603d913960400191505060405180910390fd5b60005b8181101561243d576124358585838151811061241257fe5b602002602001015185848151811061242657fe5b60200260200101516001612e33565b6001016123fa565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156124eb5781810151838201526020016124d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561252a578181015183820152602001612512565b5050505090500194505050505060405180910390a450505050565b6125528483836001612e33565b61255f8383836000612e33565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126088573ffffffffffffffffffffffffffffffffffffffff16612df9565b15610e5a5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126c15781810151838201526020016126a9565b50505050905090810190601f1680156126ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561271157600080fd5b5087f1158015612725573d6000803e3d6000fd5b50505050506040513d602081101561273c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806142a46047913960600191505060405180910390fd5b8151835114612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806143e7603e913960400191505060405180910390fd5b8251156129545760008061284e856000815181106106b157fe5b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320858452909152812054875193955091935091612897919084908890859061191a57fe5b86519091508360015b8281101561291b576128b78982815181106106b157fe5b90965094508186146129005773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61291184868a848151811061191a57fe5b93506001016128a0565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a015781810151838201526020016129e9565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a40578181015183820152602001612a28565b5050505090500194505050505060405180910390a4610ad760008585855a86611bd9565b600080825111612abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180613fec6037913960400191505060405180910390fd5b81600183510381518110612acf57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180614366603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612bdd575060016103a4565b6103a182612fe9565b60006020840263ffffffff82846001811115612bfe57fe5b1415612ccc5784821b8701925086831015612c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b64010000000087831c8216860110612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806144256032913960400191505060405180910390fd5b612def565b6001846001811115612cda57fe5b1415612d9e5784821b8703925086831115612d40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b84818389901c161015612cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806140236033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806143a26045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612e2c57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612e3f85610bd3565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612e7f90828686612be6565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b60208310612f8757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f4a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112613081578081fd5b813561309461308f82613eb8565b613e94565b8181529150602080830190848101818402860182018710156130b557600080fd5b60005b848110156130d4578135845292820192908201906001016130b8565b505050505092915050565b600082601f8301126130ef578081fd5b81356130fd61308f82613ed6565b915080825283602082850101111561311457600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261313d578081fd5b815161314b61308f82613ed6565b915080825283602082850101111561316257600080fd5b613173816020840160208601613f16565b5092915050565b60006080828403121561318b578081fd5b6040516080810167ffffffffffffffff82821081831117156131a957fe5b816040528293508451835260208501516020840152604085015191506131ce82613f42565b81604084015260608501519150808211156131e857600080fd5b506131f58582860161312d565b6060830152505092915050565b600060208284031215613213578081fd5b8135612e2c81613f42565b60006020828403121561322f578081fd5b8151612e2c81613f42565b6000806040838503121561324c578081fd5b825161325781613f42565b6020939093015192949293505050565b60008060408385031215613279578182fd5b823561328481613f42565b9150602083013561329481613f42565b809150509250929050565b60008060008060008060c087890312156132b7578182fd5b86356132c281613f42565b955060208701356132d281613f42565b9450604087013567ffffffffffffffff808211156132ee578384fd5b6132fa8a838b01613071565b9550606089013591508082111561330f578384fd5b61331b8a838b01613071565b94506080890135915061332d82613f67565b90925060a08801359080821115613342578283fd5b5061334f89828a016130df565b9150509295509295509295565b600080600080600060a08688031215613373578081fd5b853561337e81613f42565b9450602086013561338e81613f42565b9350604086013567ffffffffffffffff808211156133aa578283fd5b6133b689838a01613071565b945060608801359150808211156133cb578283fd5b6133d789838a01613071565b935060808801359150808211156133ec578283fd5b506133f9888289016130df565b9150509295509295909350565b600080600080600060a0868803121561341d578081fd5b853561342881613f42565b9450602086013561343881613f42565b9350604086013561344881613f67565b9250606086013561345881613f67565b9150608086013567ffffffffffffffff811115613473578182fd5b6133f9888289016130df565b60008060008060008060c08789031215613497578384fd5b86356134a281613f42565b955060208701356134b281613f42565b9450604087013593506060870135925060808701356134d081613f67565b915060a087013567ffffffffffffffff8111156134eb578182fd5b61334f89828a016130df565b600080600080600060a0868803121561350e578283fd5b853561351981613f42565b9450602086013561352981613f42565b93506040860135925060608601359150608086013567ffffffffffffffff811115613473578182fd5b600080600060608486031215613566578081fd5b833561357181613f42565b9250602084013567ffffffffffffffff8082111561358d578283fd5b61359987838801613071565b935060408601359150808211156135ae578283fd5b506135bb86828701613071565b9150509250925092565b600080600080608085870312156135da578182fd5b84356135e581613f42565b9350602085013567ffffffffffffffff80821115613601578384fd5b61360d88838901613071565b94506040870135915080821115613622578384fd5b61362e88838901613071565b93506060870135915080821115613643578283fd5b50613650878288016130df565b91505092959194509250565b6000806040838503121561366e578182fd5b823561367981613f42565b9150602083013561329481613f67565b6000806000806080858703121561369e578182fd5b84356136a981613f42565b935060208501359250604085013567ffffffffffffffff808211156136cc578384fd5b61362e888389016130df565b600080604083850312156136ea578182fd5b82356136f581613f42565b946020939093013593505050565b600080600060608486031215613717578081fd5b833561372281613f42565b95602085013595506040909401359392505050565b6000806000806080858703121561374c578182fd5b843561375781613f42565b93506020850135925060408501359150606085013567ffffffffffffffff811115613780578182fd5b613650878288016130df565b6000806040838503121561379e578182fd5b823567ffffffffffffffff808211156137b5578384fd5b818501915085601f8301126137c8578384fd5b81356137d661308f82613eb8565b80828252602080830192508086018a8283870289010111156137f6578889fd5b8896505b8487101561382157803561380d81613f42565b8452600196909601959281019281016137fa565b509096508701359350505080821115613838578283fd5b5061384585828601613071565b9150509250929050565b600060208284031215613860578081fd5b8151612e2c81613f67565b60006020828403121561387c578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612e2c578182fd5b600080604083850312156138bd578182fd5b825167ffffffffffffffff808211156138d4578384fd5b6138e08683870161312d565b935060208501519150808211156138f5578283fd5b506138458582860161312d565b600060208284031215613913578081fd5b815167ffffffffffffffff811115613929578182fd5b61163b8482850161317a565b60008060408385031215613947578182fd5b825167ffffffffffffffff8082111561395e578384fd5b6138e08683870161317a565b60006020828403121561397b578081fd5b5035919050565b60008060408385031215613994578182fd5b50508035926020909101359150565b815160009082906020808601845b838110156139cd578151855293820193908201906001016139b1565b50929695505050505050565b600084516139eb818460208901613f16565b91909101928352506020820152604001919050565b60008451613a12818460208901613f16565b82018481528351613a2a816020808501908801613f16565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613ae557835183529284019291840191600101613ac9565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613b98816040850160208701613f16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613eb057fe5b604052919050565b600067ffffffffffffffff821115613ecc57fe5b5060209081020190565b600067ffffffffffffffff821115613eea57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613f31578181015183820152602001613f19565b83811115610ad75750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613f6457600080fd5b50565b8015158114613f6457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122019be05877fb85bb8642e043044f9c6ceb709fe50b18d08c0aa3d18114927e9bd64736f6c63430007040033"; + "0x60c06040523480156200001157600080fd5b5060405162004715380380620047158339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620046de6037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516145c56200011960003980610bfb5280610c27525080610c585280610cb95280612cc35280612d8152506145c56000f3fe608060405234801561001057600080fd5b506004361061016b5760003560e01c8063bd7a6c41116100cd578063e985e9c511610081578063f242432a11610066578063f242432a1461032b578063f5d4c8201461033e578063fa4e12d7146103515761016b565b8063e985e9c514610305578063eaec5f81146103185761016b565b8063d7a0ad90116100b2578063d7a0ad90146102c9578063db90e83c146102dc578063ddcc74ab146102fd5761016b565b8063bd7a6c41146102a3578063ce0b514b146102b65761016b565b8063437ecbe911610124578063a22cb46511610109578063a22cb4651461026a578063a3d4926e1461027d578063a3f091f5146102905761016b565b8063437ecbe9146102375780634e1273f41461024a5761016b565b80630e89341c116101555780630e89341c146101ef5780632d0335ab1461020f5780632eb2c2d6146102225761016b565b8062fdd58e146101a657806301ffc9a7146101cf575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613f59565b60405180910390fd5b6101b96101b4366004613811565b610364565b6040516101c69190613fb6565b60405180910390f35b6101e26101dd3660046139a4565b6103b9565b6040516101c69190613c2a565b6102026101fd366004613aa3565b6103cc565b6040516101c69190613cb2565b6101b961021d36600461333b565b61051f565b610235610230366004613495565b610547565b005b61023561024536600461383c565b610652565b61025d6102583660046138c5565b610662565b6040516101c69190613be6565b610235610278366004613795565b6108e1565b61023561028b3660046133d8565b61097a565b61023561029e366004613870565b610aee565b6102356102b136600461368b565b610b00565b6102356102c43660046135b8565b610b0b565b6102356102d73660046136fe565b610bea565b6102ef6102ea366004613aa3565b610bf6565b6040516101c6929190613fbf565b6101b9610c56565b6101e26103133660046133a0565b610c7a565b6101b9610326366004613abb565b610cb5565b610235610339366004613630565b610d07565b61023561034c36600461353f565b610e0b565b6101e261035f3660046137c2565b610f3b565b600080600061037284610bf6565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506103b09082610cb5565b95945050505050565b60006103c48261171c565b90505b919050565b606060036103d983611779565b60405160200180838054600181600116156101000203166002900480156104375780601f10610415576101008083540402835291820191610437565b820191906000526020600020905b815481529060010190602001808311610423575b5050825160208401908083835b6020831061048157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610444565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff8616148061057057506105708533610c7a565b6105c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806142fb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806140e8603d913960400191505060405180910390fd5b61063d858585856118a5565b61064b858585855a86611cb2565b5050505050565b61065d838383611f1f565b505050565b815181516060919081146106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806140af6039913960400191505060405180910390fd5b6000806106e1856000815181106106d457fe5b6020026020010151610bf6565b915091506000806000886000815181106106f757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561076b57600080fd5b50604051908082528060200260200182016040528015610795578160200160208202803683370190505b5090506107a28385610cb5565b816000815181106107af57fe5b602090810291909101015260015b868110156108d4576107d48982815181106106d457fe5b9096509450828614158061083d57508981815181106107ef57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061081c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156108ab576000808b838151811061085157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6108b58486610cb5565b8282815181106108c157fe5b60209081029190910101526001016107bd565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff85166109c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e79565b60606109d161316c565b6060610a8489857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c604051602001610a0f9190613adc565b604051602081830303815290604052805190602001208c604051602001610a369190613adc565b604051602081830303815290604052805190602001208c610a58576000610a5b565b60015b604051602001610a7096959493929190613c35565b604051602081830303815290604052611f89565b9050610a92898989896118a5565b8415610ad55780806020019051810190610aac9190613a6e565b8094508193505050610ac689898989866020015188611cb2565b610ad08983612158565b610ae3565b610ae3898989895a86611cb2565b505050505050505050565b610afa84848484612401565b50505050565b61065d838383612475565b73ffffffffffffffffffffffffffffffffffffffff8516610b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613e1b565b6060610b6261316c565b6060610b9a89857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610a58576000610a5b565b9050610ba88989898961261e565b8415610bdc5780806020019051810190610bc29190613a6e565b8094508193505050610ac6898989898660200151886126c2565b610ae3898989895a866126c2565b610afa848484846128b3565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610c2257fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610c4e57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610d305750610d308533610c7a565b610d85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141c96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610df1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806144676038913960400191505060405180910390fd5b610dfd8585858561261e565b61064b858585855a866126c2565b6060610e6786837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610e41576000610e44565b60015b89610e50576000610e53565b60015b604051602001610a70959493929190613c76565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610efb908890613c2a565b60405180910390a38215610f3357610f1161316c565b81806020019051810190610f259190613a3b565b9050610f318782612158565b505b505050505050565b600080825111610f96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001806144246043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611002576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806143aa6033913960400191505060405180910390fd5b600061100d83612b3d565b60f81c90506005811061106b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b60008160ff16600581111561107c57fe5b905060008080808085600581111561109057fe5b14156110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806142006036913960400191505060405180910390fd5b60018560058111156110f557fe5b1415611238578751606114611155576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b611160886000612bfa565b925061116d886020612bfa565b91508760408151811061117c57fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156111e6573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506117149650505050505050565b600285600581111561124657fe5b14156113965787516061146112a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806142c46037913960400191505060405180910390fd5b6112b1886000612bfa565b92506112be886020612bfa565b9150876040815181106112cd57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156111e6573d6000803e3d6000fd5b60038560058111156113a457fe5b141561155c57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561143257818101518382015260200161141a565b50505050905090810190601f16801561145f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561149257818101518382015260200161147a565b50505050905090810190601f1680156114bf5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156114de57600080fd5b505afa1580156114f2573d6000803e3d6000fd5b505050506040513d602081101561150857600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b600485600581111561156a57fe5b14156116c357604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156115fa5781810151838201526020016115e2565b50505050905090810190601f1680156116275780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561164557600080fd5b505afa158015611659573d6000803e3d6000fd5b505050506040513d602081101561166f57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061171495505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061418f603a913960400191505060405180910390fd5b949350505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415611770575060016103c7565b6103c482612c62565b6060816117ba575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526103c7565b818060005b82156117d357600101600a830492506117bf565b60608167ffffffffffffffff811180156117ec57600080fd5b506040519080825280601f01601f191660200182016040528015611817576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b831561189b57600a840660300160f81b8282806001900393508151811061186157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061183e565b5095945050505050565b815181518114611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806142366042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561193c5750600081115b15611b0e57600080611954856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916119ac919084908890859061199d57fe5b60200260200101516001612cbf565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091611a0291908590899085906119f357fe5b60200260200101516000612cbf565b90508360015b86811015611abc57611a1f8982815181106106d457fe5b9096509450818614611a8e5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a9f84868a848151811061199d57fe5b9350611ab283868a84815181106119f357fe5b9250600101611a08565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611bab565b60005b81811015611ba957828181518110611b2557fe5b6020026020010151611b4a87868481518110611b3d57fe5b6020026020010151610364565b1015611ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806143746036913960400191505060405180910390fd5b600101611b11565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611c57578181015183820152602001611c3f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611c96578181015183820152602001611c7e565b5050505090500194505050505060405180910390a45050505050565b611cd18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611d89578181015183820152602001611d71565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611dc8578181015183820152602001611db0565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611e04578181015183820152602001611dec565b50505050905090810190601f168015611e315780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611e5657600080fd5b5087f1158015611e6a573d6000803e3d6000fd5b50505050506040513d6020811015611e8157600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180614278604c913960600191505060405180910390fd5b611f2c8383836001612f6c565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b60608083806020019051810190611fa091906139e4565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611fd8836041612bfa565b9050818110801590611fec57508160640181105b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d60565b600061205e8683878051906020012060405160200161204393929190613b12565b60405160208183030381529060405280519060200120612ff3565b9050606086838760405160200161207793929190613b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf599161210291613fb6565b60405180910390a261211689838388610f3b565b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613dbd565b50505050509392505050565b60006121678260600151612b3d565b60f81c9050600281106121a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613efc565b60008160ff1660028111156121b757fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff16156121ed5786604001516121ef565b335b925060008560028111156121ff57fe5b14156122fe57866060015180602001905181019061221d9190613373565b909450915073ffffffffffffffffffffffffffffffffffffffff841630141561226e5761224c8884848461261e565b6122698884845a85604051806020016040528060008152506126c2565b6122f9565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a906122c6908b90879087908790600401613ba1565b600060405180830381600087803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505050505b6123f7565b86606001518060200190518101906123169190613357565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd9061236f908b9087908690600401613b70565b602060405180830381600087803b15801561238957600080fd5b505af115801561239d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c19190613988565b6123f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d90613d03565b5050505050505050565b61240e8484846000612f6c565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4610afa60008585855a866126c2565b8151815181146124d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614337603d913960400191505060405180910390fd5b60005b818110156125165761250e858583815181106124eb57fe5b60200260200101518584815181106124ff57fe5b60200260200101516001612f6c565b6001016124d3565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156125c45781810151838201526020016125ac565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126035781810151838201526020016125eb565b5050505090500194505050505060405180910390a450505050565b61262b8483836001612f6c565b6126388383836000612f6c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6126e18573ffffffffffffffffffffffffffffffffffffffff16612f32565b15610f335760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561279a578181015183820152602001612782565b50505050905090810190601f1680156127c75780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156127ea57600080fd5b5087f11580156127fe573d6000803e3d6000fd5b50505050506040513d602081101561281557600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610f31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806143dd6047913960600191505060405180910390fd5b815183511461290d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614520603e913960400191505060405180910390fd5b825115612a2d57600080612927856000815181106106d457fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161297091908490889085906119f357fe5b86519091508360015b828110156129f4576129908982815181106106d457fe5b90965094508186146129d95773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6129ea84868a84815181106119f357fe5b9350600101612979565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ada578181015183820152602001612ac2565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612b19578181015183820152602001612b01565b5050505090500194505050505060405180910390a4610afa60008585855a86611cb2565b600080825111612b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806141256037913960400191505060405180910390fd5b81600183510381518110612ba857fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b60008160200183511015612c59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061449f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415612cb6575060016103c7565b6103c482613122565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115612d1957fe5b1415612e055784821b8701925086831015612d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061455e6032913960400191505060405180910390fd5b612f28565b6001846001811115612e1357fe5b1415612ed75784821b8703925086831115612e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b84818389901c161015612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061415c6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806144db6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590612f6557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080612f7885610bf6565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150612fb890828686612cbf565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b602083106130c057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613083565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f8301126131ba578081fd5b81356131cd6131c882613ff1565b613fcd565b8181529150602080830190848101818402860182018710156131ee57600080fd5b60005b8481101561320d578135845292820192908201906001016131f1565b505050505092915050565b600082601f830112613228578081fd5b81356132366131c88261400f565b915080825283602082850101111561324d57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613276578081fd5b81516132846131c88261400f565b915080825283602082850101111561329b57600080fd5b6132ac81602084016020860161404f565b5092915050565b6000608082840312156132c4578081fd5b6040516080810167ffffffffffffffff82821081831117156132e257fe5b816040528293508451835260208501516020840152604085015191506133078261407b565b816040840152606085015191508082111561332157600080fd5b5061332e85828601613266565b6060830152505092915050565b60006020828403121561334c578081fd5b8135612f658161407b565b600060208284031215613368578081fd5b8151612f658161407b565b60008060408385031215613385578081fd5b82516133908161407b565b6020939093015192949293505050565b600080604083850312156133b2578182fd5b82356133bd8161407b565b915060208301356133cd8161407b565b809150509250929050565b60008060008060008060c087890312156133f0578182fd5b86356133fb8161407b565b9550602087013561340b8161407b565b9450604087013567ffffffffffffffff80821115613427578384fd5b6134338a838b016131aa565b95506060890135915080821115613448578384fd5b6134548a838b016131aa565b945060808901359150613466826140a0565b90925060a0880135908082111561347b578283fd5b5061348889828a01613218565b9150509295509295509295565b600080600080600060a086880312156134ac578081fd5b85356134b78161407b565b945060208601356134c78161407b565b9350604086013567ffffffffffffffff808211156134e3578283fd5b6134ef89838a016131aa565b94506060880135915080821115613504578283fd5b61351089838a016131aa565b93506080880135915080821115613525578283fd5b5061353288828901613218565b9150509295509295909350565b600080600080600060a08688031215613556578081fd5b85356135618161407b565b945060208601356135718161407b565b93506040860135613581816140a0565b92506060860135613591816140a0565b9150608086013567ffffffffffffffff8111156135ac578182fd5b61353288828901613218565b60008060008060008060c087890312156135d0578384fd5b86356135db8161407b565b955060208701356135eb8161407b565b945060408701359350606087013592506080870135613609816140a0565b915060a087013567ffffffffffffffff811115613624578182fd5b61348889828a01613218565b600080600080600060a08688031215613647578283fd5b85356136528161407b565b945060208601356136628161407b565b93506040860135925060608601359150608086013567ffffffffffffffff8111156135ac578182fd5b60008060006060848603121561369f578081fd5b83356136aa8161407b565b9250602084013567ffffffffffffffff808211156136c6578283fd5b6136d2878388016131aa565b935060408601359150808211156136e7578283fd5b506136f4868287016131aa565b9150509250925092565b60008060008060808587031215613713578182fd5b843561371e8161407b565b9350602085013567ffffffffffffffff8082111561373a578384fd5b613746888389016131aa565b9450604087013591508082111561375b578384fd5b613767888389016131aa565b9350606087013591508082111561377c578283fd5b5061378987828801613218565b91505092959194509250565b600080604083850312156137a7578182fd5b82356137b28161407b565b915060208301356133cd816140a0565b600080600080608085870312156137d7578182fd5b84356137e28161407b565b935060208501359250604085013567ffffffffffffffff80821115613805578384fd5b61376788838901613218565b60008060408385031215613823578182fd5b823561382e8161407b565b946020939093013593505050565b600080600060608486031215613850578081fd5b833561385b8161407b565b95602085013595506040909401359392505050565b60008060008060808587031215613885578182fd5b84356138908161407b565b93506020850135925060408501359150606085013567ffffffffffffffff8111156138b9578182fd5b61378987828801613218565b600080604083850312156138d7578182fd5b823567ffffffffffffffff808211156138ee578384fd5b818501915085601f830112613901578384fd5b813561390f6131c882613ff1565b80828252602080830192508086018a82838702890101111561392f578889fd5b8896505b8487101561395a5780356139468161407b565b845260019690960195928101928101613933565b509096508701359350505080821115613971578283fd5b5061397e858286016131aa565b9150509250929050565b600060208284031215613999578081fd5b8151612f65816140a0565b6000602082840312156139b5578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612f65578182fd5b600080604083850312156139f6578182fd5b825167ffffffffffffffff80821115613a0d578384fd5b613a1986838701613266565b93506020850151915080821115613a2e578283fd5b5061397e85828601613266565b600060208284031215613a4c578081fd5b815167ffffffffffffffff811115613a62578182fd5b611714848285016132b3565b60008060408385031215613a80578182fd5b825167ffffffffffffffff80821115613a97578384fd5b613a19868387016132b3565b600060208284031215613ab4578081fd5b5035919050565b60008060408385031215613acd578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015613b0657815185529382019390820190600101613aea565b50929695505050505050565b60008451613b2481846020890161404f565b91909101928352506020820152604001919050565b60008451613b4b81846020890161404f565b82018481528351613b6381602080850190880161404f565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6000602082528251806020840152613cd181604085016020870161404f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715613fe957fe5b604052919050565b600067ffffffffffffffff82111561400557fe5b5060209081020190565b600067ffffffffffffffff82111561402357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561406a578181015183820152602001614052565b83811115610afa5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461409d57600080fd5b50565b801515811461409d57600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220b93982974cd4d959f0f4fbc62d1e794e237e7a37f6c49d9f46719f5cdb53c13164736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/typechain/factories/ERC1155MetaPackedBalance__factory.ts b/src/gen/typechain/factories/ERC1155MetaPackedBalance__factory.ts index 8a84bb2..23a3e33 100644 --- a/src/gen/typechain/factories/ERC1155MetaPackedBalance__factory.ts +++ b/src/gen/typechain/factories/ERC1155MetaPackedBalance__factory.ts @@ -2,32 +2,12 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, Contract, ContractFactory, Overrides } from "ethers"; -import { Provider, TransactionRequest } from "@ethersproject/providers"; +import { Contract, Signer } from "ethers"; +import { Provider } from "@ethersproject/providers"; import type { ERC1155MetaPackedBalance } from "../ERC1155MetaPackedBalance"; -export class ERC1155MetaPackedBalance__factory extends ContractFactory { - constructor(signer?: Signer) { - super(_abi, _bytecode, signer); - } - - deploy( - overrides?: Overrides & { from?: string | Promise } - ): Promise { - return super.deploy(overrides || {}) as Promise; - } - getDeployTransaction( - overrides?: Overrides & { from?: string | Promise } - ): TransactionRequest { - return super.getDeployTransaction(overrides || {}); - } - attach(address: string): ERC1155MetaPackedBalance { - return super.attach(address) as ERC1155MetaPackedBalance; - } - connect(signer: Signer): ERC1155MetaPackedBalance__factory { - return super.connect(signer) as ERC1155MetaPackedBalance__factory; - } +export class ERC1155MetaPackedBalance__factory { static connect( address: string, signerOrProvider: Signer | Provider @@ -159,6 +139,19 @@ const _abi = [ name: "TransferSingle", type: "event", }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -228,7 +221,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -271,7 +264,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -545,6 +538,3 @@ const _abi = [ type: "function", }, ]; - -const _bytecode = - "0x608060405234801561001057600080fd5b506138d1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063ce0b514b1161008c578063eaec5f8111610066578063eaec5f81146101ec578063f242432a146101ff578063f5d4c82014610212578063fa4e12d714610225576100e9565b8063ce0b514b146101a5578063db90e83c146101b8578063e985e9c5146101d9576100e9565b80632eb2c2d6116100c85780632eb2c2d61461014a5780634e1273f41461015f578063a22cb4651461017f578063a3d4926e14610192576100e9565b8062fdd58e146100ee57806301ffc9a7146101175780632d0335ab14610137575b600080fd5b6101016100fc366004612ccb565b610238565b60405161010e9190613339565b60405180910390f35b61012a610125366004612dd5565b61028d565b60405161010e919061305b565b6101016101453660046128d1565b6102f2565b61015d610158366004612a2b565b61031a565b005b61017261016d366004612cf6565b610425565b60405161010e9190613017565b61015d61018d366004612c21565b6106a4565b61015d6101a036600461296e565b61073d565b61015d6101b3366004612b4e565b6108ba565b6101cb6101c6366004612ed4565b610999565b60405161010e929190613342565b61012a6101e7366004612936565b6109a6565b6101016101fa366004612eec565b6109e1565b61015d61020d366004612bc6565b6109f4565b61015d610220366004612ad5565b610af8565b61012a610233366004612c4e565b610c28565b600080600061024684610999565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061028490826109e1565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156102e1575060016102ed565b6102ea82611409565b90505b919050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b3373ffffffffffffffffffffffffffffffffffffffff86161480610343575061034385336109a6565b610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180613682603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061346f603d913960400191505060405180910390fd5b61041085858585611453565b61041e858585855a86611860565b5050505050565b81518151606091908114610484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806134366039913960400191505060405180910390fd5b6000806104a48560008151811061049757fe5b6020026020010151610999565b915091506000806000886000815181106104ba57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561052e57600080fd5b50604051908082528060200260200182016040528015610558578160200160208202803683370190505b50905061056583856109e1565b8160008151811061057257fe5b602090810291909101015260015b868110156106975761059789828151811061049757fe5b9096509450828614158061060057508981815181106105b257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106105df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561066e576000808b838151811061061457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b61067884866109e1565b82828151811061068457fe5b6020908102919091010152600101610580565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8516610793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613259565b60405180910390fd5b606061079d612702565b606061085089857fa3d4926e8cf8fe8e020cd29f514c256bc2eec62aa2337e415f1a33a4828af5a060001b8c8c8c6040516020016107db9190612f0d565b604051602081830303815290604052805190602001208c6040516020016108029190612f0d565b604051602081830303815290604052805190602001208c610824576000610827565b60015b60405160200161083c96959493929190613066565b604051602081830303815290604052611acd565b905061085e89898989611453565b84156108a157808060200190518101906108789190612e9f565b809450819350505061089289898989866020015188611860565b61089c8983611c9c565b6108af565b6108af898989895a86611860565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906131fb565b6060610911612702565b606061094989857fce0b514b3931bdbe4d5d44e4f035afe7113767b7db71949271f6a62d9c60f558828c8c8c8c610824576000610827565b905061095789898989611f45565b841561098b57808060200190518101906109719190612e9f565b809450819350505061089289898989866020015188611fe9565b6108af898989895a86611fe9565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610a1d5750610a1d85336109a6565b610a72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806135506037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610ade576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806137b16038913960400191505060405180910390fd5b610aea85858585611f45565b61041e858585855a86611fe9565b6060610b5486837ff5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524828989610b2e576000610b31565b60015b89610b3d576000610b40565b60015b60405160200161083c9594939291906130a7565b73ffffffffffffffffffffffffffffffffffffffff8781166000818152600160209081526040808320948b16808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168915151790555192935090917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610be890889061305b565b60405180910390a38215610c2057610bfe612702565b81806020019051810190610c129190612e6c565b9050610c1e8782611c9c565b505b505050505050565b600080825111610c83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604381526020018061376e6043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806136f46033913960400191505060405180910390fd5b6000610cfa836121da565b60f81c905060058110610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b60008160ff166005811115610d6957fe5b9050600080808080856005811115610d7d57fe5b1415610dd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806135876036913960400191505060405180910390fd5b6001856005811115610de257fe5b1415610f25578751606114610e42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610e4d886000612297565b9250610e5a886020612297565b915087604081518110610e6957fe5b602001015160f81c60f81b60f81c935060018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610ed3573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8d811691161497506114019650505050505050565b6002856005811115610f3357fe5b1415611083578751606114610f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603781526020018061364b6037913960400191505060405180910390fd5b610f9e886000612297565b9250610fab886020612297565b915087604081518110610fba57fe5b01602090810151604080517f19457468657265756d205369676e6564204d6573736167653a0a33320000000081850152603c8082018f905282518083039091018152605c82018084528151918601919091206000909152607c82018084525260f89290921c609c830181905260bc830187905260dc8301869052905190965060019260fc8084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015610ed3573d6000803e3d6000fd5b600385600581111561109157fe5b141561124957604080517f20c13b0b000000000000000000000000000000000000000000000000000000008152600481019182528a5160448201528a5173ffffffffffffffffffffffffffffffffffffffff8e16926320c13b0b928d928d92918291602482019160640190602087019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b1580156111cb57600080fd5b505afa1580156111df573d6000803e3d6000fd5b505050506040513d60208110156111f557600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f20c13b0b0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b600485600581111561125757fe5b14156113b057604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018c8152602482019283528a5160448301528a5173ffffffffffffffffffffffffffffffffffffffff8f1693631626ba7e938f938e9390929160640190602085019080838360005b838110156112e75781810151838201526020016112cf565b50505050905090810190601f1680156113145780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561133257600080fd5b505afa158015611346573d6000803e3d6000fd5b505050506040513d602081101561135c57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014965061140195505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613516603a913960400191505060405180910390fd5b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b8151815181146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806135bd6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580156114ea5750600081115b156116bc576000806115028560008151811061049757fe5b73ffffffffffffffffffffffffffffffffffffffff891660009081526020818152604080832085845290915281205487519395509193509161155a919084908890859061154b57fe5b602002602001015160016122ff565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260208181526040808320878452909152812054875192935090916115b091908590899085906115a157fe5b602002602001015160006122ff565b90508360015b8681101561166a576115cd89828151811061049757fe5b909650945081861461163c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b61164d84868a848151811061154b57fe5b935061166083868a84815181106115a157fe5b92506001016115b6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611759565b60005b81811015611757578281815181106116d357fe5b60200260200101516116f8878684815181106116eb57fe5b6020026020010151610238565b101561174f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806136be6036913960400191505060405180910390fd5b6001016116bf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156118055781810151838201526020016117ed565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561184457818101518382015260200161182c565b5050505090500194505050505060405180910390a45050505050565b61187f8573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561193757818101518382015260200161191f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561197657818101518382015260200161195e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119b257818101518382015260200161199a565b50505050905090810190601f1680156119df5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b158015611a0457600080fd5b5087f1158015611a18573d6000803e3d6000fd5b50505050506040513d6020811015611a2f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806135ff604c913960600191505060405180910390fd5b60608083806020019051810190611ae49190612e15565b73ffffffffffffffffffffffffffffffffffffffff871660009081526002602052604081205491945091925090611b1c836041612297565b9050818110801590611b3057508160640181105b611b66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a90613140565b6000611ba286838780519060200120604051602001611b8793929190612f43565b6040516020818303038152906040528051906020012061254c565b90506060868387604051602001611bbb93929190612f6a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825273ffffffffffffffffffffffffffffffffffffffff8c166000818152600260205292909220600187019081905590935090917fb861b7bdbe611a846ab271b8d2810391bc8b5a968f390c322438ecab66bccf5991611c4691613339565b60405180910390a2611c5a89838388610c28565b611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a9061319d565b50505050509392505050565b6000611cab82606001516121da565b60f81c905060028110611cea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906132dc565b60008160ff166002811115611cfb57fe5b835160408501519192506000918291829173ffffffffffffffffffffffffffffffffffffffff1615611d31578660400151611d33565b335b92506000856002811115611d4357fe5b1415611e42578660600151806020019051810190611d619190612909565b909450915073ffffffffffffffffffffffffffffffffffffffff8416301415611db257611d9088848484611f45565b611dad8884845a8560405180602001604052806000815250611fe9565b611e3d565b6040517ff242432a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f242432a90611e0a908b90879087908790600401612fd2565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b611f3b565b8660600151806020019051810190611e5a91906128ed565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290945073ffffffffffffffffffffffffffffffffffffffff8516906323b872dd90611eb3908b9087908690600401612fa1565b602060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f059190612db9565b611f3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078a906130e3565b5050505050505050565b611f52848383600161267b565b611f5f838383600061267b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6120088573ffffffffffffffffffffffffffffffffffffffff16612512565b15610c205760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156120c15781810151838201526020016120a9565b50505050905090810190601f1680156120ee5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561211157600080fd5b5087f1158015612125573d6000803e3d6000fd5b50505050506040513d602081101561213c57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610c1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806137276047913960600191505060405180910390fd5b600080825111612235576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806134ac6037913960400191505060405180910390fd5b8160018351038151811061224557fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507fff000000000000000000000000000000000000000000000000000000000000001690565b600081602001835110156122f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806137e9603c913960400191505060405180910390fd5b50016020015190565b60006020840263ffffffff8284600181111561231757fe5b14156123e55784821b870192508683101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b64010000000087831c82168601106123e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061386a6032913960400191505060405180910390fd5b612508565b60018460018111156123f357fe5b14156124b75784821b8703925086831115612459576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b84818389901c1610156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806134e36033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806138256045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061254557507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191825283517f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d47498183015230818601528451808203860181526060820190955284519490910193909320825160009491928692608001918291908083835b6020831061261957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016125dc565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209392505050565b60008061268785610999565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126c7908286866122ff565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b60405180608001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b600082601f830112612750578081fd5b813561276361275e82613374565b613350565b81815291506020808301908481018184028601820187101561278457600080fd5b60005b848110156127a357813584529282019290820190600101612787565b505050505092915050565b600082601f8301126127be578081fd5b81356127cc61275e82613392565b91508082528360208285010111156127e357600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261280c578081fd5b815161281a61275e82613392565b915080825283602082850101111561283157600080fd5b6128428160208401602086016133d2565b5092915050565b60006080828403121561285a578081fd5b6040516080810167ffffffffffffffff828210818311171561287857fe5b8160405282935084518352602085015160208401526040850151915061289d82613402565b81604084015260608501519150808211156128b757600080fd5b506128c4858286016127fc565b6060830152505092915050565b6000602082840312156128e2578081fd5b813561254581613402565b6000602082840312156128fe578081fd5b815161254581613402565b6000806040838503121561291b578081fd5b825161292681613402565b6020939093015192949293505050565b60008060408385031215612948578182fd5b823561295381613402565b9150602083013561296381613402565b809150509250929050565b60008060008060008060c08789031215612986578182fd5b863561299181613402565b955060208701356129a181613402565b9450604087013567ffffffffffffffff808211156129bd578384fd5b6129c98a838b01612740565b955060608901359150808211156129de578384fd5b6129ea8a838b01612740565b9450608089013591506129fc82613427565b90925060a08801359080821115612a11578283fd5b50612a1e89828a016127ae565b9150509295509295509295565b600080600080600060a08688031215612a42578081fd5b8535612a4d81613402565b94506020860135612a5d81613402565b9350604086013567ffffffffffffffff80821115612a79578283fd5b612a8589838a01612740565b94506060880135915080821115612a9a578283fd5b612aa689838a01612740565b93506080880135915080821115612abb578283fd5b50612ac8888289016127ae565b9150509295509295909350565b600080600080600060a08688031215612aec578081fd5b8535612af781613402565b94506020860135612b0781613402565b93506040860135612b1781613427565b92506060860135612b2781613427565b9150608086013567ffffffffffffffff811115612b42578182fd5b612ac8888289016127ae565b60008060008060008060c08789031215612b66578384fd5b8635612b7181613402565b95506020870135612b8181613402565b945060408701359350606087013592506080870135612b9f81613427565b915060a087013567ffffffffffffffff811115612bba578182fd5b612a1e89828a016127ae565b600080600080600060a08688031215612bdd578283fd5b8535612be881613402565b94506020860135612bf881613402565b93506040860135925060608601359150608086013567ffffffffffffffff811115612b42578182fd5b60008060408385031215612c33578182fd5b8235612c3e81613402565b9150602083013561296381613427565b60008060008060808587031215612c63578182fd5b8435612c6e81613402565b935060208501359250604085013567ffffffffffffffff80821115612c91578384fd5b612c9d888389016127ae565b93506060870135915080821115612cb2578283fd5b50612cbf878288016127ae565b91505092959194509250565b60008060408385031215612cdd578182fd5b8235612ce881613402565b946020939093013593505050565b60008060408385031215612d08578182fd5b823567ffffffffffffffff80821115612d1f578384fd5b818501915085601f830112612d32578384fd5b8135612d4061275e82613374565b80828252602080830192508086018a828387028901011115612d60578889fd5b8896505b84871015612d8b578035612d7781613402565b845260019690960195928101928101612d64565b509096508701359350505080821115612da2578283fd5b50612daf85828601612740565b9150509250929050565b600060208284031215612dca578081fd5b815161254581613427565b600060208284031215612de6578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612545578182fd5b60008060408385031215612e27578182fd5b825167ffffffffffffffff80821115612e3e578384fd5b612e4a868387016127fc565b93506020850151915080821115612e5f578283fd5b50612daf858286016127fc565b600060208284031215612e7d578081fd5b815167ffffffffffffffff811115612e93578182fd5b61140184828501612849565b60008060408385031215612eb1578182fd5b825167ffffffffffffffff80821115612ec8578384fd5b612e4a86838701612849565b600060208284031215612ee5578081fd5b5035919050565b60008060408385031215612efe578182fd5b50508035926020909101359150565b815160009082906020808601845b83811015612f3757815185529382019390820190600101612f1b565b50929695505050505050565b60008451612f558184602089016133d2565b91909101928352506020820152604001919050565b60008451612f7c8184602089016133d2565b82018481528351612f948160208085019088016133d2565b0160200195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff94851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6020808252825182820181905260009190848201906040850190845b8181101561304f57835183529284019291840191600101613033565b50909695505050505050565b901515815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b94855273ffffffffffffffffffffffffffffffffffffffff93841660208601529190921660408401526060830191909152608082015260a00190565b6020808252603f908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a2045524332305f5452414e534645525f4641494c454400606082015260800190565b6020808252603c908201527f455243313135354d6574615061636b656442616c616e6365235f7369676e617460408201527f75726556616c69646174696f6e3a20494e56414c49445f4e4f4e434500000000606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365235f7369676e6174908201527f75726556616c69646174696f6e3a20494e56414c49445f5349474e4154555245606082015260800190565b602080825260409082018190527f455243313135354d6574615061636b656442616c616e6365236d657461536166908201527f655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54606082015260800190565b60208082526045908201527f455243313135354d6574615061636b656442616c616e6365236d65746153616660408201527f6542617463685472616e7366657246726f6d3a20494e56414c49445f5245434960608201527f5049454e54000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603b908201527f455243313135354d6574615061636b656442616c616e6365235f7472616e736660408201527f65724761734665653a20554e535550504f525445445f544f4b454e0000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561336c57fe5b604052919050565b600067ffffffffffffffff82111561338857fe5b5060209081020190565b600067ffffffffffffffff8211156133a657fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156133ed5781810151838201526020016133d5565b838111156133fc576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461342457600080fd5b50565b801515811461342457600080fdfe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c6962427974657323706f704c617374427974653a20475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e4154555245455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494c4c4547414c5f5349474e4154555245455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f39375f5245515549524544455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f575369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20494e56414c49445f5349474e4552455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a204c454e4754485f475245415445525f5448414e5f305f5245515549524544455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a26469706673582212205897b43ca940988411a9f040c1ba519b60953d2345ff071831c70be55f1e60f664736f6c63430007040033"; diff --git a/src/gen/typechain/factories/ERC1155MintBurnPackedBalanceMock__factory.ts b/src/gen/typechain/factories/ERC1155MintBurnPackedBalanceMock__factory.ts index cc98e58..59cc9e7 100644 --- a/src/gen/typechain/factories/ERC1155MintBurnPackedBalanceMock__factory.ts +++ b/src/gen/typechain/factories/ERC1155MintBurnPackedBalanceMock__factory.ts @@ -2,7 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, Contract, ContractFactory, Overrides } from "ethers"; +import { + Signer, + BigNumberish, + Contract, + ContractFactory, + Overrides, +} from "ethers"; import { Provider, TransactionRequest } from "@ethersproject/providers"; import type { ERC1155MintBurnPackedBalanceMock } from "../ERC1155MintBurnPackedBalanceMock"; @@ -13,16 +19,19 @@ export class ERC1155MintBurnPackedBalanceMock__factory extends ContractFactory { } deploy( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): Promise { return super.deploy( + _idsBitsSize, overrides || {} ) as Promise; } getDeployTransaction( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): TransactionRequest { - return super.getDeployTransaction(overrides || {}); + return super.getDeployTransaction(_idsBitsSize, overrides || {}); } attach(address: string): ERC1155MintBurnPackedBalanceMock { return super.attach(address) as ERC1155MintBurnPackedBalanceMock; @@ -43,6 +52,17 @@ export class ERC1155MintBurnPackedBalanceMock__factory extends ContractFactory { } const _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, { anonymous: false, inputs: [ @@ -165,6 +185,19 @@ const _abi = [ stateMutability: "nonpayable", type: "fallback", }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -308,7 +341,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -332,7 +365,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -512,4 +545,4 @@ const _abi = [ ]; const _bytecode = - "0x608060405234801561001057600080fd5b50612796806100206000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063a3f091f51161008c578063db90e83c11610066578063db90e83c14610221578063e985e9c514610242578063eaec5f8114610255578063f242432a14610268576100e9565b8063a3f091f5146101e8578063bd7a6c41146101fb578063d7a0ad901461020e576100e9565b80632eb2c2d6116100c85780632eb2c2d61461018d578063437ecbe9146101a25780634e1273f4146101b5578063a22cb465146101d5576100e9565b8062fdd58e1461012457806301ffc9a71461014d5780630e89341c1461016d575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011b90612359565b60405180910390fd5b6101376101323660046120b1565b61027b565b60405161014491906123b6565b60405180910390f35b61016061015b366004612220565b6102d0565b60405161014491906122dd565b61018061017b366004612260565b6102e3565b60405161014491906122e8565b6101a061019b366004611e68565b610436565b005b6101a06101b03660046120da565b610541565b6101c86101c336600461215f565b610551565b6040516101449190612299565b6101a06101e3366004612077565b6107d0565b6101a06101f636600461210c565b610869565b6101a0610209366004611f71565b61087b565b6101a061021c366004611fe2565b610886565b61023461022f366004612260565b610892565b6040516101449291906123bf565b610160610250366004611e36565b61089f565b610137610263366004612278565b6108da565b6101a0610276366004611f0e565b6108ed565b600080600061028984610892565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102c790826108da565b95945050505050565b60006102db826109f1565b90505b919050565b606060026102f083610a4e565b604051602001808380546001816001161561010002031660029004801561034e5780601f1061032c57610100808354040283529182019161034e565b820191906000526020600020905b81548152906001019060200180831161033a575b5050825160208401908083835b6020831061039857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161035b565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061045f575061045f853361089f565b6104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061257e603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612449603d913960400191505060405180910390fd5b61052c85858585610b7a565b61053a858585855a86610f87565b5050505050565b61054c8383836111fe565b505050565b815181516060919081146105b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806124106039913960400191505060405180910390fd5b6000806105d0856000815181106105c357fe5b6020026020010151610892565b915091506000806000886000815181106105e657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561065a57600080fd5b50604051908082528060200260200182016040528015610684578160200160208202803683370190505b50905061069183856108da565b8160008151811061069e57fe5b602090810291909101015260015b868110156107c3576106c38982815181106105c357fe5b9096509450828614158061072c57508981815181106106de57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061070b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b1561079a576000808b838151811061074057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107a484866108da565b8282815181106107b057fe5b60209081029190910101526001016106ac565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61087584848484611268565b50505050565b61054c8383836112dc565b61087584848484611485565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff861614806109165750610916853361089f565b61096b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806124b96037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806126746038913960400191505060405180910390fd5b6109e38585858561170f565b61053a858585855a866117b3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610a45575060016102de565b6102db826119a4565b606081610a8f575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102de565b818060005b8215610aa857600101600a83049250610a94565b60608167ffffffffffffffff81118015610ac157600080fd5b506040519080825280601f01601f191660200182016040528015610aec576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610b7057600a840660300160f81b82828060019003935081518110610b3657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610b13565b5095945050505050565b815181518114610bd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806124f06042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610c115750600081115b15610de357600080610c29856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610c819190849088908590610c7257fe5b60200260200101516001611a01565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610cd79190859089908590610cc857fe5b60200260200101516000611a01565b90508360015b86811015610d9157610cf48982815181106105c357fe5b9096509450818614610d635773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610d7484868a8481518110610c7257fe5b9350610d8783868a8481518110610cc857fe5b9250600101610cdd565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610e80565b60005b81811015610e7e57828181518110610dfa57fe5b6020026020010151610e1f87868481518110610e1257fe5b602002602001015161027b565b1015610e76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806125f76036913960400191505060405180910390fd5b600101610de6565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f2c578181015183820152602001610f14565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610f6b578181015183820152602001610f53565b5050505090500194505050505060405180910390a45050505050565b610fa68573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561105e578181015183820152602001611046565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561109d578181015183820152602001611085565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156110d95781810151838201526020016110c1565b50505050905090810190601f1680156111065780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561112b57600080fd5b5087f115801561113f573d6000803e3d6000fd5b50505050506040513d602081101561115657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180612532604c913960600191505060405180910390fd5b505b505050505050565b61120b8383836001611c4e565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b6112758484846000611c4e565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461087560008585855a866117b3565b815181518114611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806125ba603d913960400191505060405180910390fd5b60005b8181101561137d576113758585838151811061135257fe5b602002602001015185848151811061136657fe5b60200260200101516001611c4e565b60010161133a565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561142b578181015183820152602001611413565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561146a578181015183820152602001611452565b5050505090500194505050505060405180910390a450505050565b81518351146114df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806126f1603e913960400191505060405180910390fd5b8251156115ff576000806114f9856000815181106105c357fe5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916115429190849088908590610cc857fe5b86519091508360015b828110156115c6576115628982815181106105c357fe5b90965094508186146115ab5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b6115bc84868a8481518110610cc857fe5b935060010161154b565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156116ac578181015183820152602001611694565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156116eb5781810151838201526020016116d3565b5050505090500194505050505060405180910390a461087560008585855a86610f87565b61171c8483836001611c4e565b6117298383836000611c4e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6117d28573ffffffffffffffffffffffffffffffffffffffff16611c14565b156111f65760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561188b578181015183820152602001611873565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156118db57600080fd5b5087f11580156118ef573d6000803e3d6000fd5b50505050506040513d602081101561190657600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146111f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604781526020018061262d6047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156119f8575060016102de565b6102db82611cd5565b60006020840263ffffffff82846001811115611a1957fe5b1415611ae75784821b8701925086831015611a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b64010000000087831c8216860110611ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061272f6032913960400191505060405180910390fd5b611c0a565b6001846001811115611af557fe5b1415611bb95784821b8703925086831115611b5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b84818389901c161015611ae2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806124866033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806126ac6045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611c4757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611c5a85610892565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611c9a90828686611a01565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102de57600080fd5b600082601f830112611d53578081fd5b8135611d66611d61826123f1565b6123cd565b818152915060208083019084810181840286018201871015611d8757600080fd5b60005b84811015611da657813584529282019290820190600101611d8a565b505050505092915050565b600082601f830112611dc1578081fd5b813567ffffffffffffffff811115611dd557fe5b611e0660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016123cd565b9150808252836020828501011115611e1d57600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611e48578182fd5b611e5183611d1f565b9150611e5f60208401611d1f565b90509250929050565b600080600080600060a08688031215611e7f578081fd5b611e8886611d1f565b9450611e9660208701611d1f565b9350604086013567ffffffffffffffff80821115611eb2578283fd5b611ebe89838a01611d43565b94506060880135915080821115611ed3578283fd5b611edf89838a01611d43565b93506080880135915080821115611ef4578283fd5b50611f0188828901611db1565b9150509295509295909350565b600080600080600060a08688031215611f25578081fd5b611f2e86611d1f565b9450611f3c60208701611d1f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611f65578182fd5b611f0188828901611db1565b600080600060608486031215611f85578283fd5b611f8e84611d1f565b9250602084013567ffffffffffffffff80821115611faa578384fd5b611fb687838801611d43565b93506040860135915080821115611fcb578283fd5b50611fd886828701611d43565b9150509250925092565b60008060008060808587031215611ff7578384fd5b61200085611d1f565b9350602085013567ffffffffffffffff8082111561201c578485fd5b61202888838901611d43565b9450604087013591508082111561203d578384fd5b61204988838901611d43565b9350606087013591508082111561205e578283fd5b5061206b87828801611db1565b91505092959194509250565b60008060408385031215612089578182fd5b61209283611d1f565b9150602083013580151581146120a6578182fd5b809150509250929050565b600080604083850312156120c3578182fd5b6120cc83611d1f565b946020939093013593505050565b6000806000606084860312156120ee578283fd5b6120f784611d1f565b95602085013595506040909401359392505050565b60008060008060808587031215612121578384fd5b61212a85611d1f565b93506020850135925060408501359150606085013567ffffffffffffffff811115612153578182fd5b61206b87828801611db1565b60008060408385031215612171578081fd5b823567ffffffffffffffff80821115612188578283fd5b818501915085601f83011261219b578283fd5b81356121a9611d61826123f1565b80828252602080830192508086018a8283870289010111156121c9578788fd5b8796505b848710156121f2576121de81611d1f565b8452600196909601959281019281016121cd565b509096508701359350505080821115612209578283fd5b5061221685828601611d43565b9150509250929050565b600060208284031215612231578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611c47578182fd5b600060208284031215612271578081fd5b5035919050565b6000806040838503121561228a578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156122d1578351835292840192918401916001016122b5565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b81811015612314578581018301518582016040015282016122f8565b818111156123255783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156123e957fe5b604052919050565b600067ffffffffffffffff82111561240557fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220cfaa0248ab3cd2216b2aa8933fcad401337cc5abff0d89fa02c42db1a3fc41cb64736f6c63430007040033"; + "0x60c06040523480156200001157600080fd5b5060405162002a0f38038062002a0f8339810160408190526200003491620000c8565b80806101008110801562000052575080610100816200004f57fe5b06155b620000a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180620029d86037913960400191505060405180910390fd5b60808190528061010081620000ba57fe5b0460a05250620000e1915050565b600060208284031215620000da578081fd5b5051919050565b60805160a0516128bf62000119600039806108aa52806108d652508061090752806109685280611ace5280611b8c52506128bf6000f3fe608060405234801561001057600080fd5b50600436106100f45760003560e01c8063a3f091f511610097578063ddcc74ab11610066578063ddcc74ab1461024d578063e985e9c514610255578063eaec5f8114610268578063f242432a1461027b576100f4565b8063a3f091f5146101f3578063bd7a6c4114610206578063d7a0ad9014610219578063db90e83c1461022c576100f4565b80632eb2c2d6116100d35780632eb2c2d614610198578063437ecbe9146101ad5780634e1273f4146101c0578063a22cb465146101e0576100f4565b8062fdd58e1461012f57806301ffc9a7146101585780630e89341c14610178575b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012690612482565b60405180910390fd5b61014261013d3660046121da565b61028e565b60405161014f91906124df565b60405180910390f35b61016b610166366004612349565b6102e3565b60405161014f9190612406565b61018b610186366004612389565b6102f6565b60405161014f9190612411565b6101ab6101a6366004611f91565b610449565b005b6101ab6101bb366004612203565b610554565b6101d36101ce366004612288565b610564565b60405161014f91906123c2565b6101ab6101ee3660046121a0565b6107e3565b6101ab610201366004612235565b61087c565b6101ab61021436600461209a565b61088e565b6101ab61022736600461210b565b610899565b61023f61023a366004612389565b6108a5565b60405161014f9291906124e8565b610142610905565b61016b610263366004611f5f565b610929565b6101426102763660046123a1565b610964565b6101ab610289366004612037565b6109b6565b600080600061029c846108a5565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506102da9082610964565b95945050505050565b60006102ee82610aba565b90505b919050565b6060600261030383610b17565b60405160200180838054600181600116156101000203166002900480156103615780601f1061033f576101008083540402835291820191610361565b820191906000526020600020905b81548152906001019060200180831161034d575b5050825160208401908083835b602083106103ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161036e565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990911692169190911790527f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe50181526005909201905295945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061047257506104728533610929565b6104c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806126a7603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612572603d913960400191505060405180910390fd5b61053f85858585610c43565b61054d858585855a86611050565b5050505050565b61055f8383836112c7565b505050565b815181516060919081146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806125396039913960400191505060405180910390fd5b6000806105e3856000815181106105d657fe5b60200260200101516108a5565b915091506000806000886000815181106105f957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561066d57600080fd5b50604051908082528060200260200182016040528015610697578160200160208202803683370190505b5090506106a48385610964565b816000815181106106b157fe5b602090810291909101015260015b868110156107d6576106d68982815181106105d657fe5b9096509450828614158061073f57508981815181106106f157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183038151811061071e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b156107ad576000808b838151811061075357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b6107b78486610964565b8282815181106107c357fe5b60209081029190910101526001016106bf565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b61088884848484611331565b50505050565b61055f8383836113a5565b6108888484848461154e565b6000807f000000000000000000000000000000000000000000000000000000000000000083816108d157fe5b0491507f000000000000000000000000000000000000000000000000000000000000000083816108fd57fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff861614806109df57506109df8533610929565b610a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806125e26037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061279d6038913960400191505060405180910390fd5b610aac858585856117d8565b61054d858585855a8661187c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c000000000000000000000000000000000000000000000000000000001415610b0e575060016102f1565b6102ee82611a6d565b606081610b58575060408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201526102f1565b818060005b8215610b7157600101600a83049250610b5d565b60608167ffffffffffffffff81118015610b8a57600080fd5b506040519080825280601f01601f191660200182016040528015610bb5576020820181803683370190505b5090507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b8315610c3957600a840660300160f81b82828060019003935081518110610bff57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350610bdc565b5095945050505050565b815181518114610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260428152602001806126196042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610cda5750600081115b15610eac57600080610cf2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610d4a9190849088908590610d3b57fe5b60200260200101516001611aca565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610da09190859089908590610d9157fe5b60200260200101516000611aca565b90508360015b86811015610e5a57610dbd8982815181106105d657fe5b9096509450818614610e2c5773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610e3d84868a8481518110610d3b57fe5b9350610e5083868a8481518110610d9157fe5b9250600101610da6565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610f49565b60005b81811015610f4757828181518110610ec357fe5b6020026020010151610ee887868481518110610edb57fe5b602002602001015161028e565b1015610f3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806127206036913960400191505060405180910390fd5b600101610eaf565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610ff5578181015183820152602001610fdd565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561103457818101518382015260200161101c565b5050505090500194505050505060405180910390a45050505050565b61106f8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561112757818101518382015260200161110f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561116657818101518382015260200161114e565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156111a257818101518382015260200161118a565b50505050905090810190601f1680156111cf5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b1580156111f457600080fd5b5087f1158015611208573d6000803e3d6000fd5b50505050506040513d602081101561121f57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c81526020018061265b604c913960600191505060405180910390fd5b505b505050505050565b6112d48383836001611d77565b6040805183815260208101839052815160009273ffffffffffffffffffffffffffffffffffffffff87169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4505050565b61133e8484846000611d77565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a461088860008585855a8661187c565b815181518114611400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806126e3603d913960400191505060405180910390fd5b60005b818110156114465761143e8585838151811061141b57fe5b602002602001015185848151811061142f57fe5b60200260200101516001611d77565b600101611403565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156114f45781810151838201526020016114dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561153357818101518382015260200161151b565b5050505090500194505050505060405180910390a450505050565b81518351146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061281a603e913960400191505060405180910390fd5b8251156116c8576000806115c2856000815181106105d657fe5b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915281205487519395509193509161160b9190849088908590610d9157fe5b86519091508360015b8281101561168f5761162b8982815181106105d657fe5b90965094508186146116745773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61168584868a8481518110610d9157fe5b9350600101611614565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561177557818101518382015260200161175d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117b457818101518382015260200161179c565b5050505090500194505050505060405180910390a461088860008585855a86611050565b6117e58483836001611d77565b6117f28383836000611d77565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b61189b8573ffffffffffffffffffffffffffffffffffffffff16611d3d565b156112bf5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561195457818101518382015260200161193c565b50505050905090810190601f1680156119815780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156119a457600080fd5b5087f11580156119b8573d6000803e3d6000fd5b50505050506040513d60208110156119cf57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260478152602001806127566047913960600191505060405180910390fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001415611ac1575060016102f1565b6102ee82611dfe565b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182846001811115611b2457fe5b1415611c105784821b8701925086831015611b8a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c8216860110611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128586032913960400191505060405180910390fd5b611d33565b6001846001811115611c1e57fe5b1415611ce25784821b8703925086831115611c84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b84818389901c161015611c0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806125af6033913960400191505060405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806127d56045913960600191505060405180910390fd5b5050949350505050565b6000813f8015801590611d7057507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b600080611d83856108a5565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611dc390828686611aca565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146102f157600080fd5b600082601f830112611e7c578081fd5b8135611e8f611e8a8261251a565b6124f6565b818152915060208083019084810181840286018201871015611eb057600080fd5b60005b84811015611ecf57813584529282019290820190600101611eb3565b505050505092915050565b600082601f830112611eea578081fd5b813567ffffffffffffffff811115611efe57fe5b611f2f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016124f6565b9150808252836020828501011115611f4657600080fd5b8060208401602084013760009082016020015292915050565b60008060408385031215611f71578182fd5b611f7a83611e48565b9150611f8860208401611e48565b90509250929050565b600080600080600060a08688031215611fa8578081fd5b611fb186611e48565b9450611fbf60208701611e48565b9350604086013567ffffffffffffffff80821115611fdb578283fd5b611fe789838a01611e6c565b94506060880135915080821115611ffc578283fd5b61200889838a01611e6c565b9350608088013591508082111561201d578283fd5b5061202a88828901611eda565b9150509295509295909350565b600080600080600060a0868803121561204e578081fd5b61205786611e48565b945061206560208701611e48565b93506040860135925060608601359150608086013567ffffffffffffffff81111561208e578182fd5b61202a88828901611eda565b6000806000606084860312156120ae578283fd5b6120b784611e48565b9250602084013567ffffffffffffffff808211156120d3578384fd5b6120df87838801611e6c565b935060408601359150808211156120f4578283fd5b5061210186828701611e6c565b9150509250925092565b60008060008060808587031215612120578384fd5b61212985611e48565b9350602085013567ffffffffffffffff80821115612145578485fd5b61215188838901611e6c565b94506040870135915080821115612166578384fd5b61217288838901611e6c565b93506060870135915080821115612187578283fd5b5061219487828801611eda565b91505092959194509250565b600080604083850312156121b2578182fd5b6121bb83611e48565b9150602083013580151581146121cf578182fd5b809150509250929050565b600080604083850312156121ec578182fd5b6121f583611e48565b946020939093013593505050565b600080600060608486031215612217578283fd5b61222084611e48565b95602085013595506040909401359392505050565b6000806000806080858703121561224a578384fd5b61225385611e48565b93506020850135925060408501359150606085013567ffffffffffffffff81111561227c578182fd5b61219487828801611eda565b6000806040838503121561229a578081fd5b823567ffffffffffffffff808211156122b1578283fd5b818501915085601f8301126122c4578283fd5b81356122d2611e8a8261251a565b80828252602080830192508086018a8283870289010111156122f2578788fd5b8796505b8487101561231b5761230781611e48565b8452600196909601959281019281016122f6565b509096508701359350505080821115612332578283fd5b5061233f85828601611e6c565b9150509250929050565b60006020828403121561235a578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611d70578182fd5b60006020828403121561239a578081fd5b5035919050565b600080604083850312156123b3578182fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156123fa578351835292840192918401916001016123de565b50909695505050505050565b901515815260200190565b6000602080835283518082850152825b8181101561243d57858101830151858201604001528201612421565b8181111561244e5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526034908201527f455243313135354d6574614d696e744275726e5061636b656442616c616e636560408201527f4d6f636b3a20494e56414c49445f4d4554484f44000000000000000000000000606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561251257fe5b604052919050565b600067ffffffffffffffff82111561252e57fe5b506020908102019056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135354d696e744275726e5061636b656442616c616e63652362617463684275726e3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135354d696e744275726e5061636b656442616c616e6365235f62617463684d696e743a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e9eceed9bc148fc04098eeda967b30a4621c103e39102ff8f1c6a325aa15da3e64736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/typechain/factories/ERC1155MintBurnPackedBalance__factory.ts b/src/gen/typechain/factories/ERC1155MintBurnPackedBalance__factory.ts index f4bbeff..3a8e730 100644 --- a/src/gen/typechain/factories/ERC1155MintBurnPackedBalance__factory.ts +++ b/src/gen/typechain/factories/ERC1155MintBurnPackedBalance__factory.ts @@ -2,7 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, Contract, ContractFactory, Overrides } from "ethers"; +import { + Signer, + BigNumberish, + Contract, + ContractFactory, + Overrides, +} from "ethers"; import { Provider, TransactionRequest } from "@ethersproject/providers"; import type { ERC1155MintBurnPackedBalance } from "../ERC1155MintBurnPackedBalance"; @@ -13,16 +19,19 @@ export class ERC1155MintBurnPackedBalance__factory extends ContractFactory { } deploy( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): Promise { return super.deploy( + _idsBitsSize, overrides || {} ) as Promise; } getDeployTransaction( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): TransactionRequest { - return super.getDeployTransaction(overrides || {}); + return super.getDeployTransaction(_idsBitsSize, overrides || {}); } attach(address: string): ERC1155MintBurnPackedBalance { return super.attach(address) as ERC1155MintBurnPackedBalance; @@ -43,6 +52,17 @@ export class ERC1155MintBurnPackedBalance__factory extends ContractFactory { } const _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, { anonymous: false, inputs: [ @@ -142,6 +162,19 @@ const _abi = [ name: "TransferSingle", type: "event", }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -211,7 +244,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -235,7 +268,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -368,4 +401,4 @@ const _abi = [ ]; const _bytecode = - "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122016d211e8d7ce96dd72d95f3bf7388c9f0a939a36f9dd3414b2dd60a18209e35d64736f6c63430007040033"; + "0x60c060405234801561001057600080fd5b50604051611e1a380380611e1a8339818101604052602081101561003357600080fd5b505180610100811080156100505750806101008161004d57fe5b06155b6100a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de36037913960400191505060405180910390fd5b608081905280610100816100b557fe5b0460a052505060805160a051611cf16100f260003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122024d596a506a0fa20fb9dbabc6455c7aad0aef6bfa1553bbb3a8b6aa09f7d6af664736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/gen/typechain/factories/ERC1155PackedBalance__factory.ts b/src/gen/typechain/factories/ERC1155PackedBalance__factory.ts index 7cd28e3..7cfa28d 100644 --- a/src/gen/typechain/factories/ERC1155PackedBalance__factory.ts +++ b/src/gen/typechain/factories/ERC1155PackedBalance__factory.ts @@ -2,7 +2,13 @@ /* tslint:disable */ /* eslint-disable */ -import { Signer, Contract, ContractFactory, Overrides } from "ethers"; +import { + Signer, + BigNumberish, + Contract, + ContractFactory, + Overrides, +} from "ethers"; import { Provider, TransactionRequest } from "@ethersproject/providers"; import type { ERC1155PackedBalance } from "../ERC1155PackedBalance"; @@ -13,14 +19,19 @@ export class ERC1155PackedBalance__factory extends ContractFactory { } deploy( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): Promise { - return super.deploy(overrides || {}) as Promise; + return super.deploy( + _idsBitsSize, + overrides || {} + ) as Promise; } getDeployTransaction( + _idsBitsSize: BigNumberish, overrides?: Overrides & { from?: string | Promise } ): TransactionRequest { - return super.getDeployTransaction(overrides || {}); + return super.getDeployTransaction(_idsBitsSize, overrides || {}); } attach(address: string): ERC1155PackedBalance { return super.attach(address) as ERC1155PackedBalance; @@ -41,6 +52,17 @@ export class ERC1155PackedBalance__factory extends ContractFactory { } const _abi = [ + { + inputs: [ + { + internalType: "uint256", + name: "_idsBitsSize", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, { anonymous: false, inputs: [ @@ -140,6 +162,19 @@ const _abi = [ name: "TransferSingle", type: "event", }, + { + inputs: [], + name: "IDS_BITS_SIZE", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -209,7 +244,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -233,7 +268,7 @@ const _abi = [ type: "uint256", }, ], - stateMutability: "pure", + stateMutability: "view", type: "function", }, { @@ -366,4 +401,4 @@ const _abi = [ ]; const _bytecode = - "0x608060405234801561001057600080fd5b50611bb8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a25760003560e01c8063a22cb46511610076578063e985e9c51161005b578063e985e9c514610503578063eaec5f811461053e578063f242432a14610561576100a2565b8063a22cb46514610492578063db90e83c146104cd576100a2565b8062fdd58e146100a757806301ffc9a7146100f25780632eb2c2d6146101455780634e1273f41461031b575b600080fd5b6100e0600480360360408110156100bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610639565b60408051918252519081900360200190f35b6101316004803603602081101561010857600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661068e565b604080519115158252519081900360200190f35b610319600480360360a081101561015b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169181019060608101604082013564010000000081111561019c57600080fd5b8201836020820111156101ae57600080fd5b803590602001918460208302840111640100000000831117156101d057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022057600080fd5b82018360208201111561023257600080fd5b8035906020019184602083028401116401000000008311171561025457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111640100000000831117156102d857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506106f3945050505050565b005b6104426004803603604081101561033157600080fd5b81019060208101813564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184602083028401116401000000008311171561040457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107fe945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047e578181015183820152602001610466565b505050509050019250505060405180910390f35b610319600480360360408110156104a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610a7d565b6104ea600480360360208110156104e357600080fd5b5035610b16565b6040805192835260208301919091528051918290030190f35b6101316004803603604081101561051957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610b23565b6100e06004803603604081101561055457600080fd5b5080359060200135610b5e565b610319600480360360a081101561057757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105c457600080fd5b8201836020820111156105d657600080fd5b803590602001918460018302840111640100000000831117156105f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b71945050505050565b600080600061064784610b16565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106859082610b5e565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156106e2575060016106ee565b6106eb82610c75565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061071c575061071c8533610b23565b610771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611a1b603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806118e6603d913960400191505060405180910390fd5b6107e985858585610cbf565b6107f7858585855a866110cc565b5050505050565b8151815160609190811461085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806118ad6039913960400191505060405180910390fd5b60008061087d8560008151811061087057fe5b6020026020010151610b16565b9150915060008060008860008151811061089357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561090757600080fd5b50604051908082528060200260200182016040528015610931578160200160208202803683370190505b50905061093e8385610b5e565b8160008151811061094b57fe5b602090810291909101015260015b86811015610a705761097089828151811061087057fe5b909650945082861415806109d9575089818151811061098b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109b857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a47576000808b83815181106109ed57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a518486610b5e565b828281518110610a5d57fe5b6020908102919091010152600101610959565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6008810491600790911690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6020810282901c63ffffffff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610b9a5750610b9a8533610b23565b610bef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806119566037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611ad46038913960400191505060405180910390fd5b610c6785858585611343565b6107f7858585855a866113e7565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604281526020018061198d6042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610d565750600081115b15610f2857600080610d6e8560008151811061087057fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610dc69190849088908590610db757fe5b602002602001015160016115d8565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610e1c9190859089908590610e0d57fe5b602002602001015160006115d8565b90508360015b86811015610ed657610e3989828151811061087057fe5b9096509450818614610ea85773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610eb984868a8481518110610db757fe5b9350610ecc83868a8481518110610e0d57fe5b9250600101610e22565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550610fc5565b60005b81811015610fc357828181518110610f3f57fe5b6020026020010151610f6487868481518110610f5757fe5b6020026020010151610639565b1015610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611a576036913960400191505060405180910390fd5b600101610f2b565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611071578181015183820152602001611059565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156110b0578181015183820152602001611098565b5050505090500194505050505060405180910390a45050505050565b6110eb8573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156111a357818101518382015260200161118b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156111e25781810151838201526020016111ca565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561121e578181015183820152602001611206565b50505050905090810190601f16801561124b5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561127057600080fd5b5087f1158015611284573d6000803e3d6000fd5b50505050506040513d602081101561129b57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001806119cf604c913960600191505060405180910390fd5b505b505050505050565b6113508483836001611825565b61135d8383836000611825565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114068573ffffffffffffffffffffffffffffffffffffffff166117eb565b1561133b5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114bf5781810151838201526020016114a7565b50505050905090810190601f1680156114ec5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b15801561150f57600080fd5b5087f1158015611523573d6000803e3d6000fd5b50505050506040513d602081101561153a57600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611a8d6047913960600191505060405180910390fd5b60006020840263ffffffff828460018111156115f057fe5b14156116be5784821b8701925086831015611656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b64010000000087831c82168601106116b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611b516032913960400191505060405180910390fd5b6117e1565b60018460018111156116cc57fe5b14156117905784821b8703925086831115611732576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b84818389901c1610156116b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806119236033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611b0c6045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061181e57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061183185610b16565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091529020549193509150611871908286866115d8565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a264697066735822122086dcb9e8276fb8960941393e4916f63931eba4a32b7a348a28b7172cc63ca14d64736f6c63430007040033"; + "0x60c060405234801561001057600080fd5b50604051611e18380380611e188339818101604052602081101561003357600080fd5b50516101008110801561004f5750806101008161004c57fe5b06155b6100a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611de16037913960400191505060405180910390fd5b608081905280610100816100b457fe5b0460a0525060805160a051611cf16100f060003980610b3e5280610b6a525080610b9b5280610bfc52806116b552806117735250611cf16000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c8063db90e83c11610076578063e985e9c51161005b578063e985e9c514610526578063eaec5f8114610561578063f242432a14610584576100bd565b8063db90e83c146104e8578063ddcc74ab1461051e576100bd565b80632eb2c2d6116100a75780632eb2c2d6146101605780634e1273f414610336578063a22cb465146104ad576100bd565b8062fdd58e146100c257806301ffc9a71461010d575b600080fd5b6100fb600480360360408110156100d857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561065c565b60408051918252519081900360200190f35b61014c6004803603602081101561012357600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166106b1565b604080519115158252519081900360200190f35b610334600480360360a081101561017657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156101b757600080fd5b8201836020820111156101c957600080fd5b803590602001918460208302840111640100000000831117156101eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561023b57600080fd5b82018360208201111561024d57600080fd5b8035906020019184602083028401116401000000008311171561026f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156102bf57600080fd5b8201836020820111156102d157600080fd5b803590602001918460018302840111640100000000831117156102f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610716945050505050565b005b61045d6004803603604081101561034c57600080fd5b81019060208101813564010000000081111561036757600080fd5b82018360208201111561037957600080fd5b8035906020019184602083028401116401000000008311171561039b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610821945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610499578181015183820152602001610481565b505050509050019250505060405180910390f35b610334600480360360408110156104c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610aa0565b610505600480360360208110156104fe57600080fd5b5035610b39565b6040805192835260208301919091528051918290030190f35b6100fb610b99565b61014c6004803603604081101561053c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610bbd565b6100fb6004803603604081101561057757600080fd5b5080359060200135610bf8565b610334600480360360a081101561059a57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156105e757600080fd5b8201836020820111156105f957600080fd5b8035906020019184600183028401116401000000008311171561061b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610c4a945050505050565b600080600061066a84610b39565b73ffffffffffffffffffffffffffffffffffffffff871660009081526020818152604080832085845290915290205491935091506106a89082610bf8565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000141561070557506001610711565b61070e82610d4e565b90505b919050565b3373ffffffffffffffffffffffffffffffffffffffff8616148061073f575061073f8533610bbd565b610794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611b54603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611a1f603d913960400191505060405180910390fd5b61080c85858585610d98565b61081a858585855a866111a5565b5050505050565b81518151606091908114610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806119e66039913960400191505060405180910390fd5b6000806108a08560008151811061089357fe5b6020026020010151610b39565b915091506000806000886000815181106108b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060608567ffffffffffffffff8111801561092a57600080fd5b50604051908082528060200260200182016040528015610954578160200160208202803683370190505b5090506109618385610bf8565b8160008151811061096e57fe5b602090810291909101015260015b86811015610a935761099389828151811061089357fe5b909650945082861415806109fc57508981815181106109ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a60018303815181106109db57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a6a576000808b8381518110610a1057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610a748486610bf8565b828281518110610a8057fe5b602090810291909101015260010161097c565b5098975050505050505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000008381610b6557fe5b0491507f00000000000000000000000000000000000000000000000000000000000000008381610b9157fe5b069050915091565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b60017f000000000000000000000000000000000000000000000000000000000000000090811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0191029190911c1690565b3373ffffffffffffffffffffffffffffffffffffffff86161480610c735750610c738533610bbd565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180611a8f6037913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180611c0d6038913960400191505060405180910390fd5b610d408585858561141c565b61081a858585855a866114c0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b815181518114610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180611ac66042913960600191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614158015610e2f5750600081115b1561100157600080610e478560008151811061089357fe5b73ffffffffffffffffffffffffffffffffffffffff8916600090815260208181526040808320858452909152812054875193955091935091610e9f9190849088908590610e9057fe5b602002602001015160016116b1565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832087845290915281205487519293509091610ef59190859089908590610ee657fe5b602002602001015160006116b1565b90508360015b86811015610faf57610f1289828151811061089357fe5b9096509450818614610f815773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b610f9284868a8481518110610e9057fe5b9350610fa583868a8481518110610ee657fe5b9250600101610efb565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a1681528082528381209581529490529220919091555061109e565b60005b8181101561109c5782818151811061101857fe5b602002602001015161103d8786848151811061103057fe5b602002602001015161065c565b1015611094576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180611b906036913960400191505060405180910390fd5b600101611004565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561114a578181015183820152602001611132565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611189578181015183820152602001611171565b5050505090500194505050505060405180910390a45050505050565b6111c48573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561127c578181015183820152602001611264565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156112bb5781810151838201526020016112a3565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156112f75781810151838201526020016112df565b50505050905090810190601f1680156113245780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561134957600080fd5b5087f115801561135d573d6000803e3d6000fd5b50505050506040513d602081101561137457600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c815260200180611b08604c913960600191505060405180910390fd5b505b505050505050565b611429848383600161195e565b611436838383600061195e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6114df8573ffffffffffffffffffffffffffffffffffffffff16611924565b156114145760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611598578181015183820152602001611580565b50505050905090810190601f1680156115c55780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b1580156115e857600080fd5b5087f11580156115fc573d6000803e3d6000fd5b50505050506040513d602081101561161357600080fd5b505190507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526047815260200180611bc66047913960600191505060405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000848102906001901b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018284600181111561170b57fe5b14156117f75784821b8701925086831015611771576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060020a87831c82168601106117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c8a6032913960400191505060405180910390fd5b61191a565b600184600181111561180557fe5b14156118c95784821b870392508683111561186b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b84818389901c1610156117f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180611a5c6033913960400191505060405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526045815260200180611c456045913960600191505060405180910390fd5b5050949350505050565b6000813f801580159061195757507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b60008061196a85610b39565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506119aa908286866116b1565b73ffffffffffffffffffffffffffffffffffffffff90961660009081526020818152604080832094835293905291909120949094555050505056fe455243313135355061636b656442616c616e63652362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e475448455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20554e444552464c4f57455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448455243313135355061636b656442616c616e6365235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e6365237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52455243313135355061636b656442616c616e6365235f7361666542617463685472616e7366657246726f6d3a20554e444552464c4f57455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745455243313135355061636b656442616c616e636523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e54455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a20494e56414c49445f42494e5f57524954455f4f5045524154494f4e455243313135355061636b656442616c616e6365235f7669657755706461746542696e56616c75653a204f564552464c4f57a2646970667358221220e7e6bb069cbf5f70df75d93ef378d3f4973c734157f1b98614c00dec99423b5264736f6c63430007040033455243313135355061636b656442616c616e636523636f6e7374727563746f723a20496e76616c6964204944535f424954535f53495a45"; diff --git a/src/package.json b/src/package.json index 16cc794..2f0a72a 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/erc-1155", - "version": "3.0.7", + "version": "4.0.0", "description": "ERC1155 Multi-Token Standard implementation for Ethereum", "repository": "https://github.com/0xsequence/erc-1155", "homepage": "https://sequence.build", diff --git a/tests/ERC1155MetaPackedBalance.spec.ts b/tests/ERC1155MetaPackedBalance.spec.ts index 254d0d6..88f7a4d 100644 --- a/tests/ERC1155MetaPackedBalance.spec.ts +++ b/tests/ERC1155MetaPackedBalance.spec.ts @@ -9,7 +9,8 @@ import { encodeMetaApprovalData, GasReceiptType, ethSign, - createTestWallet + createTestWallet, + FILTERED_VALID_ID_BITS } from './utils' import { utils, BigNumber } from 'ethers' @@ -38,10 +39,19 @@ ownerProvider.pollingInterval = 1000 operatorProvider.pollingInterval = 1000 receiverProvider.pollingInterval = 1000 +function valFor(bits, tier) { + switch (bits) { + case 1: return 1 + case 2: return [1, 2, 3][tier] + case 4: return [2, 5, 11][tier] + case 8: return [2, 100, 200][tier] + case 16: return [2, 520, 1100][tier] + } + + return [50, 5000, 15000][tier] +} + describe('ERC1155MetaPackedBalance', () => { - const MAXVAL = BigNumber.from(2) - .pow(32) - .sub(1) // 2**32 - 1 const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' const DOMAIN_SEPARATOR_TYPEHASH = '0x035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749' @@ -51,10 +61,6 @@ describe('ERC1155MetaPackedBalance', () => { let erc1155Abstract: AbstractContract let operatorAbstract: AbstractContract - let erc1155Contract: ERC1155MetaMintBurnPackedBalanceMock - let operatorERC1155Contract: ERC1155MetaMintBurnPackedBalanceMock - let receiverERC1155Contract: ERC1155MetaMintBurnPackedBalanceMock - // load contract abi and deploy to test server before(async () => { ownerAddress = await ownerWallet.getAddress() @@ -65,456 +71,167 @@ describe('ERC1155MetaPackedBalance', () => { operatorAbstract = await AbstractContract.fromArtifactName('ERC1155OperatorMock') }) - // deploy before each test, to reset state of contract - beforeEach(async () => { - erc1155Contract = (await erc1155Abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock - operatorERC1155Contract = (await erc1155Contract.connect(operatorSigner)) as ERC1155MetaMintBurnPackedBalanceMock - receiverERC1155Contract = (await erc1155Contract.connect(receiverSigner)) as ERC1155MetaMintBurnPackedBalanceMock - }) - - describe('metaSafeTransferFrom() (Meta) Function', () => { - let receiverContract: ERC1155ReceiverMock - let operatorContract: ERC1155OperatorMock - - let transferData: string | null = 'Hello from the other side' - const initBalance = 100 - const amount = 10 - const nonce = BigNumber.from(0) - const id = 66 - - const feeTokenID = 666 - let isGasReceipt: boolean = true - const feeTokenInitBalance = BigNumber.from(100000000) - - const feeType = 0 //ERC-11555 - let feeToken: BigNumber - let feeTokenAddress: string - let feeTokenDataERC1155: string | Uint8Array - - let transferObj: TransferSignature - let domainHash: string - let gasReceipt: GasReceipt | null - let data: string - - const conditions = [ - [transferData, true, 'Gas receipt & transfer data'], - [null, true, 'Gas receipt w/o transfer data'], - [transferData, false, 'Transfer data w/o gas receipt '], - [null, false, 'No Gas receipt & No transfer data'] - ] - - conditions.forEach(function(condition) { - context(condition[2] as string, () => { - beforeEach(async () => { - // Get conditions - transferData = condition[0] as string | null - isGasReceipt = condition[1] as boolean - - // Deploy contracts - const abstract = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') - receiverContract = (await abstract.deploy(ownerWallet)) as ERC1155ReceiverMock - operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock - - feeTokenAddress = erc1155Contract.address - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [feeTokenAddress, feeTokenID, feeType] - ) - - // Gas Receipt - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 30000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Transfer Signature Object - transferObj = { - contractAddress: erc1155Contract.address, - signerWallet: ownerWallet, - receiver: receiverAddress, - id: id, - amount: amount, - isGasFee: isGasReceipt, - transferData: transferData === null ? null : utils.toUtf8Bytes(transferData), - nonce: nonce - } - - // Mint tokens - await erc1155Contract.mintMock(ownerAddress, id, initBalance, []) - - // Mint tokens used to pay for gas - await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - - // Get domain hash - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) - ) - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - }) - - it("should REVERT if data is 'random", async () => { - const dataUint8 = utils.toUtf8Bytes('Breakthroughs! over the river! flips and crucifixions! gone down the flood!') - const data = BigNumber.from(dataUint8).toHexString() - - // Check if data lelngth is more than 69 - expect(ethers.utils.arrayify(data).length).to.be.at.least(70) - - const tx = erc1155Contract.metaSafeTransferFrom(ownerAddress, receiverContract.address, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError()) - }) - - it('should REVERT if contract address is incorrect', async () => { - // Domain hash - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverContract.address]) - ) - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if signer address is incorrect', async () => { - transferObj.signerWallet = operatorWallet - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if receiver address is incorrect', async () => { - transferObj.receiver = ownerAddress - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if token id is incorrect', async () => { - transferObj.id = id + 1 - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + FILTERED_VALID_ID_BITS.map((bits) => { + const MAXVAL = BigNumber.from(2) + .pow(bits) + .sub(1) // 2**bits - 1 + + const c = process.env.TEST_BIT ? context.only : context + c(`With ${bits} bits for values`, () => { + let erc1155Contract: ERC1155MetaMintBurnPackedBalanceMock + let operatorERC1155Contract: ERC1155MetaMintBurnPackedBalanceMock + let receiverERC1155Contract: ERC1155MetaMintBurnPackedBalanceMock + + // deploy before each test, to reset state of contract + beforeEach(async () => { + erc1155Contract = (await erc1155Abstract.deploy(ownerWallet, [bits])) as ERC1155MetaMintBurnPackedBalanceMock + operatorERC1155Contract = (await erc1155Contract.connect(operatorSigner)) as ERC1155MetaMintBurnPackedBalanceMock + receiverERC1155Contract = (await erc1155Contract.connect(receiverSigner)) as ERC1155MetaMintBurnPackedBalanceMock + }) - it('should REVERT if token amount is incorrect', async () => { - transferObj.amount = amount + 1 - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + describe('metaSafeTransferFrom() (Meta) Function', () => { + let receiverContract: ERC1155ReceiverMock + let operatorContract: ERC1155OperatorMock + + let transferData: string | null = 'Hello from the other side' + const initBalance = valFor(bits, 2) + const amount = valFor(bits, 0) + const nonce = BigNumber.from(0) + const id = 66 + + const feeTokenID = 666 + let isGasReceipt: boolean = true + const feeTokenInitBalance = BigNumber.from(valFor(bits, 2)) + + const feeType = 0 //ERC-11555 + let feeToken: BigNumber + let feeTokenAddress: string + let feeTokenDataERC1155: string | Uint8Array + + let transferObj: TransferSignature + let domainHash: string + let gasReceipt: GasReceipt | null + let data: string + + const conditions = [ + [transferData, true, 'Gas receipt & transfer data'], + [null, true, 'Gas receipt w/o transfer data'], + [transferData, false, 'Transfer data w/o gas receipt '], + [null, false, 'No Gas receipt & No transfer data'] + ] + + conditions.forEach(function(condition) { + context(condition[2] as string, () => { + beforeEach(async () => { + // Get conditions + transferData = condition[0] as string | null + isGasReceipt = condition[1] as boolean - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + // Deploy contracts + const abstract = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') + receiverContract = (await abstract.deploy(ownerWallet)) as ERC1155ReceiverMock + operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock - it('should REVERT if transfer data is incorrect', async () => { - const sigArgTypes = ['address', 'address', 'address', 'uint256', 'uint256', 'uint256'] - const txDataTypes = ['bytes', 'bytes'] - - const signer = await transferObj.signerWallet.getAddress() - - // Packed encoding of transfer signature message - let sigData = ethers.utils.solidityPack(sigArgTypes, [ - transferObj.contractAddress, - signer, - transferObj.receiver, - transferObj.id, - transferObj.amount, - transferObj.nonce - ]) - - const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData - let goodGasAndTransferData - let badGasAndTransferData - - // Correct and incorrect transferData - if (isGasReceipt) { - goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode([GasReceiptType, 'bytes'], [gasReceipt, transferData]) - badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [gasReceipt, utils.toUtf8Bytes('Goodbyebyebye')] - ) - } else { - goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [transferData]) - badGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [utils.toUtf8Bytes('Goodbyebyebye')]) - } - - // Encode normally the whole thing - sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) - - // Get signature - const sig = (await ethSign(transferObj.signerWallet, sigData)).slice(0, -2) - const paddedNonce = ethers.utils.solidityPack(['uint256'], [transferObj.nonce]) - const ethsig_nonce = sig + paddedNonce.slice(2) + '02' // encode packed the nonce - - // PASS BAD DATA - data = ethers.utils.defaultAbiCoder.encode(txDataTypes, [ethsig_nonce, badGasAndTransferData]) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + feeTokenAddress = erc1155Contract.address - it('should REVERT if nonce is incorrect', async () => { - transferObj.nonce = nonce.add(101) - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [feeTokenAddress, feeTokenID, feeType] + ) - // Nonce higher - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) + // Gas Receipt + gasReceipt = { + gasLimitCallback: 130000, + gasFee: valFor(bits, 0), + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } - // Correct nonce - transferObj.nonce = nonce - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - await operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null - // Nonce lower - const tx2 = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - }) + // Transfer Signature Object + transferObj = { + contractAddress: erc1155Contract.address, + signerWallet: ownerWallet, + receiver: receiverAddress, + id: id, + amount: amount, + isGasFee: isGasReceipt, + transferData: transferData === null ? null : utils.toUtf8Bytes(transferData), + nonce: nonce + } - it('should PASS if signature is valid', async () => { - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.fulfilled - }) + // Mint tokens + await erc1155Contract.mintMock(ownerAddress, id, initBalance, []) - describe('ERC-1271 Receiver', () => { - let erc1271WalletValidationMockContract: ERC1271WalletValidationMock - let ERC1271WalletValidationMockAbstract: AbstractContract + // Mint tokens used to pay for gas + await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - let erc1271WalletAddress + // Get domain hash + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) + ) - beforeEach(async () => { - ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') - erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ - domainHash - ])) as ERC1271WalletValidationMock - erc1271WalletAddress = erc1271WalletValidationMockContract.address + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + }) - await erc1155Contract.mintMock(erc1271WalletAddress, id, initBalance, []) - await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) - }) + it("should REVERT if data is 'random'", async () => { + const dataUint8 = utils.toUtf8Bytes('Breakthroughs! over the river! flips and crucifixions! gone down the flood!') + const data = BigNumber.from(dataUint8).toHexString() - describe(`EIP-1271 (bytes) signatures (03)`, () => { - it('should return REVERT if signature is invalid', async () => { - transferObj.from = erc1271WalletAddress - transferObj.signerWallet = receiverWallet + // Check if data lelngth is more than 69 + expect(ethers.utils.arrayify(data).length).to.be.at.least(70) - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + const tx = erc1155Contract.metaSafeTransferFrom(ownerAddress, receiverContract.address, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError()) }) - it('should REVERT if token ID is not 66', async () => { - const badID = 77 - await erc1155Contract.mintMock(erc1271WalletAddress, badID, initBalance, []) - transferObj.from = erc1271WalletAddress - transferObj.id = badID - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } + it('should REVERT if contract address is incorrect', async () => { + // Domain hash + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverContract.address]) ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - it('should REVERT if amount is more than 100', async () => { - await erc1155Contract.mintMock(erc1271WalletAddress, id, 101, []) - transferObj.from = erc1271WalletAddress - transferObj.amount = 101 - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should PASS if signature is valid', async () => { - transferObj.from = erc1271WalletAddress - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.fulfilled - }) - }) - - describe(`EIP-1271 (bytes32) signatures (04)`, () => { - it('should return REVERT if signature is invalid', async () => { - transferObj.from = erc1271WalletAddress - transferObj.signerWallet = receiverWallet + it('should REVERT if signer address is incorrect', async () => { + transferObj.signerWallet = operatorWallet + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '04') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should PASS if signature is valid', async () => { - transferObj.from = erc1271WalletAddress - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '04') - const tx = operatorERC1155Contract.metaSafeTransferFrom( - erc1271WalletAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.fulfilled - }) - }) - }) - - describe('When signature is valid', () => { - it('should REVERT if insufficient balance', async () => { - transferObj.amount = initBalance + 1 - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - initBalance + 1, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) - }) - - it('should REVERT if sending to 0x0', async () => { - transferObj.receiver = ZERO_ADDRESS - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, ZERO_ADDRESS, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#metaSafeTransferFrom: INVALID_RECIPIENT')) - }) - - it('should REVERT if transfer leads to overflow', async () => { - await erc1155Contract.mintMock(receiverAddress, id, MAXVAL, []) - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT when sending to non-receiver contract', async () => { - transferObj.receiver = erc1155Contract.address - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - erc1155Contract.address, - id, - amount, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should REVERT if invalid response from receiver contract', async () => { - transferObj.receiver = receiverContract.address - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - // Force invalid response - await receiverContract.setShouldReject(true) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverContract.address, - id, - amount, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith( - RevertError('ERC1155PackedBalance#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE') - ) - }) - - it('should PASS if valid response from receiver contract', async () => { - transferObj.receiver = receiverContract.address - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverContract.address, - id, - amount, - isGasReceipt, - data - ) - - //await expect(tx).to.be.fulfilled - await expect(tx).to.be.fulfilled - }) + it('should REVERT if receiver address is incorrect', async () => { + transferObj.receiver = ownerAddress + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - describe('When gas is reimbursed', () => { - before(async function() { - if (!condition[1]) { - this.test!.parent!.pending = true - this.skip() - } + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should send gas fee to msg.sender is fee recipient ix 0x0', async () => { - gasReceipt!.feeRecipient = ZERO_ADDRESS - + it('should REVERT if token id is incorrect', async () => { + transferObj.id = id + 1 data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - await receiverERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - - const receiverBalance = await erc1155Contract.balanceOf(receiverAddress, feeTokenID) - - expect(gasReceipt!.gasFee).to.be.eql(receiverBalance.toNumber()) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should send gas fee to specified fee recipient (if not 0x0), not tx.origin', async () => { - await receiverERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - const operatorBalance = await erc1155Contract.balanceOf(operatorAddress, feeTokenID) + it('should REVERT if token amount is incorrect', async () => { + transferObj.amount = amount + 1 + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - expect(gasReceipt!.gasFee).to.be.eql(operatorBalance.toNumber()) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should REVERT if gasReceipt is incorrect', async () => { + it('should REVERT if transfer data is incorrect', async () => { const sigArgTypes = ['address', 'address', 'address', 'uint256', 'uint256', 'uint256'] const txDataTypes = ['bytes', 'bytes'] @@ -530,20 +247,21 @@ describe('ERC1155MetaPackedBalance', () => { transferObj.nonce ]) - // Form bad gas receipt - const badGasReceipt = { ...gasReceipt, gasPrice: 109284123 } - const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData + let goodGasAndTransferData + let badGasAndTransferData // Correct and incorrect transferData - const goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [gasReceipt, transferData] - ) - const badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [badGasReceipt, transferData] - ) + if (isGasReceipt) { + goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode([GasReceiptType, 'bytes'], [gasReceipt, transferData]) + badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [gasReceipt, utils.toUtf8Bytes('Goodbyebyebye')] + ) + } else { + goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [transferData]) + badGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [utils.toUtf8Bytes('Goodbyebyebye')]) + } // Encode normally the whole thing sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) @@ -556,808 +274,921 @@ describe('ERC1155MetaPackedBalance', () => { // PASS BAD DATA data = ethers.utils.defaultAbiCoder.encode(txDataTypes, [ethsig_nonce, badGasAndTransferData]) - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data - ) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should PASS if another approved ERC-1155 is used for fee', async () => { - const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock - await erc1155Contract2.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - await erc1155Contract2.setApprovalForAll(operatorERC1155Contract.address, true) - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [erc1155Contract2.address, feeTokenID, 0] - ) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.fulfilled - }) - - it('should REVERT if NOT approved ERC-1155 is used for fee', async () => { - const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock - await erc1155Contract2.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [erc1155Contract2.address, feeTokenID, 0] - ) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method + it('should REVERT if nonce is incorrect', async () => { + transferObj.nonce = nonce.add(101) data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#safeTransferFrom: INVALID_OPERATOR')) - }) - - it('should REVERT if another ERC-1155 is used for fee without sufficient balance', async () => { - const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock - await erc1155Contract2.mintMock(ownerAddress, feeTokenID, 100, []) - await erc1155Contract2.setApprovalForAll(operatorERC1155Contract.address, true) - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [erc1155Contract2.address, feeTokenID, 0] - ) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null + // Nonce higher + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - // Data to pass in transfer method + // Correct nonce + transferObj.nonce = nonce data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + await operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) + // Nonce lower + const tx2 = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) }) - it('should PASS if approved ERC20 is used for fee', async () => { - const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') - const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock - await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) - await erc20Contract.approve(operatorERC1155Contract.address, feeTokenInitBalance) - - const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC20 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) + it('should PASS if signature is valid', async () => { + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) await expect(tx).to.be.fulfilled }) - it('should REVERT if NOT approved ERC20 is used for fee', async () => { - const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') - const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock - await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) - - const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC20 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('SafeMath#sub: UNDERFLOW')) - }) - - it('should REVERT if approved ERC20 balance is insufficient', async () => { - const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') - const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock - await erc20Contract.mockMint(ownerAddress, 100) - - const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC20 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('SafeMath#sub: UNDERFLOW')) - }) - - it('should REVERT if FeeTokenType is not supported', async () => { - const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') - const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock - await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) - await erc20Contract.approve(operatorERC1155Contract.address, feeTokenInitBalance) - - let feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 2]) - - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC20 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_transferGasFee: UNSUPPORTED_TOKEN')) + describe('ERC-1271 Receiver', () => { + let erc1271WalletValidationMockContract: ERC1271WalletValidationMock + let ERC1271WalletValidationMockAbstract: AbstractContract - feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 3]) + let erc1271WalletAddress - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 1000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC20 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Data to pass in transfer method - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - - const tx2 = operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_transferGasFee: UNSUPPORTED_TOKEN')) - }) + beforeEach(async () => { + ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') + erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ + domainHash + ])) as ERC1271WalletValidationMock + erc1271WalletAddress = erc1271WalletValidationMockContract.address + + await erc1155Contract.mintMock(erc1271WalletAddress, id, initBalance, []) + await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) + }) - it('should REVERT if gas receipt is passed, but not claimed', async () => { - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + describe(`EIP-1271 (bytes) signatures (03)`, () => { + it('should return REVERT if signature is invalid', async () => { + transferObj.from = erc1271WalletAddress + transferObj.signerWallet = receiverWallet + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if token ID is not 66', async () => { + const badID = 77 + await erc1155Contract.mintMock(erc1271WalletAddress, badID, initBalance, []) + transferObj.from = erc1271WalletAddress + transferObj.id = badID + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + if (bits > 8) { + it('should REVERT if amount is more than 100', async () => { + await erc1155Contract.mintMock(erc1271WalletAddress, id, 101, []) + transferObj.from = erc1271WalletAddress + transferObj.amount = 101 + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + } - it('should REVERT if gas receipt is passed but isGasFee is false', async () => { - transferObj.isGasFee = false - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + it('should PASS if signature is valid', async () => { + transferObj.from = erc1271WalletAddress + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + }) - it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { - transferObj.isGasFee = false - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) - await expect(tx).to.be.fulfilled + describe(`EIP-1271 (bytes32) signatures (04)`, () => { + it('should return REVERT if signature is invalid', async () => { + transferObj.from = erc1271WalletAddress + transferObj.signerWallet = receiverWallet + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if signature is valid', async () => { + transferObj.from = erc1271WalletAddress + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSafeTransferFrom( + erc1271WalletAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + }) }) - describe('When receiver is a contract', () => { - it('should REVERT if gas used in onERC1155Received exceeds limit', async () => { - const lowGasLimit = 1000 - gasReceipt!.gasLimitCallback = lowGasLimit - transferObj.receiver = receiverContract.address - + describe('When signature is valid', () => { + it('should REVERT if insufficient balance', async () => { + transferObj.amount = initBalance + 1 data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) const tx = operatorERC1155Contract.metaSafeTransferFrom( ownerAddress, - receiverContract.address, + receiverAddress, id, - amount, + initBalance + 1, isGasReceipt, - data, - { gasLimit: 2000000 } + data ) - await expect(tx).to.be.rejectedWith(RevertError()) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) }) - it('should PASS if gas used in onERC1155Received does not exceed limit', async () => { - const okGasLimit = 10000 - gasReceipt!.gasLimitCallback = okGasLimit - transferObj.receiver = receiverContract.address + it('should REVERT if sending to 0x0', async () => { + transferObj.receiver = ZERO_ADDRESS + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, ZERO_ADDRESS, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#metaSafeTransferFrom: INVALID_RECIPIENT')) + }) + + it('should REVERT if transfer leads to overflow', async () => { + await erc1155Contract.mintMock(receiverAddress, id, MAXVAL, []) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT when sending to non-receiver contract', async () => { + transferObj.receiver = erc1155Contract.address data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) const tx = operatorERC1155Contract.metaSafeTransferFrom( ownerAddress, - receiverContract.address, + erc1155Contract.address, id, amount, isGasReceipt, - data, - { gasLimit: 2000000 } + data ) - await expect(tx).to.be.fulfilled + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) }) - it('should PASS if gasLimit is higher than gas sent in transaction', async () => { - const highGasLimit = 3000000 - gasReceipt!.gasLimitCallback = highGasLimit + it('should REVERT if invalid response from receiver contract', async () => { transferObj.receiver = receiverContract.address - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + // Force invalid response + await receiverContract.setShouldReject(true) + const tx = operatorERC1155Contract.metaSafeTransferFrom( ownerAddress, receiverContract.address, id, amount, isGasReceipt, - data, - { gasLimit: 2000000 } + data ) - await expect(tx).to.be.fulfilled - }) - }) - }) - - describe('When gas is NOT reimbursed', () => { - before(async function() { - if (condition[1]) { - this.test!.parent!.pending = true - this.skip() - } - }) - - it('should PASS if gas receipt is not passed and not claimed', async () => { - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) - await expect(tx).to.be.fulfilled - }) - - it('should REVER if gas receipt is not passed and claimed', async () => { - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { - transferObj.isGasFee = true - data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) - await expect(tx).to.be.rejectedWith(RevertError()) - }) - }) - - context('When successful transfer', () => { - let tx: ethers.ContractTransaction - - beforeEach(async () => { - tx = await operatorERC1155Contract.metaSafeTransferFrom( - ownerAddress, - receiverAddress, - id, - amount, - isGasReceipt, - data - ) - }) - - it('should correctly update balance of sender', async () => { - const balance = await erc1155Contract.balanceOf(ownerAddress, id) - expect(balance).to.be.eql(BigNumber.from(initBalance - amount)) - }) - - it('should correctly update balance of receiver', async () => { - const balance = await erc1155Contract.balanceOf(receiverAddress, id) - expect(balance).to.be.eql(BigNumber.from(amount)) - }) - - describe('When gas is reimbursed', () => { - before(async function() { - if (!condition[1]) { - this.test!.parent!.pending = true - this.skip() - } - }) - - it('should update gas token balance of sender', async () => { - const senderBalance = await erc1155Contract.balanceOf(ownerAddress, feeTokenID) - expect(senderBalance).to.be.eql(feeTokenInitBalance.sub(gasReceipt!.gasFee)) - }) - - it('should update gas token balance of executor', async () => { - const balance = await erc1155Contract.balanceOf(operatorAddress, feeTokenID) - expect(gasReceipt!.gasFee).to.be.eql(balance.toNumber()) - }) - }) - - describe('TransferSingle event', async () => { - let filterFromOperatorContract: ethers.ethers.EventFilter - - it('should emit TransferSingle event', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events!.pop()! - expect(ev.event).to.be.eql('TransferSingle') - }) - - it('should have `msg.sender` as `_operator` field, not _from', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events!.pop()! - - const args = ev.args! as any - expect(args._operator).to.be.eql(operatorAddress) - }) - - it('should have `msg.sender` as `_operator` field, not tx.origin', async () => { - // Get event filter to get internal tx event - filterFromOperatorContract = erc1155Contract.filters.TransferSingle( - operatorContract.address, - null, - null, - null, - null + await expect(tx).to.be.rejectedWith( + RevertError('ERC1155PackedBalance#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE') ) + }) - // Increment nonce because it's the second transfer - transferObj.nonce = nonce.add(1) + it('should PASS if valid response from receiver contract', async () => { + transferObj.receiver = receiverContract.address data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) - // Execute transfer from operator contract - // @ts-ignore (https://github.com/ethereum-ts/TypeChain/issues/118) - await operatorContract.metaSafeTransferFrom( - erc1155Contract.address, + const tx = operatorERC1155Contract.metaSafeTransferFrom( ownerAddress, - receiverAddress, + receiverContract.address, id, amount, isGasReceipt, data, - { gasLimit: 1000000 } // INCORRECT GAS ESTIMATION - ) - - // Get logs from internal transaction event - // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) - filterFromOperatorContract.fromBlock = 0 - const logs = await operatorProvider.getLogs(filterFromOperatorContract) - const args = erc1155Contract.interface.decodeEventLog( - erc1155Contract.interface.events['TransferSingle(address,address,address,uint256,uint256)'], - logs[0].data, - logs[0].topics + { gasLimit: 6000000 } ) - // operator arg should be equal to msg.sender, not tx.origin - expect(args._operator).to.be.eql(operatorContract.address) + //await expect(tx).to.be.fulfilled + await expect(tx).to.be.fulfilled }) - it('should emit NonceChange event', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] - expect(ev.event).to.be.eql('NonceChange') + describe('When gas is reimbursed', () => { + before(async function() { + if (!condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should send gas fee to msg.sender is fee recipient ix 0x0', async () => { + gasReceipt!.feeRecipient = ZERO_ADDRESS + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + await receiverERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + + const receiverBalance = await erc1155Contract.balanceOf(receiverAddress, feeTokenID) + + expect(gasReceipt!.gasFee).to.be.eql(receiverBalance.toNumber()) + }) + + it('should send gas fee to specified fee recipient (if not 0x0), not tx.origin', async () => { + await receiverERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, isGasReceipt, data) + const operatorBalance = await erc1155Contract.balanceOf(operatorAddress, feeTokenID) + + expect(gasReceipt!.gasFee).to.be.eql(operatorBalance.toNumber()) + }) + + it('should REVERT if gasReceipt is incorrect', async () => { + const sigArgTypes = ['address', 'address', 'address', 'uint256', 'uint256', 'uint256'] + const txDataTypes = ['bytes', 'bytes'] + + const signer = await transferObj.signerWallet.getAddress() + + // Packed encoding of transfer signature message + let sigData = ethers.utils.solidityPack(sigArgTypes, [ + transferObj.contractAddress, + signer, + transferObj.receiver, + transferObj.id, + transferObj.amount, + transferObj.nonce + ]) + + // Form bad gas receipt + const badGasReceipt = { ...gasReceipt, gasPrice: 109284123 } + + const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData + + // Correct and incorrect transferData + const goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [gasReceipt, transferData] + ) + const badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [badGasReceipt, transferData] + ) + + // Encode normally the whole thing + sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) + + // Get signature + const sig = (await ethSign(transferObj.signerWallet, sigData)).slice(0, -2) + const paddedNonce = ethers.utils.solidityPack(['uint256'], [transferObj.nonce]) + const ethsig_nonce = sig + paddedNonce.slice(2) + '02' // encode packed the nonce + + // PASS BAD DATA + data = ethers.utils.defaultAbiCoder.encode(txDataTypes, [ethsig_nonce, badGasAndTransferData]) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if another approved ERC-1155 is used for fee', async () => { + const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet, [32])) as ERC1155MetaMintBurnPackedBalanceMock + await erc1155Contract2.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) + await erc1155Contract2.setApprovalForAll(operatorERC1155Contract.address, true) + + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [erc1155Contract2.address, feeTokenID, 0] + ) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: valFor(bits, 2), + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + + it('should REVERT if NOT approved ERC-1155 is used for fee', async () => { + const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet, [32])) as ERC1155MetaMintBurnPackedBalanceMock + await erc1155Contract2.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) + + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [erc1155Contract2.address, feeTokenID, 0] + ) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#safeTransferFrom: INVALID_OPERATOR')) + }) + + it('should REVERT if another ERC-1155 is used for fee without sufficient balance', async () => { + const erc1155Contract2 = (await erc1155Abstract.deploy(ownerWallet, [32])) as ERC1155MetaMintBurnPackedBalanceMock + await erc1155Contract2.mintMock(ownerAddress, feeTokenID, 100, []) + await erc1155Contract2.setApprovalForAll(operatorERC1155Contract.address, true) + + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [erc1155Contract2.address, feeTokenID, 0] + ) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) + }) + + it('should PASS if approved ERC20 is used for fee', async () => { + const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') + const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock + await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) + await erc20Contract.approve(operatorERC1155Contract.address, feeTokenInitBalance) + + const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: valFor(bits, 2), + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC20 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + + it('should REVERT if NOT approved ERC20 is used for fee', async () => { + const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') + const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock + await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) + + const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC20 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('SafeMath#sub: UNDERFLOW')) + }) + + it('should REVERT if approved ERC20 balance is insufficient', async () => { + const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') + const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock + await erc20Contract.mockMint(ownerAddress, 100) + + const feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 1]) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC20 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('SafeMath#sub: UNDERFLOW')) + }) + + it('should REVERT if FeeTokenType is not supported', async () => { + const erc20Abstract = await AbstractContract.fromArtifactName('ERC20Mock') + const erc20Contract = (await erc20Abstract.deploy(ownerWallet)) as ERC20Mock + await erc20Contract.mockMint(ownerAddress, feeTokenInitBalance) + await erc20Contract.approve(operatorERC1155Contract.address, feeTokenInitBalance) + + let feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 2]) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC20 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_transferGasFee: UNSUPPORTED_TOKEN')) + + feeTokenDataERC20 = ethers.utils.defaultAbiCoder.encode(['address', 'uint8'], [erc20Contract.address, 3]) + + gasReceipt = { + gasLimitCallback: 130000, + gasFee: 1000, + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC20 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + + // Data to pass in transfer method + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx2 = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_transferGasFee: UNSUPPORTED_TOKEN')) + }) + + it('should REVERT if gas receipt is passed, but not claimed', async () => { + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if gas receipt is passed but isGasFee is false', async () => { + transferObj.isGasFee = false + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { + transferObj.isGasFee = false + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) + await expect(tx).to.be.fulfilled + }) + + describe('When receiver is a contract', () => { + it('should REVERT if gas used in onERC1155Received exceeds limit', async () => { + const lowGasLimit = 1000 + gasReceipt!.gasLimitCallback = lowGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverContract.address, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError()) + }) + + it('should PASS if gas used in onERC1155Received does not exceed limit', async () => { + const okGasLimit = 10500 + gasReceipt!.gasLimitCallback = okGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverContract.address, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + + it('should PASS if gasLimit is higher than gas sent in transaction', async () => { + const highGasLimit = 3000000 + gasReceipt!.gasLimitCallback = highGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverContract.address, + id, + amount, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + }) }) - it('should have `_signer` as `signer` in NonceChange', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] - - const args = ev.args! as any - expect(args.signer).to.be.eql(ownerWallet.address) + describe('When gas is NOT reimbursed', () => { + before(async function() { + if (condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should PASS if gas receipt is not passed and not claimed', async () => { + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, false, data) + await expect(tx).to.be.fulfilled + }) + + it('should REVER if gas receipt is not passed and claimed', async () => { + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { + transferObj.isGasFee = true + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeTransferFrom(ownerAddress, receiverAddress, id, amount, true, data) + await expect(tx).to.be.rejectedWith(RevertError()) + }) }) - it('should have `nonce` as `nonce + 1` in NonceChange', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] - - const args = ev.args! as any - expect(args.newNonce).to.be.eql(nonce.add(1)) + context('When successful transfer', () => { + let tx: ethers.ContractTransaction + + beforeEach(async () => { + tx = await operatorERC1155Contract.metaSafeTransferFrom( + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data + ) + }) + + it('should correctly update balance of sender', async () => { + const balance = await erc1155Contract.balanceOf(ownerAddress, id) + expect(balance).to.be.eql(BigNumber.from(initBalance - amount)) + }) + + it('should correctly update balance of receiver', async () => { + const balance = await erc1155Contract.balanceOf(receiverAddress, id) + expect(balance).to.be.eql(BigNumber.from(amount)) + }) + + describe('When gas is reimbursed', () => { + before(async function() { + if (!condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should update gas token balance of sender', async () => { + const senderBalance = await erc1155Contract.balanceOf(ownerAddress, feeTokenID) + expect(senderBalance).to.be.eql(feeTokenInitBalance.sub(gasReceipt!.gasFee)) + }) + + it('should update gas token balance of executor', async () => { + const balance = await erc1155Contract.balanceOf(operatorAddress, feeTokenID) + expect(gasReceipt!.gasFee).to.be.eql(balance.toNumber()) + }) + }) + + describe('TransferSingle event', async () => { + let filterFromOperatorContract: ethers.ethers.EventFilter + + it('should emit TransferSingle event', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events!.pop()! + expect(ev.event).to.be.eql('TransferSingle') + }) + + it('should have `msg.sender` as `_operator` field, not _from', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events!.pop()! + + const args = ev.args! as any + expect(args._operator).to.be.eql(operatorAddress) + }) + + if (bits > 1) { + it('should have `msg.sender` as `_operator` field, not tx.origin', async () => { + // Get event filter to get internal tx event + filterFromOperatorContract = erc1155Contract.filters.TransferSingle( + operatorContract.address, + null, + null, + null, + null + ) + + // Increment nonce because it's the second transfer + transferObj.nonce = nonce.add(1) + data = await encodeMetaTransferFromData(transferObj, domainHash, gasReceipt) + + // Execute transfer from operator contract + // @ts-ignore (https://github.com/ethereum-ts/TypeChain/issues/118) + await operatorContract.metaSafeTransferFrom( + erc1155Contract.address, + ownerAddress, + receiverAddress, + id, + amount, + isGasReceipt, + data, + { gasLimit: 1000000 } // INCORRECT GAS ESTIMATION + ) + + // Get logs from internal transaction event + // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) + filterFromOperatorContract.fromBlock = 0 + const logs = await operatorProvider.getLogs(filterFromOperatorContract) + const args = erc1155Contract.interface.decodeEventLog( + erc1155Contract.interface.events['TransferSingle(address,address,address,uint256,uint256)'], + logs[0].data, + logs[0].topics + ) + + // operator arg should be equal to msg.sender, not tx.origin + expect(args._operator).to.be.eql(operatorContract.address) + }) + } + + it('should emit NonceChange event', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + expect(ev.event).to.be.eql('NonceChange') + }) + + it('should have `_signer` as `signer` in NonceChange', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + + const args = ev.args! as any + expect(args.signer).to.be.eql(ownerWallet.address) + }) + + it('should have `nonce` as `nonce + 1` in NonceChange', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + + const args = ev.args! as any + expect(args.newNonce).to.be.eql(nonce.add(1)) + }) + }) }) }) }) }) }) - }) - }) - - describe('metaSafeBatchTransferFrom() (Meta) Function', () => { - let receiverContract: ERC1155ReceiverMock - let operatorContract: ERC1155OperatorMock - - let transferData: string | null = 'Hello from the other side' - const initBalance = 100 - const amount = 10 - const nonce = BigNumber.from(0) - - // Parameters for balances - let ids: any[], amounts: any[] - const nTokenTypes = 33 - - let isGasReceipt: boolean = true - const feeTokenInitBalance = BigNumber.from(100000000) - - const feeType = 0 - let feeToken: BigNumber - const feeTokenID = 666 - let feeTokenAddress: string - let feeTokenDataERC1155: string | Uint8Array - - let transferObj: BatchTransferSignature - let gasReceipt: GasReceipt | null - let domainHash: string - let data: string - - const conditions = [ - [transferData, true, 'Gas receipt & transfer data'], - [null, true, 'Gas receipt w/o transfer data'], - [transferData, false, 'Transfer data w/o gas receipt '], - [null, false, 'No Gas receipt & No transfer data'] - ] - - conditions.forEach(function(condition) { - context(condition[2] as string, () => { - beforeEach(async () => { - // Get conditions - transferData = (await condition[0]) as string | null - isGasReceipt = (await condition[1]) as boolean - - // Deploy contracts - const abstract = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') - receiverContract = (await abstract.deploy(ownerWallet)) as ERC1155ReceiverMock - operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock - - // Mint tokens - ;(ids = []), (amounts = []) - - // Minting enough amounts for transfer for each types - for (let i = 0; i < nTokenTypes; i++) { - await erc1155Contract.mintMock(ownerAddress, i, initBalance, []) - ids.push(i) - amounts.push(amount) - } - - feeTokenAddress = erc1155Contract.address - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [feeTokenAddress, feeTokenID, feeType] - ) - - // Gas Receipt - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 30000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - - // Transfer Signature Object - transferObj = { - contractAddress: erc1155Contract.address, - signerWallet: ownerWallet, - receiver: receiverAddress, - ids: ids.slice(0), - amounts: amounts.slice(0), - isGasFee: isGasReceipt, - transferData: transferData === null ? null : utils.toUtf8Bytes(transferData), - nonce: nonce - } - - // Mint tokens used to pay for gas - await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - - // Domain hash - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) - ) - - // Data to pass in transfer method - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - }) - - it('should REVERT if contract address is incorrect', async () => { - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverContract.address]) - ) - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if signer address is incorrect', async () => { - transferObj.signerWallet = operatorWallet - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if receiver address is incorrect', async () => { - transferObj.receiver = ownerAddress - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - it('should REVERT if token id is incorrect', async () => { - transferObj.ids[0] = 6 - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + describe('metaSafeBatchTransferFrom() (Meta) Function', () => { + let receiverContract: ERC1155ReceiverMock + let operatorContract: ERC1155OperatorMock + + let transferData: string | null = 'Hello from the other side' + const initBalance = valFor(bits, 2) + const amount = valFor(bits, 0) + const nonce = BigNumber.from(0) + + // Parameters for balances + let ids: any[], amounts: any[] + const nTokenTypes = 33 + + let isGasReceipt: boolean = true + const feeTokenInitBalance = BigNumber.from(valFor(bits, 2)) + + const feeType = 0 + let feeToken: BigNumber + const feeTokenID = 666 + let feeTokenAddress: string + let feeTokenDataERC1155: string | Uint8Array + + let transferObj: BatchTransferSignature + let gasReceipt: GasReceipt | null + let domainHash: string + let data: string + + const conditions = [ + [transferData, true, 'Gas receipt & transfer data'], + [null, true, 'Gas receipt w/o transfer data'], + [transferData, false, 'Transfer data w/o gas receipt '], + [null, false, 'No Gas receipt & No transfer data'] + ] + + conditions.forEach(function(condition) { + context(condition[2] as string, () => { + beforeEach(async () => { + // Get conditions + transferData = (await condition[0]) as string | null + isGasReceipt = (await condition[1]) as boolean + + // Deploy contracts + const abstract = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') + receiverContract = (await abstract.deploy(ownerWallet)) as ERC1155ReceiverMock + operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock + + // Mint tokens + ;(ids = []), (amounts = []) + + // Minting enough amounts for transfer for each types + for (let i = 0; i < nTokenTypes; i++) { + await erc1155Contract.mintMock(ownerAddress, i, initBalance, []) + ids.push(i) + amounts.push(amount) + } - it('should REVERT if token amount is incorrect', async () => { - transferObj.amounts[0] = amount + 1 - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + feeTokenAddress = erc1155Contract.address - it('should REVERT if transfer data is incorrect', async () => { - const sigArgTypes = ['address', 'address', 'address', 'uint256[]', 'uint256[]', 'uint256'] - const txDataTypes = ['bytes', 'bytes'] - - const signer = await transferObj.signerWallet.getAddress() - - // Packed encoding of transfer signature message - let sigData = ethers.utils.solidityPack(sigArgTypes, [ - transferObj.contractAddress, - signer, - transferObj.receiver, - transferObj.ids, - transferObj.amounts, - transferObj.nonce - ]) - - const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData - let goodGasAndTransferData - let badGasAndTransferData - - // Correct and incorrect transferData - if (isGasReceipt) { - goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode([GasReceiptType, 'bytes'], [gasReceipt, transferData]) - badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [gasReceipt, utils.toUtf8Bytes('Goodbyebyebye')] - ) - } else { - goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [transferData]) - badGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [utils.toUtf8Bytes('Goodbyebyebye')]) - } - - // Encode normally the whole thing - sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) - - // Get signature - const sig = (await ethSign(transferObj.signerWallet, sigData)).slice(0, -2) - const paddedNonce = ethers.utils.solidityPack(['uint256'], [transferObj.nonce]) - const ethsig_nonce = sig + paddedNonce.slice(2) + '02' // encode packed the nonce - - // PASS BAD DATA - data = ethers.utils.defaultAbiCoder.encode(txDataTypes, [ethsig_nonce, badGasAndTransferData]) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [feeTokenAddress, feeTokenID, feeType] + ) - it('should REVERT if nonce is incorrect', async () => { - transferObj.nonce = nonce.add(101) - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - - // Correct nonce - transferObj.nonce = nonce - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - await operatorERC1155Contract.metaSafeBatchTransferFrom(ownerAddress, receiverAddress, ids, amounts, isGasReceipt, data) - - // Nonce lower - const tx2 = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - }) + // Gas Receipt + gasReceipt = { + gasLimitCallback: 150000, + gasFee: valFor(bits, 0), + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } - it('should PASS if signature is valid', async () => { - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.fulfilled - }) + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null - describe('ERC-1271 Receiver', () => { - let erc1271WalletValidationMockContract: ERC1271WalletValidationMock - let ERC1271WalletValidationMockAbstract: AbstractContract + // Transfer Signature Object + transferObj = { + contractAddress: erc1155Contract.address, + signerWallet: ownerWallet, + receiver: receiverAddress, + ids: ids.slice(0), + amounts: amounts.slice(0), + isGasFee: isGasReceipt, + transferData: transferData === null ? null : utils.toUtf8Bytes(transferData), + nonce: nonce + } - let erc1271WalletAddress + // Mint tokens used to pay for gas + await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - beforeEach(async () => { - ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') - erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ - domainHash - ])) as ERC1271WalletValidationMock - erc1271WalletAddress = erc1271WalletValidationMockContract.address + // Domain hash + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) + ) - await erc1155Contract.batchMintMock(erc1271WalletAddress, ids, amounts, []) - await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) - }) + // Data to pass in transfer method + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + }) - describe(`EIP-1271 (bytes) signatures (03)`, () => { - it('should return REVERT if signature is invalid', async () => { - transferObj.from = erc1271WalletAddress - transferObj.signerWallet = receiverWallet + it('should REVERT if contract address is incorrect', async () => { + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverContract.address]) + ) + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '03') const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - erc1271WalletAddress, + ownerAddress, receiverAddress, ids, amounts, @@ -1366,16 +1197,13 @@ describe('ERC1155MetaPackedBalance', () => { ) await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - }) - describe(`EIP-1271 (bytes32) signatures (04)`, () => { - it('should return REVERT if signature is invalid', async () => { - transferObj.from = erc1271WalletAddress - transferObj.signerWallet = receiverWallet + it('should REVERT if signer address is incorrect', async () => { + transferObj.signerWallet = operatorWallet + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '04') const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - erc1271WalletAddress, + ownerAddress, receiverAddress, ids, amounts, @@ -1385,138 +1213,26 @@ describe('ERC1155MetaPackedBalance', () => { await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should PASS if signature is valid', async () => { - transferObj.from = erc1271WalletAddress - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '04') + it('should REVERT if receiver address is incorrect', async () => { + transferObj.receiver = ownerAddress + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - erc1271WalletAddress, + ownerAddress, receiverAddress, ids, amounts, isGasReceipt, data ) - await expect(tx).to.be.fulfilled - }) - }) - }) - - describe('When signature is valid', () => { - it('should REVERT if insufficient balance', async () => { - transferObj.amounts[0] = initBalance + 1 - amounts[0] = initBalance + 1 - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) - }) - - it('should REVERT if sending to 0x0', async () => { - transferObj.receiver = ZERO_ADDRESS - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - ZERO_ADDRESS, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith( - RevertError('ERC1155MetaPackedBalance#metaSafeBatchTransferFrom: INVALID_RECIPIENT') - ) - }) - - it('should REVERT if transfer leads to overflow', async () => { - await operatorERC1155Contract.mintMock(receiverAddress, ids[0], MAXVAL, []) - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT when sending to non-receiver contract', async () => { - transferObj.receiver = erc1155Contract.address - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - erc1155Contract.address, - ids, - amounts, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should REVERT if invalid response from receiver contract', async () => { - transferObj.receiver = receiverContract.address - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - // Force invalid response - await receiverContract.setShouldReject(true) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverContract.address, - ids, - amounts, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - await expect(tx).to.be.rejectedWith( - RevertError('ERC1155PackedBalance#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE') - ) - }) - - it('should PASS if valid response from receiver contract', async () => { - transferObj.receiver = receiverContract.address - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverContract.address, - ids, - amounts, - isGasReceipt, - data, - { gasLimit: 2000000 } - ) - - //await expect(tx).to.be.fulfilled - await expect(tx).to.be.fulfilled - }) - - describe('When gas is reimbursed', () => { - before(async function() { - if (!condition[1]) { - this.test!.parent!.pending = true - this.skip() - } + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should send gas fee to msg.sender if fee recipient ix 0x0', async () => { - gasReceipt!.feeRecipient = ZERO_ADDRESS - + it('should REVERT if token id is incorrect', async () => { + transferObj.ids[0] = 6 data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - await receiverERC1155Contract.metaSafeBatchTransferFrom( + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverAddress, ids, @@ -1524,14 +1240,14 @@ describe('ERC1155MetaPackedBalance', () => { isGasReceipt, data ) - - const receiverBalance = await operatorERC1155Contract.balanceOf(receiverAddress, feeTokenID) - - expect(gasReceipt!.gasFee).to.be.eql(receiverBalance.toNumber()) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should send gas fee to specified fee recipient (if not 0x0), not tx.origin', async () => { - await receiverERC1155Contract.metaSafeBatchTransferFrom( + it('should REVERT if token amount is incorrect', async () => { + transferObj.amounts[0] = amount + 1 + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverAddress, ids, @@ -1539,12 +1255,10 @@ describe('ERC1155MetaPackedBalance', () => { isGasReceipt, data ) - const operatorBalance = await operatorERC1155Contract.balanceOf(operatorAddress, feeTokenID) - - expect(gasReceipt!.gasFee).to.be.eql(operatorBalance.toNumber()) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should REVERT if gasReceipt is incorrect', async () => { + it('should REVERT if transfer data is incorrect', async () => { const sigArgTypes = ['address', 'address', 'address', 'uint256[]', 'uint256[]', 'uint256'] const txDataTypes = ['bytes', 'bytes'] @@ -1560,20 +1274,21 @@ describe('ERC1155MetaPackedBalance', () => { transferObj.nonce ]) - // Form bad gas receipt - const badGasReceipt = { ...gasReceipt, gasPrice: 109284123 } - const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData + let goodGasAndTransferData + let badGasAndTransferData // Correct and incorrect transferData - const goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [gasReceipt, transferData] - ) - const badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( - [GasReceiptType, 'bytes'], - [badGasReceipt, transferData] - ) + if (isGasReceipt) { + goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode([GasReceiptType, 'bytes'], [gasReceipt, transferData]) + badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [gasReceipt, utils.toUtf8Bytes('Goodbyebyebye')] + ) + } else { + goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [transferData]) + badGasAndTransferData = ethers.utils.defaultAbiCoder.encode(['bytes'], [utils.toUtf8Bytes('Goodbyebyebye')]) + } // Encode normally the whole thing sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) @@ -1597,74 +1312,187 @@ describe('ERC1155MetaPackedBalance', () => { await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should REVERT if gas receipt is passed, but not claimed', async () => { + it('should REVERT if nonce is incorrect', async () => { + transferObj.nonce = nonce.add(101) + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverAddress, ids, amounts, - false, + isGasReceipt, data ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - it('should REVERT if gas receipt is passed but isGasFee is false', async () => { - transferObj.isGasFee = false + // Correct nonce + transferObj.nonce = nonce data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + await operatorERC1155Contract.metaSafeBatchTransferFrom(ownerAddress, receiverAddress, ids, amounts, isGasReceipt, data) + + // Nonce lower + const tx2 = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverAddress, ids, amounts, - true, + isGasReceipt, data ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) }) - it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { - transferObj.isGasFee = false - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - + it('should PASS if signature is valid', async () => { const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverAddress, ids, amounts, - false, + isGasReceipt, data ) await expect(tx).to.be.fulfilled }) - describe('When receiver is a contract', () => { - it('should REVERT if gas used in onERC1155BatchReceived exceeds limit', async () => { - const lowGasLimit = 1000 - gasReceipt!.gasLimitCallback = lowGasLimit - transferObj.receiver = receiverContract.address + describe('ERC-1271 Receiver', () => { + let erc1271WalletValidationMockContract: ERC1271WalletValidationMock + let ERC1271WalletValidationMockAbstract: AbstractContract + + let erc1271WalletAddress + + beforeEach(async () => { + ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') + erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ + domainHash + ])) as ERC1271WalletValidationMock + erc1271WalletAddress = erc1271WalletValidationMockContract.address + + await erc1155Contract.batchMintMock(erc1271WalletAddress, ids, amounts, []) + await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) + }) + + describe(`EIP-1271 (bytes) signatures (03)`, () => { + it('should return REVERT if signature is invalid', async () => { + transferObj.from = erc1271WalletAddress + transferObj.signerWallet = receiverWallet + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + erc1271WalletAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + }) + + describe(`EIP-1271 (bytes32) signatures (04)`, () => { + it('should return REVERT if signature is invalid', async () => { + transferObj.from = erc1271WalletAddress + transferObj.signerWallet = receiverWallet + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + erc1271WalletAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if signature is valid', async () => { + transferObj.from = erc1271WalletAddress + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + erc1271WalletAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.fulfilled + }) + }) + }) + describe('When signature is valid', () => { + it('should REVERT if insufficient balance', async () => { + transferObj.amounts[0] = initBalance + 1 + amounts[0] = initBalance + 1 data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, - receiverContract.address, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) + }) + + it('should REVERT if sending to 0x0', async () => { + transferObj.receiver = ZERO_ADDRESS + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + ZERO_ADDRESS, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith( + RevertError('ERC1155MetaPackedBalance#metaSafeBatchTransferFrom: INVALID_RECIPIENT') + ) + }) + + it('should REVERT if transfer leads to overflow', async () => { + await operatorERC1155Contract.mintMock(receiverAddress, ids[0], MAXVAL, []) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT when sending to non-receiver contract', async () => { + transferObj.receiver = erc1155Contract.address + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + erc1155Contract.address, ids, amounts, isGasReceipt, data, { gasLimit: 2000000 } ) - await expect(tx).to.be.rejectedWith(RevertError()) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) }) - it('should PASS if gas used in onERC1155BatchReceived does not exceed limit', async () => { - const okGasLimit = 160000 - gasReceipt!.gasLimitCallback = okGasLimit + it('should REVERT if invalid response from receiver contract', async () => { transferObj.receiver = receiverContract.address - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + // Force invalid response + await receiverContract.setShouldReject(true) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( ownerAddress, receiverContract.address, @@ -1674,14 +1502,13 @@ describe('ERC1155MetaPackedBalance', () => { data, { gasLimit: 2000000 } ) - await expect(tx).to.be.fulfilled + await expect(tx).to.be.rejectedWith( + RevertError('ERC1155PackedBalance#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE') + ) }) - it('should PASS if gasLimit is higher than gas sent in transaction', async () => { - const highGasLimit = 3000000 - gasReceipt!.gasLimitCallback = highGasLimit + it('should PASS if valid response from receiver contract', async () => { transferObj.receiver = receiverContract.address - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( @@ -1693,551 +1520,752 @@ describe('ERC1155MetaPackedBalance', () => { data, { gasLimit: 2000000 } ) + + //await expect(tx).to.be.fulfilled await expect(tx).to.be.fulfilled }) + + describe('When gas is reimbursed', () => { + before(async function() { + if (!condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should send gas fee to msg.sender if fee recipient ix 0x0', async () => { + gasReceipt!.feeRecipient = ZERO_ADDRESS + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + await receiverERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + + const receiverBalance = await operatorERC1155Contract.balanceOf(receiverAddress, feeTokenID) + + expect(gasReceipt!.gasFee).to.be.eql(receiverBalance.toNumber()) + }) + + it('should send gas fee to specified fee recipient (if not 0x0), not tx.origin', async () => { + await receiverERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + const operatorBalance = await operatorERC1155Contract.balanceOf(operatorAddress, feeTokenID) + + expect(gasReceipt!.gasFee).to.be.eql(operatorBalance.toNumber()) + }) + + it('should REVERT if gasReceipt is incorrect', async () => { + const sigArgTypes = ['address', 'address', 'address', 'uint256[]', 'uint256[]', 'uint256'] + const txDataTypes = ['bytes', 'bytes'] + + const signer = await transferObj.signerWallet.getAddress() + + // Packed encoding of transfer signature message + let sigData = ethers.utils.solidityPack(sigArgTypes, [ + transferObj.contractAddress, + signer, + transferObj.receiver, + transferObj.ids, + transferObj.amounts, + transferObj.nonce + ]) + + // Form bad gas receipt + const badGasReceipt = { ...gasReceipt, gasPrice: 109284123 } + + const transferData = transferObj.transferData == null ? utils.toUtf8Bytes('') : transferObj.transferData + + // Correct and incorrect transferData + const goodGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [gasReceipt, transferData] + ) + const badGasAndTransferData = ethers.utils.defaultAbiCoder.encode( + [GasReceiptType, 'bytes'], + [badGasReceipt, transferData] + ) + + // Encode normally the whole thing + sigData = ethers.utils.solidityPack(['bytes', 'bytes'], [sigData, goodGasAndTransferData]) + + // Get signature + const sig = (await ethSign(transferObj.signerWallet, sigData)).slice(0, -2) + const paddedNonce = ethers.utils.solidityPack(['uint256'], [transferObj.nonce]) + const ethsig_nonce = sig + paddedNonce.slice(2) + '02' // encode packed the nonce + + // PASS BAD DATA + data = ethers.utils.defaultAbiCoder.encode(txDataTypes, [ethsig_nonce, badGasAndTransferData]) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if gas receipt is passed, but not claimed', async () => { + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + false, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if gas receipt is passed but isGasFee is false', async () => { + transferObj.isGasFee = false + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + true, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { + transferObj.isGasFee = false + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + false, + data + ) + await expect(tx).to.be.fulfilled + }) + + describe('When receiver is a contract', () => { + it('should REVERT if gas used in onERC1155BatchReceived exceeds limit', async () => { + const lowGasLimit = 1000 + gasReceipt!.gasLimitCallback = lowGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverContract.address, + ids, + amounts, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.rejectedWith(RevertError()) + }) + + it('should PASS if gas used in onERC1155BatchReceived does not exceed limit', async () => { + const okGasLimit = 160000 + gasReceipt!.gasLimitCallback = okGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverContract.address, + ids, + amounts, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + + it('should PASS if gasLimit is higher than gas sent in transaction', async () => { + const highGasLimit = 3000000 + gasReceipt!.gasLimitCallback = highGasLimit + transferObj.receiver = receiverContract.address + + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverContract.address, + ids, + amounts, + isGasReceipt, + data, + { gasLimit: 2000000 } + ) + await expect(tx).to.be.fulfilled + }) + }) + }) + + describe('When gas is NOT reimbursed', () => { + before(async function() { + if (condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should PASS if gas receipt is not passed and not claimed', async () => { + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + false, + data + ) + await expect(tx).to.be.fulfilled + }) + + it('should REVER if gas receipt is not passed and claimed', async () => { + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + true, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { + transferObj.isGasFee = true + data = await encodeMetaBatchTransferFromData(transferObj, domainHash) + const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + true, + data + ) + await expect(tx).to.be.rejectedWith(RevertError()) + }) + }) + + context('When successful transfer', () => { + let tx: ethers.ContractTransaction + + beforeEach(async () => { + tx = await operatorERC1155Contract.metaSafeBatchTransferFrom( + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data + ) + }) + + it('should correctly update balance of sender and receiver', async () => { + let balanceFrom: BigNumber + let balanceTo: BigNumber + + for (let i = 0; i < ids.length; i++) { + balanceFrom = await operatorERC1155Contract.balanceOf(ownerAddress, ids[i]) + balanceTo = await operatorERC1155Contract.balanceOf(receiverAddress, ids[i]) + + expect(balanceFrom).to.be.eql(BigNumber.from(initBalance - amounts[i])) + expect(balanceTo).to.be.eql(BigNumber.from(amounts[i])) + } + }) + + describe('When gas is reimbursed', () => { + before(async function() { + if (!condition[1]) { + this.test!.parent!.pending = true + this.skip() + } + }) + + it('should update gas token balance of sender', async () => { + const senderBalance = await operatorERC1155Contract.balanceOf(ownerAddress, feeTokenID) + expect(senderBalance).to.be.eql(feeTokenInitBalance.sub(gasReceipt!.gasFee)) + }) + + it('should update gas token balance of executor', async () => { + const balance = await operatorERC1155Contract.balanceOf(operatorAddress, feeTokenID) + expect(gasReceipt!.gasFee).to.be.eql(balance.toNumber()) + }) + }) + + describe('TransferBatch event', async () => { + let filterFromOperatorContract: ethers.ethers.EventFilter + let operatorContract: ERC1155OperatorMock + + beforeEach(async () => { + operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock + }) + + it('should emit 1 TransferBatch events of N transfers', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![1] + expect(ev.event).to.be.eql('TransferBatch') + + const args = ev.args! as any + expect(args._ids.length).to.be.eql(ids.length) + }) + + it('should have `msg.sender` as `_operator` field, not _from', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events!.pop()! + + const args = ev.args! as any + expect(args._operator).to.be.eql(operatorAddress) + }) + + if (bits > 1) { + it('should have `msg.sender` as `_operator` field, not tx.origin', async () => { + // Get event filter to get internal tx event + filterFromOperatorContract = erc1155Contract.filters.TransferBatch( + operatorContract.address, + null, + null, + null, + null + ) + + //Increment nonce because it's the second transfer + transferObj.nonce = nonce.add(1) + data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) + + // Execute transfer from operator contract + // @ts-ignore (https://github.com/ethereum-ts/TypeChain/issues/118) + await operatorContract.metaSafeBatchTransferFrom( + erc1155Contract.address, + ownerAddress, + receiverAddress, + ids, + amounts, + isGasReceipt, + data, + { gasLimit: 2000000 } // INCORRECT GAS ESTIMATION + ) + + // Get logs from internal transaction event + // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) + // filterFromOperatorContract.fromBlock = 0 + // const logs = await operatorProvider.getLogs(filterFromOperatorContract) + // const args = erc1155Contract.interface.decodeEventLog( + // erc1155Contract.interface.events['TransferBatch(address,address,address,uint256[],uint256[])'], + // logs[0].data, + // logs[0].topics + // ) + + // // operator arg should be equal to msg.sender, not tx.origin + // expect(args._operator).to.be.eql(operatorContract.address) + }) + } + + it('should emit NonceChange event', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + expect(ev.event).to.be.eql('NonceChange') + }) + + it('should have `_signer` as `signer` in NonceChange', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + + const args = ev.args! as any + expect(args.signer).to.be.eql(ownerWallet.address) + }) + + it('should have `nonce` as `nonce + 1` in NonceChange', async () => { + const receipt = await tx.wait(1) + const ev = receipt.events![0] + + const args = ev.args! as any + expect(args.newNonce).to.be.eql(nonce.add(1)) + }) + }) + }) }) }) + }) + }) - describe('When gas is NOT reimbursed', () => { - before(async function() { - if (condition[1]) { - this.test!.parent!.pending = true - this.skip() - } - }) + describe('metaSetApprovalForAll() function', () => { + const initBalance = valFor(bits, 1) + let isGasReimbursed = true + const approved = true + const nonce = BigNumber.from(0) + const id = 66 + + let approvalObj: ApprovalSignature + let gasReceipt: GasReceipt | null + let domainHash: string + let data: string + + let isGasReceipt: boolean = true + const feeTokenInitBalance = BigNumber.from(valFor(bits, 2)) + + const feeType = 0 + const feeTokenID = 666 + let feeTokenAddress: string + let feeTokenDataERC1155: string | Uint8Array + + const conditions = [ + [true, 'Gas receipt'], + [false, 'No Gas receipt'] + ] + + conditions.forEach(function(condition) { + context(condition[1] as string, () => { + beforeEach(async () => { + isGasReceipt = condition[0] as boolean - it('should PASS if gas receipt is not passed and not claimed', async () => { - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - false, - data + feeTokenAddress = erc1155Contract.address + + feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'uint8'], + [feeTokenAddress, feeTokenID, feeType] ) - await expect(tx).to.be.fulfilled - }) - it('should REVER if gas receipt is not passed and claimed', async () => { - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - true, - data + // Gas Receipt + gasReceipt = { + gasLimitCallback: 130000, + gasFee: valFor(bits, 0), + feeRecipient: operatorAddress, + feeTokenData: feeTokenDataERC1155 + } + + // Check if gas receipt is included + gasReceipt = isGasReceipt ? gasReceipt : null + isGasReimbursed = isGasReceipt ? true : false + + // Approval Signture Object + approvalObj = { + contractAddress: erc1155Contract.address, + signerWallet: ownerWallet, + operator: operatorAddress, + approved: approved, + isGasFee: isGasReceipt, + nonce: nonce + } + + // Mint tokens + await erc1155Contract.mintMock(ownerAddress, id, initBalance, []) + + // Mint tokens used to pay for gas + await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) + + // Domain hash + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + + // Data to pass in approval method + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) }) - it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { - transferObj.isGasFee = true - data = await encodeMetaBatchTransferFromData(transferObj, domainHash) - const tx = operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - true, - data - ) - await expect(tx).to.be.rejectedWith(RevertError()) + it('should PASS if signature is valid', async () => { + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.fulfilled }) - }) - context('When successful transfer', () => { - let tx: ethers.ContractTransaction + describe('ERC-1271 Receiver', () => { + let erc1271WalletValidationMockContract: ERC1271WalletValidationMock + let ERC1271WalletValidationMockAbstract: AbstractContract - beforeEach(async () => { - tx = await operatorERC1155Contract.metaSafeBatchTransferFrom( - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data - ) - }) + let erc1271WalletAddress - it('should correctly update balance of sender and receiver', async () => { - let balanceFrom: BigNumber - let balanceTo: BigNumber + beforeEach(async () => { + ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') + erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ + domainHash + ])) as ERC1271WalletValidationMock + erc1271WalletAddress = erc1271WalletValidationMockContract.address - for (let i = 0; i < ids.length; i++) { - balanceFrom = await operatorERC1155Contract.balanceOf(ownerAddress, ids[i]) - balanceTo = await operatorERC1155Contract.balanceOf(receiverAddress, ids[i]) + await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) + }) - expect(balanceFrom).to.be.eql(BigNumber.from(initBalance - amounts[i])) - expect(balanceTo).to.be.eql(BigNumber.from(amounts[i])) - } + describe(`EIP-1271 (bytes) signatures (03)`, () => { + it('should return REVERT if signature is invalid', async () => { + approvalObj.owner = erc1271WalletAddress + approvalObj.signerWallet = receiverWallet + + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '03') + const tx = operatorERC1155Contract.metaSetApprovalForAll( + erc1271WalletAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + }) + + describe(`EIP-1271 (bytes32) signatures (04)`, () => { + it('should return REVERT if signature is invalid', async () => { + approvalObj.owner = erc1271WalletAddress + approvalObj.signerWallet = receiverWallet + + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSetApprovalForAll( + erc1271WalletAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) + + it('should PASS if signature is valid', async () => { + approvalObj.owner = erc1271WalletAddress + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '04') + const tx = operatorERC1155Contract.metaSetApprovalForAll( + erc1271WalletAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) + await expect(tx).to.be.fulfilled + }) + }) }) describe('When gas is reimbursed', () => { before(async function() { - if (!condition[1]) { + if (!condition[0]) { this.test!.parent!.pending = true this.skip() } }) - it('should update gas token balance of sender', async () => { - const senderBalance = await operatorERC1155Contract.balanceOf(ownerAddress, feeTokenID) - expect(senderBalance).to.be.eql(feeTokenInitBalance.sub(gasReceipt!.gasFee)) - }) - - it('should update gas token balance of executor', async () => { - const balance = await operatorERC1155Contract.balanceOf(operatorAddress, feeTokenID) - expect(gasReceipt!.gasFee).to.be.eql(balance.toNumber()) + it('should REVERT if gas receipt is passed, but not claimed', async () => { + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - }) - - describe('TransferBatch event', async () => { - let filterFromOperatorContract: ethers.ethers.EventFilter - let operatorContract: ERC1155OperatorMock - beforeEach(async () => { - operatorContract = (await operatorAbstract.deploy(operatorWallet)) as ERC1155OperatorMock + it('should REVERT if gas receipt is passed but isGasFee is false', async () => { + approvalObj.isGasFee = false + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should emit 1 TransferBatch events of N transfers', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![1] - expect(ev.event).to.be.eql('TransferBatch') + it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { + approvalObj.isGasFee = false + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - const args = ev.args! as any - expect(args._ids.length).to.be.eql(ids.length) + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) + await expect(tx).to.be.fulfilled }) + }) - it('should have `msg.sender` as `_operator` field, not _from', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events!.pop()! - - const args = ev.args! as any - expect(args._operator).to.be.eql(operatorAddress) + describe('When gas is NOT reimbursed', () => { + before(async function() { + if (condition[0]) { + this.test!.parent!.pending = true + this.skip() + } }) - it('should have `msg.sender` as `_operator` field, not tx.origin', async () => { - // Get event filter to get internal tx event - filterFromOperatorContract = erc1155Contract.filters.TransferBatch( - operatorContract.address, - null, - null, - null, - null - ) - - //Increment nonce because it's the second transfer - transferObj.nonce = nonce.add(1) - data = await encodeMetaBatchTransferFromData(transferObj, domainHash, gasReceipt) - - // Execute transfer from operator contract - // @ts-ignore (https://github.com/ethereum-ts/TypeChain/issues/118) - await operatorContract.metaSafeBatchTransferFrom( - erc1155Contract.address, - ownerAddress, - receiverAddress, - ids, - amounts, - isGasReceipt, - data, - { gasLimit: 2000000 } // INCORRECT GAS ESTIMATION - ) - - // Get logs from internal transaction event - // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) - filterFromOperatorContract.fromBlock = 0 - const logs = await operatorProvider.getLogs(filterFromOperatorContract) - const args = erc1155Contract.interface.decodeEventLog( - erc1155Contract.interface.events['TransferBatch(address,address,address,uint256[],uint256[])'], - logs[0].data, - logs[0].topics - ) - - // operator arg should be equal to msg.sender, not tx.origin - expect(args._operator).to.be.eql(operatorContract.address) + it('should PASS if gas receipt is not passed and not claimed', async () => { + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) + await expect(tx).to.be.fulfilled }) - it('should emit NonceChange event', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] - expect(ev.event).to.be.eql('NonceChange') + it('should REVER if gas receipt is not passed and claimed', async () => { + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - it('should have `_signer` as `signer` in NonceChange', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] + it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { + approvalObj.isGasFee = true + data = await encodeMetaApprovalData(approvalObj, domainHash) - const args = ev.args! as any - expect(args.signer).to.be.eql(ownerWallet.address) + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) + await expect(tx).to.be.rejectedWith(RevertError()) }) + }) - it('should have `nonce` as `nonce + 1` in NonceChange', async () => { - const receipt = await tx.wait(1) - const ev = receipt.events![0] + it('should REVERT if contract address is incorrect', async () => { + domainHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverAddress]) + ) + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - const args = ev.args! as any - expect(args.newNonce).to.be.eql(nonce.add(1)) - }) + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) }) - }) - }) - }) - }) - }) - describe('metaSetApprovalForAll() function', () => { - const initBalance = 100 - let isGasReimbursed = true - const approved = true - const nonce = BigNumber.from(0) - const id = 66 - - let approvalObj: ApprovalSignature - let gasReceipt: GasReceipt | null - let domainHash: string - let data: string - - let isGasReceipt: boolean = true - const feeTokenInitBalance = BigNumber.from(100000000) - - const feeType = 0 - const feeTokenID = 666 - let feeTokenAddress: string - let feeTokenDataERC1155: string | Uint8Array - - const conditions = [ - [true, 'Gas receipt'], - [false, 'No Gas receipt'] - ] - - conditions.forEach(function(condition) { - context(condition[1] as string, () => { - beforeEach(async () => { - isGasReceipt = condition[0] as boolean - - feeTokenAddress = erc1155Contract.address - - feeTokenDataERC1155 = ethers.utils.defaultAbiCoder.encode( - ['address', 'uint256', 'uint8'], - [feeTokenAddress, feeTokenID, feeType] - ) - - // Gas Receipt - gasReceipt = { - gasLimitCallback: 130000, - gasFee: 30000, - feeRecipient: operatorAddress, - feeTokenData: feeTokenDataERC1155 - } - - // Check if gas receipt is included - gasReceipt = isGasReceipt ? gasReceipt : null - isGasReimbursed = isGasReceipt ? true : false - - // Approval Signture Object - approvalObj = { - contractAddress: erc1155Contract.address, - signerWallet: ownerWallet, - operator: operatorAddress, - approved: approved, - isGasFee: isGasReceipt, - nonce: nonce - } - - // Mint tokens - await erc1155Contract.mintMock(ownerAddress, id, initBalance, []) - - // Mint tokens used to pay for gas - await erc1155Contract.mintMock(ownerAddress, feeTokenID, feeTokenInitBalance, []) - - // Domain hash - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, erc1155Contract.address]) - ) - - // Data to pass in approval method - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - }) + it('should REVERT if operator address is incorrect', async () => { + approvalObj.operator = receiverAddress + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - it('should PASS if signature is valid', async () => { - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.fulfilled - }) + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) - describe('ERC-1271 Receiver', () => { - let erc1271WalletValidationMockContract: ERC1271WalletValidationMock - let ERC1271WalletValidationMockAbstract: AbstractContract + it('should REVERT if approved value is incorrect', async () => { + approvalObj.approved = false + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - let erc1271WalletAddress + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + }) - beforeEach(async () => { - ERC1271WalletValidationMockAbstract = await AbstractContract.fromArtifactName('ERC1271WalletValidationMock') - erc1271WalletValidationMockContract = (await ERC1271WalletValidationMockAbstract.deploy(ownerWallet, [ - domainHash - ])) as ERC1271WalletValidationMock - erc1271WalletAddress = erc1271WalletValidationMockContract.address + it('should REVERT if nonce is incorrect', async () => { + approvalObj.nonce = nonce.add(101) + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - await erc1155Contract.mintMock(erc1271WalletAddress, feeTokenID, feeTokenInitBalance, []) - }) + // Nonce higher + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - describe(`EIP-1271 (bytes) signatures (03)`, () => { - it('should return REVERT if signature is invalid', async () => { - approvalObj.owner = erc1271WalletAddress - approvalObj.signerWallet = receiverWallet + // Correct nonce + approvalObj.nonce = nonce + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + await operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '03') - const tx = operatorERC1155Contract.metaSetApprovalForAll( - erc1271WalletAddress, + // Nonce lower + const tx2 = operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, operatorAddress, approved, isGasReimbursed, data ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) }) - }) - describe(`EIP-1271 (bytes32) signatures (04)`, () => { - it('should return REVERT if signature is invalid', async () => { - approvalObj.owner = erc1271WalletAddress - approvalObj.signerWallet = receiverWallet - - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '04') - const tx = operatorERC1155Contract.metaSetApprovalForAll( - erc1271WalletAddress, + it('should emit an ApprovalForAll event', async () => { + const tx = await operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, operatorAddress, approved, isGasReimbursed, data ) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) + const receipt = await tx.wait(1) + + expect(receipt.events![1].event).to.be.eql('ApprovalForAll') }) - it('should PASS if signature is valid', async () => { - approvalObj.owner = erc1271WalletAddress - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt, '04') - const tx = operatorERC1155Contract.metaSetApprovalForAll( - erc1271WalletAddress, + it('should set the operator status to _status argument', async () => { + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) + await expect(tx).to.be.fulfilled + + const status = await erc1155Contract.isApprovedForAll(ownerAddress, operatorAddress) + expect(status).to.be.eql(true) + }) + + it('should emit NonceChange event', async () => { + const tx = await operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, operatorAddress, approved, isGasReimbursed, data ) - await expect(tx).to.be.fulfilled + const receipt = await tx.wait(1) + const ev = receipt.events![0] + expect(ev.event).to.be.eql('NonceChange') }) - }) - }) - - describe('When gas is reimbursed', () => { - before(async function() { - if (!condition[0]) { - this.test!.parent!.pending = true - this.skip() - } - }) - - it('should REVERT if gas receipt is passed, but not claimed', async () => { - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if gas receipt is passed but isGasFee is false', async () => { - approvalObj.isGasFee = false - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should PASS if gas receipt is passed with isGasFee to false and not claimed', async () => { - approvalObj.isGasFee = false - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) - await expect(tx).to.be.fulfilled - }) - }) - - describe('When gas is NOT reimbursed', () => { - before(async function() { - if (condition[0]) { - this.test!.parent!.pending = true - this.skip() - } - }) - - it('should PASS if gas receipt is not passed and not claimed', async () => { - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, false, data) - await expect(tx).to.be.fulfilled - }) - - it('should REVER if gas receipt is not passed and claimed', async () => { - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if gas receipt is not passed but isGasFee is set to true and is claimed', async () => { - approvalObj.isGasFee = true - data = await encodeMetaApprovalData(approvalObj, domainHash) - - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, true, data) - await expect(tx).to.be.rejectedWith(RevertError()) - }) - }) - - it('should REVERT if contract address is incorrect', async () => { - domainHash = ethers.utils.keccak256( - ethers.utils.solidityPack(['bytes32', 'uint256'], [DOMAIN_SEPARATOR_TYPEHASH, receiverAddress]) - ) - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if operator address is incorrect', async () => { - approvalObj.operator = receiverAddress - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if approved value is incorrect', async () => { - approvalObj.approved = false - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_SIGNATURE')) - }) - - it('should REVERT if nonce is incorrect', async () => { - approvalObj.nonce = nonce.add(101) - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - - // Nonce higher - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - - // Correct nonce - approvalObj.nonce = nonce - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) - await operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - - // Nonce lower - const tx2 = operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - await expect(tx2).to.be.rejectedWith(RevertError('ERC1155MetaPackedBalance#_signatureValidation: INVALID_NONCE')) - }) - - it('should emit an ApprovalForAll event', async () => { - const tx = await operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - const receipt = await tx.wait(1) - - expect(receipt.events![1].event).to.be.eql('ApprovalForAll') - }) - it('should set the operator status to _status argument', async () => { - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, approved, isGasReimbursed, data) - await expect(tx).to.be.fulfilled - - const status = await erc1155Contract.isApprovedForAll(ownerAddress, operatorAddress) - expect(status).to.be.eql(true) - }) - - it('should emit NonceChange event', async () => { - const tx = await operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - const receipt = await tx.wait(1) - const ev = receipt.events![0] - expect(ev.event).to.be.eql('NonceChange') - }) - - it('should have `_signer` as `signer` in NonceChange', async () => { - const tx = await operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - - const receipt = await tx.wait(1) - const ev = receipt.events![0] - - const args = ev.args! as any - expect(args.signer).to.be.eql(ownerWallet.address) - }) - - it('should have `nonce` as `nonce + 1` in NonceChange', async () => { - const tx = await operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - const receipt = await tx.wait(1) - const ev = receipt.events![0] - - const args = ev.args! as any - expect(args.newNonce).to.be.eql(nonce.add(1)) - }) + it('should have `_signer` as `signer` in NonceChange', async () => { + const tx = await operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) - context('When the operator was already an operator', () => { - beforeEach(async () => { - const tx = await operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - - // Update nonce of approval signature object for subsequent tests - approvalObj.nonce = nonce.add(1) - }) + const receipt = await tx.wait(1) + const ev = receipt.events![0] - it('should leave the operator status to set to true again', async () => { - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + const args = ev.args! as any + expect(args.signer).to.be.eql(ownerWallet.address) + }) - const tx = operatorERC1155Contract.metaSetApprovalForAll( - ownerAddress, - operatorAddress, - approved, - isGasReimbursed, - data - ) - await expect(tx).to.be.fulfilled + it('should have `nonce` as `nonce + 1` in NonceChange', async () => { + const tx = await operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) + const receipt = await tx.wait(1) + const ev = receipt.events![0] - const status = await erc1155Contract.isApprovedForAll(ownerAddress, operatorAddress) - expect(status).to.be.eql(true) - }) + const args = ev.args! as any + expect(args.newNonce).to.be.eql(nonce.add(1)) + }) - it('should allow the operator status to be set to false', async () => { - approvalObj.approved = false - data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + context('When the operator was already an operator', () => { + beforeEach(async () => { + const tx = await operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) - const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, false, isGasReimbursed, data) - await expect(tx).to.be.fulfilled + // Update nonce of approval signature object for subsequent tests + approvalObj.nonce = nonce.add(1) + }) - const status = await erc1155Contract.isApprovedForAll(operatorAddress, ownerAddress) - expect(status).to.be.eql(false) + if (bits > 1) { + it('should leave the operator status to set to true again', async () => { + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSetApprovalForAll( + ownerAddress, + operatorAddress, + approved, + isGasReimbursed, + data + ) + await expect(tx).to.be.fulfilled + + const status = await erc1155Contract.isApprovedForAll(ownerAddress, operatorAddress) + expect(status).to.be.eql(true) + }) + + it('should allow the operator status to be set to false', async () => { + approvalObj.approved = false + data = await encodeMetaApprovalData(approvalObj, domainHash, gasReceipt) + + const tx = operatorERC1155Contract.metaSetApprovalForAll(ownerAddress, operatorAddress, false, isGasReimbursed, data) + await expect(tx).to.be.fulfilled + + const status = await erc1155Contract.isApprovedForAll(operatorAddress, ownerAddress) + expect(status).to.be.eql(false) + }) + } + }) }) }) }) diff --git a/tests/ERC1155MintBurnPackedBalance.spec.ts b/tests/ERC1155MintBurnPackedBalance.spec.ts index 911ab2a..dc0bd70 100644 --- a/tests/ERC1155MintBurnPackedBalance.spec.ts +++ b/tests/ERC1155MintBurnPackedBalance.spec.ts @@ -1,6 +1,6 @@ import * as ethers from 'ethers' -import { AbstractContract, RevertError, expect, BigNumber } from './utils' +import { AbstractContract, RevertError, expect, BigNumber, FILTERED_VALID_ID_BITS } from './utils' import * as utils from './utils' import { @@ -31,525 +31,535 @@ describe('ERC1155MintBurnPackedBalance', () => { let anyoneERC1155MintBurnContract: ERC1155MetaMintBurnPackedBalanceMock let receiverContract: ERC1155ReceiverMock - context('When ERC1155MintBurn contract is deployed', () => { - before(async () => { - ownerAddress = await ownerWallet.getAddress() - receiverAddress = await receiverWallet.getAddress() - anyoneAddress = await anyoneWallet.getAddress() - operatorAddress = await operatorWallet.getAddress() - }) - - beforeEach(async () => { - const abstractReceiver = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') - receiverContract = (await abstractReceiver.deploy(ownerWallet)) as ERC1155ReceiverMock - - const abstract = await AbstractContract.fromArtifactName('ERC1155MetaMintBurnPackedBalanceMock') - erc1155MintBurnContract = (await abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock - anyoneERC1155MintBurnContract = (await erc1155MintBurnContract.connect( - anyoneSigner - )) as ERC1155MetaMintBurnPackedBalanceMock - }) - - describe('_mint() function', () => { - const tokenID = 666 - const amount = 11 - - it('should ALLOW inheriting contract to call mint()', async () => { - const tx = erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) - await expect(tx).to.be.fulfilled - }) - - it('should NOT allow anyone to call _mint()', async () => { - const transaction = { - to: erc1155MintBurnContract.address, - data: - '0x7776afa0000000000000000000000000b87213121fb89cbd8b877cb1bb3ff84dd2869cfa' + - '000000000000000000000000000000000000000000000000000000000000029a0000000000000000' + - '00000000000000000000000000000000000000000000000b' - } - const tx = anyoneWallet.sendTransaction(transaction) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should increase the balance of receiver by the right amount', async () => { - const recipientBalanceA = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) - await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) - - const recipientBalanceB = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) - - expect(recipientBalanceB).to.be.eql(recipientBalanceA.add(amount)) - }) - - it('should REVERT if amount is larger than limit (overflow 1)', async () => { - await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) - const maxVal0 = BigNumber.from(2) - .pow(32) - .sub(amount) - const tx0 = erc1155MintBurnContract.mintMock(receiverAddress, tokenID, maxVal0, []) - await expect(tx0).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit (invalid amount by 1)', async () => { - const maxVal = BigNumber.from(2).pow(32) - const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal, []) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit(invalid amount min overflow)', async () => { - const maxVal = BigNumber.from(2).pow(32) - // Set balance to max acceptable value - await erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal.sub(1), []) - const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) - await expect(balance).to.be.eql(maxVal.sub(1)) - - // Value that overflows solidity, but result is < maxVal - // Minimum overflow - const maxVal2 = BigNumber.from(2) - .pow(256) - .sub(maxVal.sub(1)) - const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal2, []) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit (invalid amount max overflow)', async () => { - // Maximum overflow - const maxVal = BigNumber.from(2) - .pow(256) - .sub(1) - const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal, []) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT when sending to non-receiver contract', async () => { - const tx = erc1155MintBurnContract.mintMock(erc1155MintBurnContract.address, tokenID, amount, []) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should REVERT if invalid response from receiver contract', async () => { - await receiverContract.setShouldReject(true) - - const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) - await expect(tx).to.be.rejectedWith( - RevertError('ERC1155PackedBalance#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE') - ) - }) - - it('should pass if valid response from receiver contract', async () => { - const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) - await expect(tx).to.be.fulfilled - }) - - it('should pass if data is not null to receiver contract', async () => { - const data = ethers.utils.toUtf8Bytes('Hello from the other side') - - // NOTE: typechain generates the wrong type for `bytes` type at this time - // see https://github.com/ethereum-ts/TypeChain/issues/123 - // @ts-ignore - const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, data) - await expect(tx).to.be.fulfilled - }) - - it('should have balances updated before onERC1155Received is called', async () => { - const toPreBalance = await erc1155MintBurnContract.balanceOf(receiverContract.address, tokenID) - - // Get event filter to get internal tx event - const filterFromReceiverContract = receiverContract.filters.TransferSingleReceiver(null, null, null, null) - - await erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) - - // Get logs from internal transaction event - // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) - filterFromReceiverContract.fromBlock = 0 - - const logs = await ownerProvider.getLogs(filterFromReceiverContract) - const args = receiverContract.interface.decodeEventLog( - receiverContract.interface.events['TransferSingleReceiver(address,address,uint256,uint256)'], - logs[0].data, - logs[0].topics - ) - - expect(args._from).to.be.eql(ZERO_ADDRESS) - expect(args._to).to.be.eql(receiverContract.address) - expect(args._toBalance).to.be.eql(toPreBalance.add(amount)) - }) - - it('should have TransferSingle event emitted before onERC1155Received is called', async () => { - // Get event filter to get internal tx event - const tx = await erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) - const receipt = await tx.wait(1) - - const firstEventTopic = receipt.logs![0].topics[0] - const secondEventTopic = receipt.logs![1].topics[0] - - expect(firstEventTopic).to.be.equal( - erc1155MintBurnContract.interface.getEventTopic( - erc1155MintBurnContract.interface.events['TransferSingle(address,address,address,uint256,uint256)'] - ) - ) - expect(secondEventTopic).to.be.equal( - receiverContract.interface.getEventTopic( - receiverContract.interface.events['TransferSingleReceiver(address,address,uint256,uint256)'] - ) - ) - }) - - it('should emit a Transfer event', async () => { - const tx = await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) - const receipt = await tx.wait(1) - - const ev = receipt.events![0] - expect(ev.event).to.be.eql('TransferSingle') - }) - - it('should have 0x0 as `from` argument in Transfer event', async () => { - const tx = await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) - const receipt = await tx.wait(1) - - // TODO: this form can be improved eventually as ethers improves its api - // or we write a wrapper function to parse the tx - const ev = receipt.events![0] - const args = ev.args! as any - - expect(args._from).to.be.eql(ZERO_ADDRESS) - }) - }) - - describe('_batchMint() function', () => { - const Ntypes = 123 - const amountToMint = 10 - const typesArray = Array.apply(null, { length: Ntypes }).map(Number.call, Number) - const amountArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, amountToMint) - - it('should ALLOW inheriting contract to call _batchMint()', async () => { - const req = erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) - ;(await expect(req).to.be.fulfilled) as ethers.ContractTransaction - }) - - it('should PASS if arrays are empty', async () => { - const tx = erc1155MintBurnContract.batchMintMock(receiverAddress, [], [], []) - await expect(tx).to.be.fulfilled - }) - - it('should NOT allow anyone to call _batchMint()', async () => { - const transaction = { - to: erc1155MintBurnContract.address, - data: - '0x2589aeae00000000000000000000000035ef07393b57464e93deb59175ff72e6499450cf' + - '00000000000000000000000000000000000000000000000000000000000000600000000000000000' + - '0000000000000000000000000000000000000000000000c000000000000000000000000000000000' + - '00000000000000000000000000000002000000000000000000000000000000000000000000000000' + - '00000000000000010000000000000000000000000000000000000000000000000000000000000002' + - '00000000000000000000000000000000000000000000000000000000000000020000000000000000' + - '00000000000000000000000000000000000000000000000a00000000000000000000000000000000' + - '0000000000000000000000000000000a' - } - - const tx = anyoneWallet.sendTransaction(transaction) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should increase the balances of receiver by the right amounts', async () => { - await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) + FILTERED_VALID_ID_BITS.map((bits) => { + const c = process.env.TEST_BIT ? context.only : context + c(`With ${bits} bits for values`, () => { + context('When ERC1155MintBurn contract is deployed', () => { + before(async () => { + ownerAddress = await ownerWallet.getAddress() + receiverAddress = await receiverWallet.getAddress() + anyoneAddress = await anyoneWallet.getAddress() + operatorAddress = await operatorWallet.getAddress() + }) - for (let i = 0; i < typesArray.length; i++) { - const balanceTo = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[i]) - expect(balanceTo).to.be.eql(BigNumber.from(amountArray[i])) - } - }) + beforeEach(async () => { + const abstractReceiver = await AbstractContract.fromArtifactName('ERC1155ReceiverMock') + receiverContract = (await abstractReceiver.deploy(ownerWallet)) as ERC1155ReceiverMock - it('should REVERT when sending to non-receiver contract', async () => { - const tx = erc1155MintBurnContract.batchMintMock(erc1155MintBurnContract.address, typesArray, amountArray, [], { - gasLimit: 2000000 + const abstract = await AbstractContract.fromArtifactName('ERC1155MetaMintBurnPackedBalanceMock') + erc1155MintBurnContract = (await abstract.deploy(ownerWallet, [bits])) as ERC1155MetaMintBurnPackedBalanceMock + anyoneERC1155MintBurnContract = (await erc1155MintBurnContract.connect( + anyoneSigner + )) as ERC1155MetaMintBurnPackedBalanceMock }) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - it('should REVERT if invalid response from receiver contract', async () => { - await receiverContract.setShouldReject(true) - const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { - gasLimit: 2000000 + it('should return bits value', async () => { + const b = await erc1155MintBurnContract.IDS_BITS_SIZE() + expect(b.toNumber()).to.equal(bits) }) - await expect(tx).to.be.rejectedWith( - RevertError('ERC1155PackedBalance#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE') - ) - }) - - it('should REVERT if amount is larger than limit (overflow 1)', async () => { - await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, [], { gasLimit: 2000000 }) - // Overflow by 1 - const maxVal0 = BigNumber.from(2) - .pow(32) - .sub(amountToMint) - const tx0 = erc1155MintBurnContract.batchMintMock( - receiverAddress, - [typesArray[0], typesArray[1]], - [maxVal0, amountArray[1]], - [] - ) - await expect(tx0).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit (invalid amount 1)', async () => { - const maxVal = BigNumber.from(2).pow(32) - const tx2 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0, 1], [maxVal, 1], []) - await expect(tx2).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit (invalid amount min overflow', async () => { - const maxVal = BigNumber.from(2).pow(32) - // Set balance to max acceptable value - await erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal.sub(1)], []) - const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) - await expect(balance).to.be.eql(maxVal.sub(1)) - - // Value that overflows solidity, but result is < maxVal - const maxVal2 = BigNumber.from(2) - .pow(256) - .sub(maxVal.sub(1)) - const tx3 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal2], []) - await expect(tx3).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - - it('should REVERT if amount is larger than limit (invalid amount max overflow)', async () => { - const maxVal = BigNumber.from(2).pow(32) - // Set balance to max acceptable value - await erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal.sub(1)], []) - const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) - - await expect(balance).to.be.eql(maxVal.sub(1)) - const maxVal3 = BigNumber.from(2) - .pow(256) - .sub(1) - const tx4 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal3], []) - await expect(tx4).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) - }) - it('should pass if valid response from receiver contract', async () => { - const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { - gasLimit: 6000000 + describe('_mint() function', () => { + const tokenID = 666 + const amount = bits > 4 ? 11 : 1 + + it('should ALLOW inheriting contract to call mint()', async () => { + const tx = erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) + await expect(tx).to.be.fulfilled + }) + + it('should NOT allow anyone to call _mint()', async () => { + const transaction = { + to: erc1155MintBurnContract.address, + data: + '0x7776afa0000000000000000000000000b87213121fb89cbd8b877cb1bb3ff84dd2869cfa' + + '000000000000000000000000000000000000000000000000000000000000029a0000000000000000' + + '00000000000000000000000000000000000000000000000b' + } + const tx = anyoneWallet.sendTransaction(transaction) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should increase the balance of receiver by the right amount', async () => { + const recipientBalanceA = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) + await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) + + const recipientBalanceB = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) + + expect(recipientBalanceB).to.be.eql(recipientBalanceA.add(amount)) + }) + + it('should REVERT if amount is larger than limit (overflow 1)', async () => { + await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) + const maxVal0 = BigNumber.from(2) + .pow(bits) + .sub(amount) + const tx0 = erc1155MintBurnContract.mintMock(receiverAddress, tokenID, maxVal0, []) + await expect(tx0).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit (invalid amount by 1)', async () => { + const maxVal = BigNumber.from(2).pow(bits) + const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal, []) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit(invalid amount min overflow)', async () => { + const maxVal = BigNumber.from(2).pow(bits) + // Set balance to max acceptable value + await erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal.sub(1), []) + const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) + await expect(balance).to.be.eql(maxVal.sub(1)) + + // Value that overflows solidity, but result is < maxVal + // Minimum overflow + const maxVal2 = BigNumber.from(2) + .pow(256) + .sub(maxVal.sub(1)) + const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal2, []) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit (invalid amount max overflow)', async () => { + // Maximum overflow + const maxVal = BigNumber.from(2) + .pow(256) + .sub(1) + const tx = erc1155MintBurnContract.mintMock(anyoneWallet.address, 0, maxVal, []) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT when sending to non-receiver contract', async () => { + const tx = erc1155MintBurnContract.mintMock(erc1155MintBurnContract.address, tokenID, amount, []) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should REVERT if invalid response from receiver contract', async () => { + await receiverContract.setShouldReject(true) + + const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) + await expect(tx).to.be.rejectedWith( + RevertError('ERC1155PackedBalance#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE') + ) + }) + + it('should pass if valid response from receiver contract', async () => { + const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) + await expect(tx).to.be.fulfilled + }) + + it('should pass if data is not null to receiver contract', async () => { + const data = ethers.utils.toUtf8Bytes('Hello from the other side') + + // NOTE: typechain generates the wrong type for `bytes` type at this time + // see https://github.com/ethereum-ts/TypeChain/issues/123 + // @ts-ignore + const tx = erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, data) + await expect(tx).to.be.fulfilled + }) + + it('should have balances updated before onERC1155Received is called', async () => { + const toPreBalance = await erc1155MintBurnContract.balanceOf(receiverContract.address, tokenID) + + // Get event filter to get internal tx event + const filterFromReceiverContract = receiverContract.filters.TransferSingleReceiver(null, null, null, null) + + await erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) + + // Get logs from internal transaction event + // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) + filterFromReceiverContract.fromBlock = 0 + + const logs = await ownerProvider.getLogs(filterFromReceiverContract) + const args = receiverContract.interface.decodeEventLog( + receiverContract.interface.events['TransferSingleReceiver(address,address,uint256,uint256)'], + logs[0].data, + logs[0].topics + ) + + expect(args._from).to.be.eql(ZERO_ADDRESS) + expect(args._to).to.be.eql(receiverContract.address) + expect(args._toBalance).to.be.eql(toPreBalance.add(amount)) + }) + + it('should have TransferSingle event emitted before onERC1155Received is called', async () => { + // Get event filter to get internal tx event + const tx = await erc1155MintBurnContract.mintMock(receiverContract.address, tokenID, amount, []) + const receipt = await tx.wait(1) + + const firstEventTopic = receipt.logs![0].topics[0] + const secondEventTopic = receipt.logs![1].topics[0] + + expect(firstEventTopic).to.be.equal( + erc1155MintBurnContract.interface.getEventTopic( + erc1155MintBurnContract.interface.events['TransferSingle(address,address,address,uint256,uint256)'] + ) + ) + expect(secondEventTopic).to.be.equal( + receiverContract.interface.getEventTopic( + receiverContract.interface.events['TransferSingleReceiver(address,address,uint256,uint256)'] + ) + ) + }) + + it('should emit a Transfer event', async () => { + const tx = await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) + const receipt = await tx.wait(1) + + const ev = receipt.events![0] + expect(ev.event).to.be.eql('TransferSingle') + }) + + it('should have 0x0 as `from` argument in Transfer event', async () => { + const tx = await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, amount, []) + const receipt = await tx.wait(1) + + // TODO: this form can be improved eventually as ethers improves its api + // or we write a wrapper function to parse the tx + const ev = receipt.events![0] + const args = ev.args! as any + + expect(args._from).to.be.eql(ZERO_ADDRESS) + }) }) - await expect(tx).to.be.fulfilled - }) - it('should pass if data is not null from receiver contract', async () => { - const data = ethers.utils.toUtf8Bytes('Hello from the other side') - - // TODO: remove ts-ignore when contract declaration is fixed - // @ts-ignore - const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, data, { - gasLimit: 2000000 + describe('_batchMint() function', () => { + const Ntypes = bits < 128 ? 123 : 25 + const amountToMint = bits > 4 ? 10 : 1 + const typesArray = Array.apply(null, { length: Ntypes }).map(Number.call, Number) + const amountArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, amountToMint) + + it('should ALLOW inheriting contract to call _batchMint()', async () => { + const req = erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) + ;(await expect(req).to.be.fulfilled) as ethers.ContractTransaction + }) + + it('should PASS if arrays are empty', async () => { + const tx = erc1155MintBurnContract.batchMintMock(receiverAddress, [], [], []) + await expect(tx).to.be.fulfilled + }) + + it('should NOT allow anyone to call _batchMint()', async () => { + const transaction = { + to: erc1155MintBurnContract.address, + data: + '0x2589aeae00000000000000000000000035ef07393b57464e93deb59175ff72e6499450cf' + + '00000000000000000000000000000000000000000000000000000000000000600000000000000000' + + '0000000000000000000000000000000000000000000000c000000000000000000000000000000000' + + '00000000000000000000000000000002000000000000000000000000000000000000000000000000' + + '00000000000000010000000000000000000000000000000000000000000000000000000000000002' + + '00000000000000000000000000000000000000000000000000000000000000020000000000000000' + + '00000000000000000000000000000000000000000000000a00000000000000000000000000000000' + + '0000000000000000000000000000000a' + } + + const tx = anyoneWallet.sendTransaction(transaction) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should increase the balances of receiver by the right amounts', async () => { + await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) + + for (let i = 0; i < typesArray.length; i++) { + const balanceTo = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[i]) + expect(balanceTo).to.be.eql(BigNumber.from(amountArray[i])) + } + }) + + it('should REVERT when sending to non-receiver contract', async () => { + const tx = erc1155MintBurnContract.batchMintMock(erc1155MintBurnContract.address, typesArray, amountArray, [], { + gasLimit: 2000000 + }) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should REVERT if invalid response from receiver contract', async () => { + await receiverContract.setShouldReject(true) + const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { + gasLimit: 2000000 + }) + await expect(tx).to.be.rejectedWith( + RevertError('ERC1155PackedBalance#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE') + ) + }) + + it('should REVERT if amount is larger than limit (overflow 1)', async () => { + await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, [], { gasLimit: 2000000 }) + // Overflow by 1 + const maxVal0 = BigNumber.from(2) + .pow(bits) + .sub(amountToMint) + const tx0 = erc1155MintBurnContract.batchMintMock( + receiverAddress, + [typesArray[0], typesArray[1]], + [maxVal0, amountArray[1]], + [] + ) + await expect(tx0).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit (invalid amount 1)', async () => { + const maxVal = BigNumber.from(2).pow(bits) + const tx2 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0, 1], [maxVal, 1], []) + await expect(tx2).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit (invalid amount min overflow', async () => { + const maxVal = BigNumber.from(2).pow(bits) + // Set balance to max acceptable value + await erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal.sub(1)], []) + const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) + await expect(balance).to.be.eql(maxVal.sub(1)) + + // Value that overflows solidity, but result is < maxVal + const maxVal2 = BigNumber.from(2) + .pow(256) + .sub(maxVal.sub(1)) + const tx3 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal2], []) + await expect(tx3).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should REVERT if amount is larger than limit (invalid amount max overflow)', async () => { + const maxVal = BigNumber.from(2).pow(bits) + // Set balance to max acceptable value + await erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal.sub(1)], []) + const balance = await erc1155MintBurnContract.balanceOf(anyoneWallet.address, 0) + + await expect(balance).to.be.eql(maxVal.sub(1)) + const maxVal3 = BigNumber.from(2) + .pow(256) + .sub(1) + const tx4 = erc1155MintBurnContract.batchMintMock(anyoneWallet.address, [0], [maxVal3], []) + await expect(tx4).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW')) + }) + + it('should pass if valid response from receiver contract', async () => { + const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { + gasLimit: 6000000 + }) + await expect(tx).to.be.fulfilled + }) + + it('should pass if data is not null from receiver contract', async () => { + const data = ethers.utils.toUtf8Bytes('Hello from the other side') + + // TODO: remove ts-ignore when contract declaration is fixed + // @ts-ignore + const tx = erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, data, { + gasLimit: 2000000 + }) + await expect(tx).to.be.fulfilled + }) + + it('should have balances updated before onERC1155BatchReceived is called', async () => { + const toAddresses = Array(typesArray.length).fill(receiverContract.address) + + const toPreBalances = await erc1155MintBurnContract.balanceOfBatch(toAddresses, typesArray) + + // Get event filter to get internal tx event + const filterFromReceiverContract = receiverContract.filters.TransferBatchReceiver(null, null, null, null) + + await erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { gasLimit: 2000000 }) + + // Get logs from internal transaction event + // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) + filterFromReceiverContract.fromBlock = 0 + + const logs = await ownerProvider.getLogs(filterFromReceiverContract) + const args = receiverContract.interface.decodeEventLog( + receiverContract.interface.events['TransferBatchReceiver(address,address,uint256[],uint256[])'], + logs[0].data, + logs[0].topics + ) + + expect(args._from).to.be.eql(ZERO_ADDRESS) + expect(args._to).to.be.eql(receiverContract.address) + for (let i = 0; i < typesArray.length; i++) { + expect(args._toBalances[i]).to.be.eql(toPreBalances[i].add(amountArray[i])) + } + }) + + it('should have TransferBatch event emitted before onERC1155BatchReceived is called', async () => { + // Get event filter to get internal tx event + const tx = await erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { + gasLimit: 2000000 + }) + const receipt = await tx.wait(1) + + const firstEventTopic = receipt.logs![0].topics[0] + const secondEventTopic = receipt.logs![1].topics[0] + + expect(firstEventTopic).to.be.equal( + erc1155MintBurnContract.interface.getEventTopic( + erc1155MintBurnContract.interface.events['TransferBatch(address,address,address,uint256[],uint256[])'] + ) + ) + expect(secondEventTopic).to.be.equal( + erc1155MintBurnContract.interface.getEventTopic( + receiverContract.interface.events['TransferBatchReceiver(address,address,uint256[],uint256[])'] + ) + ) + }) + + it('should emit 1 Transfer events of N transfers', async () => { + const tx = await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) + const receipt = await tx.wait() + const ev = receipt.events![0] + expect(ev.event).to.be.eql('TransferBatch') + + const args = ev.args! as any + expect(args._ids.length).to.be.eql(typesArray.length) + }) + + it('should have 0x0 as `from` argument in Transfer events', async () => { + const tx = await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) + const receipt = await tx.wait() + const args = receipt.events![0].args! as any + expect(args._from).to.be.eql(ZERO_ADDRESS) + }) }) - await expect(tx).to.be.fulfilled - }) - - it('should have balances updated before onERC1155BatchReceived is called', async () => { - const toAddresses = Array(typesArray.length).fill(receiverContract.address) - - const toPreBalances = await erc1155MintBurnContract.balanceOfBatch(toAddresses, typesArray) - - // Get event filter to get internal tx event - const filterFromReceiverContract = receiverContract.filters.TransferBatchReceiver(null, null, null, null) - - await erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { gasLimit: 2000000 }) - - // Get logs from internal transaction event - // @ts-ignore (https://github.com/ethers-io/ethers.js/issues/204#issuecomment-427059031) - filterFromReceiverContract.fromBlock = 0 - - const logs = await ownerProvider.getLogs(filterFromReceiverContract) - const args = receiverContract.interface.decodeEventLog( - receiverContract.interface.events['TransferBatchReceiver(address,address,uint256[],uint256[])'], - logs[0].data, - logs[0].topics - ) - - expect(args._from).to.be.eql(ZERO_ADDRESS) - expect(args._to).to.be.eql(receiverContract.address) - for (let i = 0; i < typesArray.length; i++) { - expect(args._toBalances[i]).to.be.eql(toPreBalances[i].add(amountArray[i])) - } - }) - it('should have TransferBatch event emitted before onERC1155BatchReceived is called', async () => { - // Get event filter to get internal tx event - const tx = await erc1155MintBurnContract.batchMintMock(receiverContract.address, typesArray, amountArray, [], { - gasLimit: 2000000 + describe('_burn() function', () => { + const tokenID = 666 + const initBalance = bits > 4 ? 10 : 1 + const amountToBurn = bits > 4 ? 10 : 1 + + beforeEach(async () => { + await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, initBalance, []) + }) + + it('should ALLOW inheriting contract to call _burn()', async () => { + const tx = erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) + await expect(tx).to.be.fulfilled + }) + + it('should NOT allow anyone to call _burn()', async () => { + const transaction = { + to: erc1155MintBurnContract.address, + data: + '0x464a5ffb00000000000000000000000008970fed061e7747cd9a38d680a601510cb659fb' + + '000000000000000000000000000000000000000000000000000000000000029a0000000000000000' + + '00000000000000000000000000000000000000000000000a' + } + const tx = anyoneWallet.sendTransaction(transaction) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should decrease the balance of receiver by the right amount', async () => { + const recipientBalanceA = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) + await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) + + const recipientBalanceB = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) + expect(recipientBalanceB).to.be.eql(recipientBalanceA.sub(amountToBurn)) + }) + + it('should REVERT if amount is hgher than balance', async () => { + // Sanity check + const balance = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) + expect(balance).to.be.eql(BigNumber.from(initBalance)) + + // Invalid amount to burn that would cause underflow + const invalidVal = initBalance + 1 + + const tx = erc1155MintBurnContract.burnMock(receiverAddress, tokenID, invalidVal) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) + }) + + it('should emit a Transfer event', async () => { + const tx = await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) + const receipt = await tx.wait(1) + + const ev = receipt.events![0] + expect(ev.event).to.be.eql('TransferSingle') + }) + + it('should have 0x0 as `to` argument in Transfer event', async () => { + const tx = await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) + const receipt = await tx.wait(1) + + // TODO: this form can be improved eventually as ethers improves its api + // or we write a wrapper function to parse the tx + const ev = receipt.events![0] + const args = ev.args! as any + + expect(args._to).to.be.eql(ZERO_ADDRESS) + }) }) - const receipt = await tx.wait(1) - - const firstEventTopic = receipt.logs![0].topics[0] - const secondEventTopic = receipt.logs![1].topics[0] - - expect(firstEventTopic).to.be.equal( - erc1155MintBurnContract.interface.getEventTopic( - erc1155MintBurnContract.interface.events['TransferBatch(address,address,address,uint256[],uint256[])'] - ) - ) - expect(secondEventTopic).to.be.equal( - erc1155MintBurnContract.interface.getEventTopic( - receiverContract.interface.events['TransferBatchReceiver(address,address,uint256[],uint256[])'] - ) - ) - }) - - it('should emit 1 Transfer events of N transfers', async () => { - const tx = await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) - const receipt = await tx.wait() - const ev = receipt.events![0] - expect(ev.event).to.be.eql('TransferBatch') - - const args = ev.args! as any - expect(args._ids.length).to.be.eql(typesArray.length) - }) - - it('should have 0x0 as `from` argument in Transfer events', async () => { - const tx = await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, amountArray, []) - const receipt = await tx.wait() - const args = receipt.events![0].args! as any - expect(args._from).to.be.eql(ZERO_ADDRESS) - }) - }) - - describe('_burn() function', () => { - const tokenID = 666 - const initBalance = 100 - const amountToBurn = 10 - beforeEach(async () => { - await erc1155MintBurnContract.mintMock(receiverAddress, tokenID, initBalance, []) - }) - - it('should ALLOW inheriting contract to call _burn()', async () => { - const tx = erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) - await expect(tx).to.be.fulfilled - }) - - it('should NOT allow anyone to call _burn()', async () => { - const transaction = { - to: erc1155MintBurnContract.address, - data: - '0x464a5ffb00000000000000000000000008970fed061e7747cd9a38d680a601510cb659fb' + - '000000000000000000000000000000000000000000000000000000000000029a0000000000000000' + - '00000000000000000000000000000000000000000000000a' - } - const tx = anyoneWallet.sendTransaction(transaction) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should decrease the balance of receiver by the right amount', async () => { - const recipientBalanceA = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) - await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) - - const recipientBalanceB = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) - expect(recipientBalanceB).to.be.eql(recipientBalanceA.sub(amountToBurn)) - }) - - it('should REVERT if amount is hgher than balance', async () => { - // Sanity check - const balance = await erc1155MintBurnContract.balanceOf(receiverAddress, tokenID) - expect(balance).to.be.eql(BigNumber.from(initBalance)) - - // Invalid amount to burn that would cause underflow - const invalidVal = initBalance + 1 - - const tx = erc1155MintBurnContract.burnMock(receiverAddress, tokenID, invalidVal) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) - }) - - it('should emit a Transfer event', async () => { - const tx = await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) - const receipt = await tx.wait(1) - - const ev = receipt.events![0] - expect(ev.event).to.be.eql('TransferSingle') - }) - - it('should have 0x0 as `to` argument in Transfer event', async () => { - const tx = await erc1155MintBurnContract.burnMock(receiverAddress, tokenID, amountToBurn) - const receipt = await tx.wait(1) - - // TODO: this form can be improved eventually as ethers improves its api - // or we write a wrapper function to parse the tx - const ev = receipt.events![0] - const args = ev.args! as any - - expect(args._to).to.be.eql(ZERO_ADDRESS) - }) - }) - - describe('_batchBurn() function', () => { - const Ntypes = 32 - const initBalance = 100 - const amountToBurn = 30 - const typesArray = Array.apply(null, { length: Ntypes }).map(Number.call, Number) - const burnAmountArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, amountToBurn) - const initBalanceArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, initBalance) - - beforeEach(async () => { - await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, initBalanceArray, []) - }) - - it('should ALLOW inheriting contract to call _batchBurn()', async () => { - const req = erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) - const tx = (await expect(req).to.be.fulfilled) as ethers.ContractTransaction - // const receipt = await tx.wait() - // console.log('Batch mint :' + receipt.gasUsed) - }) - - // Should call mock's fallback function - it('should NOT allow anyone to call _batchBurn()', async () => { - const transaction = { - to: erc1155MintBurnContract.address, - data: - '0xb389c3bb000000000000000000000000dc04977a2078c8ffdf086d618d1f961b6c546222' + - '00000000000000000000000000000000000000000000000000000000000000600000000000000000' + - '0000000000000000000000000000000000000000000000c000000000000000000000000000000000' + - '00000000000000000000000000000002000000000000000000000000000000000000000000000000' + - '00000000000000010000000000000000000000000000000000000000000000000000000000000003' + - '00000000000000000000000000000000000000000000000000000000000000020000000000000000' + - '00000000000000000000000000000000000000000000001e00000000000000000000000000000000' + - '0000000000000000000000000000001e' - } - const tx = anyoneWallet.sendTransaction(transaction) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) - }) - - it('should decrease the balances of receiver by the right amounts', async () => { - await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) - - for (let i = 0; i < typesArray.length; i++) { - const balanceTo = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[i]) - expect(balanceTo).to.be.eql(BigNumber.from(initBalance - burnAmountArray[i])) - } - }) - - it('should REVERT if amount is higher than balance', async () => { - // Sanity check - const balance = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[0]) - expect(balance).to.be.eql(BigNumber.from(initBalance)) - - // Invalid amount to burn that would cause underflow - const invalidVal = initBalance + 1 - - const tx = erc1155MintBurnContract.batchBurnMock(receiverAddress, [typesArray[0]], [invalidVal]) - await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) - }) - - it('should emit 1 Transfer events of N transfers', async () => { - const tx = await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) - const receipt = await tx.wait() - const ev = receipt.events![0] - expect(ev.event).to.be.eql('TransferBatch') - - const args = ev.args! as any - expect(args._ids.length).to.be.eql(typesArray.length) - }) - - it('should have 0x0 as `to` argument in Transfer events', async () => { - const tx = await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) - const receipt = await tx.wait() - const args = receipt.events![0].args! as any - expect(args._to).to.be.eql(ZERO_ADDRESS) + describe('_batchBurn() function', () => { + const Ntypes = 32 + const initBalance = bits > 4 ? 100 : 1 + const amountToBurn = bits > 4 ? 30 : 1 + const typesArray = Array.apply(null, { length: Ntypes }).map(Number.call, Number) + const burnAmountArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, amountToBurn) + const initBalanceArray = Array.apply(null, Array(Ntypes)).map(Number.prototype.valueOf, initBalance) + + beforeEach(async () => { + await erc1155MintBurnContract.batchMintMock(receiverAddress, typesArray, initBalanceArray, []) + }) + + it('should ALLOW inheriting contract to call _batchBurn()', async () => { + const req = erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) + const tx = (await expect(req).to.be.fulfilled) as ethers.ContractTransaction + // const receipt = await tx.wait() + // console.log('Batch mint :' + receipt.gasUsed) + }) + + // Should call mock's fallback function + it('should NOT allow anyone to call _batchBurn()', async () => { + const transaction = { + to: erc1155MintBurnContract.address, + data: + '0xb389c3bb000000000000000000000000dc04977a2078c8ffdf086d618d1f961b6c546222' + + '00000000000000000000000000000000000000000000000000000000000000600000000000000000' + + '0000000000000000000000000000000000000000000000c000000000000000000000000000000000' + + '00000000000000000000000000000002000000000000000000000000000000000000000000000000' + + '00000000000000010000000000000000000000000000000000000000000000000000000000000003' + + '00000000000000000000000000000000000000000000000000000000000000020000000000000000' + + '00000000000000000000000000000000000000000000001e00000000000000000000000000000000' + + '0000000000000000000000000000001e' + } + const tx = anyoneWallet.sendTransaction(transaction) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155MetaMintBurnPackedBalanceMock: INVALID_METHOD')) + }) + + it('should decrease the balances of receiver by the right amounts', async () => { + await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) + + for (let i = 0; i < typesArray.length; i++) { + const balanceTo = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[i]) + expect(balanceTo).to.be.eql(BigNumber.from(initBalance - burnAmountArray[i])) + } + }) + + it('should REVERT if amount is higher than balance', async () => { + // Sanity check + const balance = await erc1155MintBurnContract.balanceOf(receiverAddress, typesArray[0]) + expect(balance).to.be.eql(BigNumber.from(initBalance)) + + // Invalid amount to burn that would cause underflow + const invalidVal = initBalance + 1 + + const tx = erc1155MintBurnContract.batchBurnMock(receiverAddress, [typesArray[0]], [invalidVal]) + await expect(tx).to.be.rejectedWith(RevertError('ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW')) + }) + + it('should emit 1 Transfer events of N transfers', async () => { + const tx = await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) + const receipt = await tx.wait() + const ev = receipt.events![0] + expect(ev.event).to.be.eql('TransferBatch') + + const args = ev.args! as any + expect(args._ids.length).to.be.eql(typesArray.length) + }) + + it('should have 0x0 as `to` argument in Transfer events', async () => { + const tx = await erc1155MintBurnContract.batchBurnMock(receiverAddress, typesArray, burnAmountArray) + const receipt = await tx.wait() + const args = receipt.events![0].args! as any + expect(args._to).to.be.eql(ZERO_ADDRESS) + }) + }) }) }) }) diff --git a/tests/ERC1155PackedBalance.spec.ts b/tests/ERC1155PackedBalance.spec.ts index f355805..ac7355d 100644 --- a/tests/ERC1155PackedBalance.spec.ts +++ b/tests/ERC1155PackedBalance.spec.ts @@ -1,6 +1,6 @@ import * as ethers from 'ethers' -import { AbstractContract, expect, BigNumber, RevertError } from './utils' +import { AbstractContract, expect, BigNumber, RevertError, INVALID_ID_BITS } from './utils' import * as utils from './utils' import { @@ -45,10 +45,17 @@ describe('ERC1155PackedBalance', () => { // deploy before each test, to reset state of contract beforeEach(async () => { - erc1155Contract = (await erc1155Abstract.deploy(ownerWallet)) as ERC1155MetaMintBurnPackedBalanceMock + erc1155Contract = (await erc1155Abstract.deploy(ownerWallet, [32])) as ERC1155MetaMintBurnPackedBalanceMock operatorERC1155Contract = (await erc1155Contract.connect(operatorSigner)) as ERC1155MetaMintBurnPackedBalanceMock }) + describe('Custom bits', () => { + INVALID_ID_BITS.map((v) => it(`should fail to create nft with ${v} bit size values`, async () => { + const tx = erc1155Abstract.deploy(ownerWallet, [v]) + await expect(tx).to.be.rejected + })) + }) + describe('Bitwise functions', () => { it('getValueInBin should return expected balance for given types', async () => { const expected = BigNumber.from(2) diff --git a/tests/utils/helpers.ts b/tests/utils/helpers.ts index 2457db8..33d08aa 100644 --- a/tests/utils/helpers.ts +++ b/tests/utils/helpers.ts @@ -421,3 +421,15 @@ export class Web3DebugProvider extends ethers.providers.JsonRpcProvider { } } + +export const VALID_ID_BITS = [1, 2, 4, 8, 16, 32, 64, 128] + +export const FILTERED_VALID_ID_BITS = VALID_ID_BITS.filter((v) => { + if (!process.env.TEST_BIT) return true + return process.env.TEST_BIT === v.toString() +}) + +export const INVALID_ID_BITS = new Array(512) + .fill(0) + .map((_, i) => i) + .filter((v) => !VALID_ID_BITS.includes(v))