diff --git a/VERSION b/VERSION index e75d8b4ea..c972a4f60 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.167.6 +0.168.0 diff --git a/contracts/community-tokens/assets/Assets.go b/contracts/community-tokens/assets/Assets.go index 470ad1573..2c49a8454 100644 --- a/contracts/community-tokens/assets/Assets.go +++ b/contracts/community-tokens/assets/Assets.go @@ -4,6 +4,7 @@ package assets import ( + "errors" "math/big" "strings" @@ -17,6 +18,7 @@ import ( // Reference imports to suppress errors if they are not otherwise used. var ( + _ = errors.New _ = big.NewInt _ = strings.NewReader _ = ethereum.NotFound @@ -24,22 +26,34 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) +// AssetsMetaData contains all meta data concerning the Assets contract. +var AssetsMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_maxSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CommunityERC20_MaxSupplyLowerThanTotalSupply\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityERC20_MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityERC20_MismatchingAddressesAndAmountsLengths\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b50604051620015b6380380620015b6833981016040819052620000349162000188565b8383620000413362000073565b60046200004f8382620002a2565b5060056200005e8282620002a2565b50505060065560ff16608052506200036e9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000eb57600080fd5b81516001600160401b0380821115620001085762000108620000c3565b604051601f8301601f19908116603f01168101908282118183101715620001335762000133620000c3565b816040528381526020925086838588010111156200015057600080fd5b600091505b8382101562000174578582018301518183018401529082019062000155565b600093810190920192909252949350505050565b600080600080608085870312156200019f57600080fd5b84516001600160401b0380821115620001b757600080fd5b620001c588838901620000d9565b95506020870151915080821115620001dc57600080fd5b50620001eb87828801620000d9565b935050604085015160ff811681146200020357600080fd5b6060959095015193969295505050565b600181811c908216806200022857607f821691505b6020821081036200024957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029d57600081815260208120601f850160051c81016020861015620002785750805b601f850160051c820191505b81811015620002995782815560010162000284565b5050505b505050565b81516001600160401b03811115620002be57620002be620000c3565b620002d681620002cf845462000213565b846200024f565b602080601f8311600181146200030e5760008415620002f55750858301515b600019600386901b1c1916600185901b17855562000299565b600085815260208120601f198616915b828110156200033f578886015182559484019460019091019084016200031e565b50858210156200035e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805161122c6200038a600039600061018d015261122c6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806370a08231116100b2578063a457c2d711610081578063d5abeb0111610066578063d5abeb0114610286578063dd62ed3e1461028f578063f2fde38b146102d557600080fd5b8063a457c2d714610260578063a9059cbb1461027357600080fd5b806370a08231146101f2578063715018a6146102285780638da5cb5b1461023057806395d89b411461025857600080fd5b8063313ce567116100ee578063313ce5671461018657806339509351146101b757806369add11d146101ca5780636f8b44b0146101df57600080fd5b806306fdde0314610120578063095ea7b31461013e57806318160ddd1461016157806323b872dd14610173575b600080fd5b6101286102e8565b6040516101359190610ded565b60405180910390f35b61015161014c366004610e82565b61037a565b6040519015158152602001610135565b6003545b604051908152602001610135565b610151610181366004610eac565b610394565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610135565b6101516101c5366004610e82565b6103b8565b6101dd6101d8366004610ff5565b610404565b005b6101dd6101ed3660046110b5565b6104fb565b6101656102003660046110ce565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b6101dd610544565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610135565b610128610558565b61015161026e366004610e82565b610567565b610151610281366004610e82565b61063d565b61016560065481565b61016561029d3660046110f0565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6101dd6102e33660046110ce565b61064b565b6060600480546102f790611123565b80601f016020809104026020016040519081016040528092919081815260200182805461032390611123565b80156103705780601f1061034557610100808354040283529160200191610370565b820191906000526020600020905b81548152906001019060200180831161035357829003601f168201915b5050505050905090565b600033610388818585610702565b60019150505b92915050565b6000336103a28582856108b5565b6103ad85858561098c565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061038890829086906103ff9087906111a5565b610702565b61040c610c02565b8051825114610447576040517f825caa1d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156104f6576000828281518110610467576104676111b8565b602002602001015190506006548161047e60035490565b61048891906111a5565b11156104c0576040517fb9da758f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104e38483815181106104d5576104d56111b8565b602002602001015182610c83565b50806104ee816111e7565b91505061044a565b505050565b610503610c02565b60035481101561053f576040517f5716872300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600655565b61054c610c02565b6105566000610d78565b565b6060600580546102f790611123565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103ad8286868403610702565b60003361038881858561098c565b610653610c02565b73ffffffffffffffffffffffffffffffffffffffff81166106f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610627565b6106ff81610d78565b50565b73ffffffffffffffffffffffffffffffffffffffff83166107a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610627565b73ffffffffffffffffffffffffffffffffffffffff8216610847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610627565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109865781811015610979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610627565b6109868484848403610702565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610627565b73ffffffffffffffffffffffffffffffffffffffff8216610ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610627565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205481811015610b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610627565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610bf59086815260200190565b60405180910390a3610986565b60005473ffffffffffffffffffffffffffffffffffffffff163314610556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610627565b73ffffffffffffffffffffffffffffffffffffffff8216610d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610627565b8060036000828254610d1291906111a5565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b81811015610e1a57858101830151858201604001528201610dfe565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e7d57600080fd5b919050565b60008060408385031215610e9557600080fd5b610e9e83610e59565b946020939093013593505050565b600080600060608486031215610ec157600080fd5b610eca84610e59565b9250610ed860208501610e59565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610f5e57610f5e610ee8565b604052919050565b600067ffffffffffffffff821115610f8057610f80610ee8565b5060051b60200190565b600082601f830112610f9b57600080fd5b81356020610fb0610fab83610f66565b610f17565b82815260059290921b84018101918181019086841115610fcf57600080fd5b8286015b84811015610fea5780358352918301918301610fd3565b509695505050505050565b6000806040838503121561100857600080fd5b823567ffffffffffffffff8082111561102057600080fd5b818501915085601f83011261103457600080fd5b81356020611044610fab83610f66565b82815260059290921b8401810191818101908984111561106357600080fd5b948201945b838610156110885761107986610e59565b82529482019490820190611068565b9650508601359250508082111561109e57600080fd5b506110ab85828601610f8a565b9150509250929050565b6000602082840312156110c757600080fd5b5035919050565b6000602082840312156110e057600080fd5b6110e982610e59565b9392505050565b6000806040838503121561110357600080fd5b61110c83610e59565b915061111a60208401610e59565b90509250929050565b600181811c9082168061113757607f821691505b602082108103611170577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561038e5761038e611176565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361121857611218611176565b506001019056fea164736f6c6343000811000a", +} + // AssetsABI is the input ABI used to generate the binding from. -const AssetsABI = "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_maxSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" +// Deprecated: Use AssetsMetaData.ABI instead. +var AssetsABI = AssetsMetaData.ABI // AssetsBin is the compiled bytecode used for deploying new contracts. -var AssetsBin = "0x60806040523480156200001157600080fd5b50604051620011d2380380620011d2833981016040819052620000349162000182565b828262000041336200006d565b60046200004f838262000284565b5060056200005e828262000284565b50505060065550620003509050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000e557600080fd5b81516001600160401b0380821115620001025762000102620000bd565b604051601f8301601f19908116603f011681019082821181831017156200012d576200012d620000bd565b816040528381526020925086838588010111156200014a57600080fd5b600091505b838210156200016e57858201830151818301840152908201906200014f565b600093810190920192909252949350505050565b6000806000606084860312156200019857600080fd5b83516001600160401b0380821115620001b057600080fd5b620001be87838801620000d3565b94506020860151915080821115620001d557600080fd5b50620001e486828701620000d3565b925050604084015190509250925092565b600181811c908216806200020a57607f821691505b6020821081036200022b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027f57600081815260208120601f850160051c810160208610156200025a5750805b601f850160051c820191505b818110156200027b5782815560010162000266565b5050505b505050565b81516001600160401b03811115620002a057620002a0620000bd565b620002b881620002b18454620001f5565b8462000231565b602080601f831160018114620002f05760008415620002d75750858301515b600019600386901b1c1916600185901b1785556200027b565b600085815260208120601f198616915b82811015620003215788860151825594840194600190910190840162000300565b5085821015620003405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610e7280620003606000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a2578063a457c2d711610071578063a457c2d714610214578063a9059cbb14610227578063d5abeb011461023a578063dd62ed3e14610243578063f2fde38b1461025657600080fd5b806370a08231146101c0578063715018a6146101e95780638da5cb5b146101f157806395d89b411461020c57600080fd5b8063313ce567116100de578063313ce56714610176578063395093511461018557806369add11d146101985780636f8b44b0146101ad57600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015157806323b872dd14610163575b600080fd5b610118610269565b6040516101259190610ad6565b60405180910390f35b61014161013c366004610b40565b6102fb565b6040519015158152602001610125565b6003545b604051908152602001610125565b610141610171366004610b6a565b610315565b60405160128152602001610125565b610141610193366004610b40565b610339565b6101ab6101a6366004610c7c565b61035b565b005b6101ab6101bb366004610d3c565b610468565b6101556101ce366004610d55565b6001600160a01b031660009081526001602052604090205490565b6101ab6104d2565b6000546040516001600160a01b039091168152602001610125565b6101186104e6565b610141610222366004610b40565b6104f5565b610141610235366004610b40565b610570565b61015560065481565b610155610251366004610d77565b61057e565b6101ab610264366004610d55565b6105a9565b60606004805461027890610daa565b80601f01602080910402602001604051908101604052809291908181526020018280546102a490610daa565b80156102f15780601f106102c6576101008083540402835291602001916102f1565b820191906000526020600020905b8154815290600101906020018083116102d457829003601f168201915b5050505050905090565b600033610309818585610622565b60019150505b92915050565b600033610323858285610746565b61032e8585856107c0565b506001949350505050565b60003361030981858561034c838361057e565b6103569190610dfa565b610622565b61036361096b565b80518251146103a95760405162461bcd60e51b815260206004820152600d60248201526c57524f4e475f4c454e4754485360981b60448201526064015b60405180910390fd5b60005b82518110156104635760008282815181106103c9576103c9610e0d565b60200260200101519050600654816103e060035490565b6103ea9190610dfa565b111561042d5760405162461bcd60e51b815260206004820152601260248201527113505617d4d55414131657d4915050d2115160721b60448201526064016103a0565b61045084838151811061044257610442610e0d565b6020026020010151826109c5565b508061045b81610e23565b9150506103ac565b505050565b61047061096b565b6003548110156104cd5760405162461bcd60e51b815260206004820152602260248201527f4d41585f535550504c595f4c4f5745525f5448414e5f544f54414c5f535550506044820152614c5960f01b60648201526084016103a0565b600655565b6104da61096b565b6104e46000610a86565b565b60606005805461027890610daa565b60003381610503828661057e565b9050838110156105635760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016103a0565b61032e8286868403610622565b6000336103098185856107c0565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6105b161096b565b6001600160a01b0381166106165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103a0565b61061f81610a86565b50565b6001600160a01b0383166106845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103a0565b6001600160a01b0382166106e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103a0565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610752848461057e565b905060001981146107ba57818110156107ad5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103a0565b6107ba8484848403610622565b50505050565b6001600160a01b0383166108245760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103a0565b6001600160a01b0382166108865760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103a0565b6001600160a01b038316600090815260016020526040902054818110156108fe5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103a0565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061095e9086815260200190565b60405180910390a36107ba565b6000546001600160a01b031633146104e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a0565b6001600160a01b038216610a1b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016103a0565b8060036000828254610a2d9190610dfa565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b81811015610b0357858101830151858201604001528201610ae7565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b3b57600080fd5b919050565b60008060408385031215610b5357600080fd5b610b5c83610b24565b946020939093013593505050565b600080600060608486031215610b7f57600080fd5b610b8884610b24565b9250610b9660208501610b24565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610be557610be5610ba6565b604052919050565b600067ffffffffffffffff821115610c0757610c07610ba6565b5060051b60200190565b600082601f830112610c2257600080fd5b81356020610c37610c3283610bed565b610bbc565b82815260059290921b84018101918181019086841115610c5657600080fd5b8286015b84811015610c715780358352918301918301610c5a565b509695505050505050565b60008060408385031215610c8f57600080fd5b823567ffffffffffffffff80821115610ca757600080fd5b818501915085601f830112610cbb57600080fd5b81356020610ccb610c3283610bed565b82815260059290921b84018101918181019089841115610cea57600080fd5b948201945b83861015610d0f57610d0086610b24565b82529482019490820190610cef565b96505086013592505080821115610d2557600080fd5b50610d3285828601610c11565b9150509250929050565b600060208284031215610d4e57600080fd5b5035919050565b600060208284031215610d6757600080fd5b610d7082610b24565b9392505050565b60008060408385031215610d8a57600080fd5b610d9383610b24565b9150610da160208401610b24565b90509250929050565b600181811c90821680610dbe57607f821691505b602082108103610dde57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561030f5761030f610de4565b634e487b7160e01b600052603260045260246000fd5b600060018201610e3557610e35610de4565b506001019056fea26469706673582212201a38838bf6afee53b670dc0ffff18695c7f8fe43978200d829ebd3893148fd3a64736f6c63430008110033" +// Deprecated: Use AssetsMetaData.Bin instead. +var AssetsBin = AssetsMetaData.Bin // DeployAssets deploys a new Ethereum contract, binding an instance of Assets to it. -func DeployAssets(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _maxSupply *big.Int) (common.Address, *types.Transaction, *Assets, error) { - parsed, err := abi.JSON(strings.NewReader(AssetsABI)) +func DeployAssets(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _decimals uint8, _maxSupply *big.Int) (common.Address, *types.Transaction, *Assets, error) { + parsed, err := AssetsMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(AssetsBin), backend, _name, _symbol, _maxSupply) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AssetsBin), backend, _name, _symbol, _decimals, _maxSupply) if err != nil { return common.Address{}, nil, nil, err } @@ -143,11 +157,11 @@ func NewAssetsFilterer(address common.Address, filterer bind.ContractFilterer) ( // bindAssets binds a generic wrapper to an already deployed contract. func bindAssets(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(AssetsABI)) + parsed, err := AssetsMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and diff --git a/contracts/community-tokens/assets/CommunityERC20.sol b/contracts/community-tokens/assets/CommunityERC20.sol new file mode 100644 index 000000000..a20fa4b63 --- /dev/null +++ b/contracts/community-tokens/assets/CommunityERC20.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: Mozilla Public License 2.0 +pragma solidity ^0.8.17; + +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/utils/Context.sol"; + +contract CommunityERC20 is Context, Ownable, ERC20 { + error CommunityERC20_MaxSupplyLowerThanTotalSupply(); + error CommunityERC20_MaxSupplyReached(); + error CommunityERC20_MismatchingAddressesAndAmountsLengths(); + + /** + * If we want unlimited total supply we should set maxSupply to 2^256-1. + */ + uint256 public maxSupply; + + uint8 private immutable customDecimals; + + constructor( + string memory _name, + string memory _symbol, + uint8 _decimals, + uint256 _maxSupply + ) + ERC20(_name, _symbol) + { + maxSupply = _maxSupply; + customDecimals = _decimals; + } + + // Events + + // External functions + + function setMaxSupply(uint256 newMaxSupply) external onlyOwner { + if (newMaxSupply < totalSupply()) { + revert CommunityERC20_MaxSupplyLowerThanTotalSupply(); + } + maxSupply = newMaxSupply; + } + + /** + * @dev Mint tokens for each address in `addresses` each one with + * an amount specified in `amounts`. + * + */ + function mintTo(address[] memory addresses, uint256[] memory amounts) external onlyOwner { + if (addresses.length != amounts.length) { + revert CommunityERC20_MismatchingAddressesAndAmountsLengths(); + } + + for (uint256 i = 0; i < addresses.length; i++) { + uint256 amount = amounts[i]; + if (totalSupply() + amount > maxSupply) { + revert CommunityERC20_MaxSupplyReached(); + } + _mint(addresses[i], amount); + } + } + + // Public functions + function decimals() public view virtual override returns (uint8) { + return customDecimals; + } + + // Internal functions + + // Private functions +} diff --git a/contracts/community-tokens/collectibles/CollectibleV1.sol b/contracts/community-tokens/collectibles/CollectibleV1.sol new file mode 100644 index 000000000..5777db92a --- /dev/null +++ b/contracts/community-tokens/collectibles/CollectibleV1.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: Mozilla Public License 2.0 +pragma solidity ^0.8.17; + +import "./BaseToken.sol"; + +contract CollectibleV1 is BaseToken { + constructor( + string memory _name, + string memory _symbol, + uint256 _maxSupply, + bool _remoteBurnable, + bool _transferable, + string memory _baseTokenURI, + address _ownerToken, + address _masterToken + ) + BaseToken(_name, _symbol, _maxSupply, _remoteBurnable, _transferable, _baseTokenURI, _ownerToken, _masterToken) + { } +} diff --git a/contracts/community-tokens/collectibles/Collectibles.go b/contracts/community-tokens/collectibles/Collectibles.go index 95766136d..4f735bc9b 100644 --- a/contracts/community-tokens/collectibles/Collectibles.go +++ b/contracts/community-tokens/collectibles/Collectibles.go @@ -4,6 +4,7 @@ package collectibles import ( + "errors" "math/big" "strings" @@ -17,6 +18,7 @@ import ( // Reference imports to suppress errors if they are not otherwise used. var ( + _ = errors.New _ = big.NewInt _ = strings.NewReader _ = ethereum.NotFound @@ -24,22 +26,34 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) +// CollectiblesMetaData contains all meta data concerning the Collectibles contract. +var CollectiblesMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_remoteBurnable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_transferable\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_ownerToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_masterToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BaseToken_InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_MaxSupplyLowerThanTotalSupply\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotRemoteBurnable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotTransferable\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x6101006040523480156200001257600080fd5b5060405162002d9e38038062002d9e8339810160408190526200003591620001d4565b8787878787878787878760006200004d838262000349565b5060016200005c828262000349565b505050600b86905584151560c05283151560e052600c6200007e848262000349565b506001600160a01b03808316608081905290821660a052158015620000ac575060a0516001600160a01b0316155b15620000cb5760405163e42d451560e01b815260040160405180910390fd5b5050505050505050505050505050505062000415565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200010957600080fd5b81516001600160401b0380821115620001265762000126620000e1565b604051601f8301601f19908116603f01168101908282118183101715620001515762000151620000e1565b816040528381526020925086838588010111156200016e57600080fd5b600091505b8382101562000192578582018301518183018401529082019062000173565b600093810190920192909252949350505050565b80518015158114620001b757600080fd5b919050565b80516001600160a01b0381168114620001b757600080fd5b600080600080600080600080610100898b031215620001f257600080fd5b88516001600160401b03808211156200020a57600080fd5b620002188c838d01620000f7565b995060208b01519150808211156200022f57600080fd5b6200023d8c838d01620000f7565b985060408b015197506200025460608c01620001a6565b96506200026460808c01620001a6565b955060a08b01519150808211156200027b57600080fd5b506200028a8b828c01620000f7565b9350506200029b60c08a01620001bc565b9150620002ab60e08a01620001bc565b90509295985092959890939650565b600181811c90821680620002cf57607f821691505b602082108103620002f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034457600081815260208120601f850160051c810160208610156200031f5750805b601f850160051c820191505b8181101562000340578281556001016200032b565b5050505b505050565b81516001600160401b03811115620003655762000365620000e1565b6200037d81620003768454620002ba565b84620002f6565b602080601f831160018114620003b557600084156200039c5750858301515b600019600386901b1c1916600185901b17855562000340565b600085815260208120601f198616915b82811015620003e657888601518255948401946001909101908401620003c5565b5085821015620004055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516128ed620004b1600039600081816103540152611a6201526000818161023501526109f9015260008181610281015281816108ec0152818161094b01528181610bd601528181610c3501528181610faa01526110090152600081816103070152818161080f0152818161086e01528181610af901528181610b5801528181610ecd0152610f2c01526128ed6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806365371883116100ee578063b88d4fde11610097578063cf721b1511610071578063cf721b15146103ca578063d547cfb7146103d2578063d5abeb01146103da578063e985e9c5146103e357600080fd5b8063b88d4fde14610391578063c87b56dd146103a4578063ce7c8b49146103b757600080fd5b806392ff0d31116100c857806392ff0d311461034f57806395d89b4114610376578063a22cb4651461037e57600080fd5b806365371883146103025780636f8b44b01461032957806370a082311461033c57600080fd5b806323b872dd1161015b57806342842e0e1161013557806342842e0e146102b65780634f6ccce7146102c95780634fb95e02146102dc5780636352211e146102ef57600080fd5b806323b872dd146102695780632bb5e31e1461027c5780632f745c59146102a357600080fd5b8063095ea7b31161018c578063095ea7b31461021b578063101639f51461023057806318160ddd1461025757600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc146101f0575b600080fd5b6101c66101c136600461229b565b61041f565b60405190151581526020015b60405180910390f35b6101e3610430565b6040516101d29190612326565b6102036101fe366004612339565b6104c2565b6040516001600160a01b0390911681526020016101d2565b61022e61022936600461236e565b6104e9565b005b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b6008545b6040519081526020016101d2565b61022e610277366004612398565b61061f565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b61025b6102b136600461236e565b6106a6565b61022e6102c4366004612398565b61074e565b61025b6102d7366004612339565b610769565b61022e6102ea366004612476565b61080d565b6102036102fd366004612339565b610a92565b6102037f000000000000000000000000000000000000000000000000000000000000000081565b61022e610337366004612339565b610af7565b61025b61034a36600461250c565b610d22565b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b6101e3610dbc565b61022e61038c366004612527565b610dcb565b61022e61039f366004612563565b610dd6565b6101e36103b2366004612339565b610e64565b61022e6103c5366004612641565b610ecb565b61025b61110b565b6101e361111b565b61025b600b5481565b6101c66103f13660046126ce565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061042a826111a9565b92915050565b60606000805461043f90612701565b80601f016020809104026020016040519081016040528092919081815260200182805461046b90612701565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b60006104cd826111ff565b506000908152600460205260409020546001600160a01b031690565b60006104f482610a92565b9050806001600160a01b0316836001600160a01b0316036105825760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061059e575061059e81336103f1565b6106105760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610579565b61061a8383611263565b505050565b61062933826112e9565b61069b5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610579565b61061a838383611368565b60006106b183610d22565b82106107255760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610579565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61061a83838360405180602001604052806000815250610dd6565b600061077460085490565b82106107e85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610579565b600882815481106107fb576107fb612754565b90600052602060002001549050919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316158015906108e357506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156108bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e19190612783565b155b80156109c057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316158015906109c057506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be9190612783565b155b156109f7576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000610a4e576040517f98209e6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015610a8e57610a7c828281518110610a6f57610a6f612754565b60200260200101516115d4565b80610a86816127cb565b915050610a51565b5050565b6000818152600260205260408120546001600160a01b03168061042a5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610579565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610bcd57506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcb9190612783565b155b8015610caa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610caa57506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca89190612783565b155b15610ce1576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854811015610d1d576040517fad8783d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b55565b60006001600160a01b038216610da05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610579565b506001600160a01b031660009081526003602052604090205490565b60606001805461043f90612701565b610a8e3383836116ad565b610de033836112e9565b610e525760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610579565b610e5e84848484611799565b50505050565b6060610e6f826111ff565b6000610e79611822565b90506000815111610e995760405180602001604052806000815250610ec4565b80610ea384611831565b604051602001610eb4929190612803565b6040516020818303038152906040525b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615801590610fa157506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610f7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9f9190612783565b155b801561107e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161580159061107e57506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190612783565b155b156110b5576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b548151600a546110c79190612832565b11156110ff576040517f23d6539900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611108816118ef565b50565b6000611116600a5490565b905090565b600c805461112890612701565b80601f016020809104026020016040519081016040528092919081815260200182805461115490612701565b80156111a15780601f10611176576101008083540402835291602001916111a1565b820191906000526020600020905b81548152906001019060200180831161118457829003601f168201915b505050505081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061042a575061042a82611956565b6000818152600260205260409020546001600160a01b03166111085760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610579565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906112b082610a92565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806112f583610a92565b9050806001600160a01b0316846001600160a01b0316148061133c57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806113605750836001600160a01b0316611355846104c2565b6001600160a01b0316145b949350505050565b826001600160a01b031661137b82610a92565b6001600160a01b0316146113f75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610579565b6001600160a01b0382166114725760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610579565b61147f8383836001611a39565b826001600160a01b031661149282610a92565b6001600160a01b03161461150e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610579565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b038781168086526003855283862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006115df82610a92565b90506115ef816000846001611a39565b6115f882610a92565b600083815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b0385168085526003845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b03160361170e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610579565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117a4848484611368565b6117b084848484611ac6565b610e5e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610579565b6060600c805461043f90612701565b6060600061183e83611c85565b600101905060008167ffffffffffffffff81111561185e5761185e6123d4565b6040519080825280601f01601f191660200182016040528015611888576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461189257509392505050565b60005b8151811015610a8e5761193682828151811061191057611910612754565b6020026020010151611921600a5490565b60405180602001604052806000815250611d67565b611944600a80546001019055565b8061194e816127cb565b9150506118f2565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806119e957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061042a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461042a565b6001600160a01b03841615801590611a5957506001600160a01b03831615155b8015611a8357507f0000000000000000000000000000000000000000000000000000000000000000155b15611aba576040517f6b2b9e5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e5e84848484611df0565b60006001600160a01b0384163b15611c7a576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611b23903390899088908890600401612845565b6020604051808303816000875af1925050508015611b7c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611b7991810190612881565b60015b611c2f573d808015611baa576040519150601f19603f3d011682016040523d82523d6000602084013e611baf565b606091505b508051600003611c275760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610579565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611360565b506001949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611cce577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611cfa576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611d1857662386f26fc10000830492506010015b6305f5e1008310611d30576305f5e100830492506008015b6127108310611d4457612710830492506004015b60648310611d56576064830492506002015b600a831061042a5760010192915050565b611d718383611f2c565b611d7e6000848484611ac6565b61061a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610579565b6001811115611e675760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f7274656400000000000000000000006064820152608401610579565b816001600160a01b038516611ec357611ebe81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ee6565b836001600160a01b0316856001600160a01b031614611ee657611ee685826120dd565b6001600160a01b038416611f0257611efd8161217a565b611f25565b846001600160a01b0316846001600160a01b031614611f2557611f258482612229565b5050505050565b6001600160a01b038216611f825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610579565b6000818152600260205260409020546001600160a01b031615611fe75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610579565b611ff5600083836001611a39565b6000818152600260205260409020546001600160a01b03161561205a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610579565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016120ea84610d22565b6120f4919061289e565b600083815260076020526040902054909150808214612147576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061218c9060019061289e565b600083815260096020526040812054600880549394509092849081106121b4576121b4612754565b9060005260206000200154905080600883815481106121d5576121d5612754565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061220d5761220d6128b1565b6001900381819060005260206000200160009055905550505050565b600061223483610d22565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461110857600080fd5b6000602082840312156122ad57600080fd5b8135610ec48161226d565b60005b838110156122d35781810151838201526020016122bb565b50506000910152565b600081518084526122f48160208601602086016122b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ec460208301846122dc565b60006020828403121561234b57600080fd5b5035919050565b80356001600160a01b038116811461236957600080fd5b919050565b6000806040838503121561238157600080fd5b61238a83612352565b946020939093013593505050565b6000806000606084860312156123ad57600080fd5b6123b684612352565b92506123c460208501612352565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561244a5761244a6123d4565b604052919050565b600067ffffffffffffffff82111561246c5761246c6123d4565b5060051b60200190565b6000602080838503121561248957600080fd5b823567ffffffffffffffff8111156124a057600080fd5b8301601f810185136124b157600080fd5b80356124c46124bf82612452565b612403565b81815260059190911b820183019083810190878311156124e357600080fd5b928401925b82841015612501578335825292840192908401906124e8565b979650505050505050565b60006020828403121561251e57600080fd5b610ec482612352565b6000806040838503121561253a57600080fd5b61254383612352565b91506020830135801515811461255857600080fd5b809150509250929050565b6000806000806080858703121561257957600080fd5b61258285612352565b93506020612591818701612352565b935060408601359250606086013567ffffffffffffffff808211156125b557600080fd5b818801915088601f8301126125c957600080fd5b8135818111156125db576125db6123d4565b61260b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612403565b9150808252898482850101111561262157600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000602080838503121561265457600080fd5b823567ffffffffffffffff81111561266b57600080fd5b8301601f8101851361267c57600080fd5b803561268a6124bf82612452565b81815260059190911b820183019083810190878311156126a957600080fd5b928401925b82841015612501576126bf84612352565b825292840192908401906126ae565b600080604083850312156126e157600080fd5b6126ea83612352565b91506126f860208401612352565b90509250929050565b600181811c9082168061271557607f821691505b60208210810361274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561279557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127fc576127fc61279c565b5060010190565b600083516128158184602088016122b8565b8351908301906128298183602088016122b8565b01949350505050565b8082018082111561042a5761042a61279c565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261287760808301846122dc565b9695505050505050565b60006020828403121561289357600080fd5b8151610ec48161226d565b8181038181111561042a5761042a61279c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000811000a", +} + // CollectiblesABI is the input ABI used to generate the binding from. -const CollectiblesABI = "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_remoteBurnable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_transferable\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_ownerToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_masterToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" +// Deprecated: Use CollectiblesMetaData.ABI instead. +var CollectiblesABI = CollectiblesMetaData.ABI // CollectiblesBin is the compiled bytecode used for deploying new contracts. -var CollectiblesBin = "0x60806040523480156200001157600080fd5b50604051620026a1380380620026a183398101604081905262000034916200023b565b8787878787878787878760006200004c8382620003b0565b5060016200005b8282620003b0565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009a8482620003b0565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055151580620000e15750600d546001600160a01b031615155b620001325760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206f72206d617374657220746f6b656e7320726571756972656400604482015260640160405180910390fd5b505050505050505050505050505050506200047c565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200017057600080fd5b81516001600160401b03808211156200018d576200018d62000148565b604051601f8301601f19908116603f01168101908282118183101715620001b857620001b862000148565b81604052838152602092508683858801011115620001d557600080fd5b600091505b83821015620001f95785820183015181830184015290820190620001da565b600093810190920192909252949350505050565b805180151581146200021e57600080fd5b919050565b80516001600160a01b03811681146200021e57600080fd5b600080600080600080600080610100898b0312156200025957600080fd5b88516001600160401b03808211156200027157600080fd5b6200027f8c838d016200015e565b995060208b01519150808211156200029657600080fd5b620002a48c838d016200015e565b985060408b01519750620002bb60608c016200020d565b9650620002cb60808c016200020d565b955060a08b0151915080821115620002e257600080fd5b50620002f18b828c016200015e565b9350506200030260c08a0162000223565b91506200031260e08a0162000223565b90509295985092959890939650565b600181811c908216806200033657607f821691505b6020821081036200035757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003ab57600081815260208120601f850160051c81016020861015620003865750805b601f850160051c820191505b81811015620003a75782815560010162000392565b5050505b505050565b81516001600160401b03811115620003cc57620003cc62000148565b620003e481620003dd845462000321565b846200035d565b602080601f8311600181146200041c5760008415620004035750858301515b600019600386901b1c1916600185901b178555620003a7565b600085815260208120601f198616915b828110156200044d578886015182559484019460019091019084016200042c565b50858210156200046c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612215806200048c6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806365371883116100de578063b88d4fde11610097578063cf721b1511610071578063cf721b151461035c578063d547cfb714610364578063d5abeb011461036c578063e985e9c51461037557600080fd5b8063b88d4fde14610323578063c87b56dd14610336578063ce7c8b491461034957600080fd5b806365371883146102bb5780636f8b44b0146102ce57806370a08231146102e157806392ff0d31146102f457806395d89b4114610308578063a22cb4651461031057600080fd5b806323b872dd1161014b57806342842e0e1161012557806342842e0e1461026f5780634f6ccce7146102825780634fb95e02146102955780636352211e146102a857600080fd5b806323b872dd146102365780632bb5e31e146102495780632f745c591461025c57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb578063101639f51461021057806318160ddd14610224575b600080fd5b6101a66101a1366004611b83565b6103b1565b60405190151581526020015b60405180910390f35b6101c36103c2565b6040516101b29190611bf0565b6101e36101de366004611c03565b610454565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004611c38565b61047b565b005b600d546101a690600160a01b900460ff1681565b6008545b6040519081526020016101b2565b61020e610244366004611c62565b610595565b600d546101e3906001600160a01b031681565b61022861026a366004611c38565b6105c6565b61020e61027d366004611c62565b61065c565b610228610290366004611c03565b610677565b61020e6102a3366004611d09565b61070a565b6101e36102b6366004611c03565b6108c3565b600c546101e3906001600160a01b031681565b61020e6102dc366004611c03565b610923565b6102286102ef366004611d9f565b610aab565b600d546101a690600160a81b900460ff1681565b6101c3610b31565b61020e61031e366004611dba565b610b40565b61020e610331366004611df6565b610b4b565b6101c3610344366004611c03565b610b83565b61020e610357366004611eb6565b610bea565b610228610d71565b6101c3610d81565b610228600b5481565b6101a6610383366004611f43565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006103bc82610e0f565b92915050565b6060600080546103d190611f76565b80601f01602080910402602001604051908101604052809291908181526020018280546103fd90611f76565b801561044a5780601f1061041f5761010080835404028352916020019161044a565b820191906000526020600020905b81548152906001019060200180831161042d57829003601f168201915b5050505050905090565b600061045f82610e34565b506000908152600460205260409020546001600160a01b031690565b6000610486826108c3565b9050806001600160a01b0316836001600160a01b0316036104f85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061051457506105148133610383565b6105865760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ef565b6105908383610e93565b505050565b61059f3382610f01565b6105bb5760405162461bcd60e51b81526004016104ef90611fb0565b610590838383610f80565b60006105d183610aab565b82106106335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104ef565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61059083838360405180602001604052806000815250610b4b565b600061068260085490565b82106106e55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104ef565b600882815481106106f8576106f8611ffd565b90600052602060002001549050919050565b600c546001600160a01b0316158061078c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078a9190612013565b115b806108145750600d546001600160a01b031615806108145750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190612013565b115b6108305760405162461bcd60e51b81526004016104ef9061202c565b600d54600160a01b900460ff1661087f5760405162461bcd60e51b81526020600482015260136024820152724e4f545f52454d4f54455f4255524e41424c4560681b60448201526064016104ef565b60005b81518110156108bf576108ad8282815181106108a0576108a0611ffd565b60200260200101516110f1565b806108b78161206a565b915050610882565b5050565b6000818152600260205260408120546001600160a01b0316806103bc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600c546001600160a01b031615806109a55750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190612013565b115b80610a2d5750600d546001600160a01b03161580610a2d5750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2b9190612013565b115b610a495760405162461bcd60e51b81526004016104ef9061202c565b600854811015610aa65760405162461bcd60e51b815260206004820152602260248201527f4d41585f535550504c595f4c4f5745525f5448414e5f544f54414c5f535550506044820152614c5960f01b60648201526084016104ef565b600b55565b60006001600160a01b038216610b155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ef565b506001600160a01b031660009081526003602052604090205490565b6060600180546103d190611f76565b6108bf338383611194565b610b553383610f01565b610b715760405162461bcd60e51b81526004016104ef90611fb0565b610b7d84848484611262565b50505050565b6060610b8e82610e34565b6000610b98611295565b90506000815111610bb85760405180602001604052806000815250610be3565b80610bc2846112a4565b604051602001610bd3929190612083565b6040516020818303038152906040525b9392505050565b600c546001600160a01b03161580610c6c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190612013565b115b80610cf45750600d546001600160a01b03161580610cf45750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190612013565b115b610d105760405162461bcd60e51b81526004016104ef9061202c565b600b548151600a54610d2291906120b2565b1115610d655760405162461bcd60e51b815260206004820152601260248201527113505617d4d55414131657d4915050d2115160721b60448201526064016104ef565b610d6e81611337565b50565b6000610d7c600a5490565b905090565b600e8054610d8e90611f76565b80601f0160208091040260200160405190810160405280929190818152602001828054610dba90611f76565b8015610e075780601f10610ddc57610100808354040283529160200191610e07565b820191906000526020600020905b815481529060010190602001808311610dea57829003601f168201915b505050505081565b60006001600160e01b0319821663780e9d6360e01b14806103bc57506103bc8261139e565b6000818152600260205260409020546001600160a01b0316610d6e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ec8826108c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f0d836108c3565b9050806001600160a01b0316846001600160a01b03161480610f5457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610f785750836001600160a01b0316610f6d84610454565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f93826108c3565b6001600160a01b031614610fb95760405162461bcd60e51b81526004016104ef906120c5565b6001600160a01b03821661101b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ef565b61102883838360016113ee565b826001600160a01b031661103b826108c3565b6001600160a01b0316146110615760405162461bcd60e51b81526004016104ef906120c5565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110fc826108c3565b905061110c8160008460016113ee565b611115826108c3565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104ef565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61126d848484610f80565b61127984848484611470565b610b7d5760405162461bcd60e51b81526004016104ef9061210a565b6060600e80546103d190611f76565b606060006112b183611571565b600101905060008167ffffffffffffffff8111156112d1576112d1611c9e565b6040519080825280601f01601f1916602001820160405280156112fb576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461130557509392505050565b60005b81518110156108bf5761137e82828151811061135857611358611ffd565b6020026020010151611369600a5490565b60405180602001604052806000815250611649565b61138c600a80546001019055565b806113968161206a565b91505061133a565b60006001600160e01b031982166380ac58cd60e01b14806113cf57506001600160e01b03198216635b5e139f60e01b145b806103bc57506301ffc9a760e01b6001600160e01b03198316146103bc565b6001600160a01b0384161580159061140e57506001600160a01b03831615155b80156114245750600d54600160a81b900460ff16155b156114645760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b60448201526064016104ef565b610b7d8484848461167c565b60006001600160a01b0384163b1561156657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114b490339089908890889060040161215c565b6020604051808303816000875af19250505080156114ef575060408051601f3d908101601f191682019092526114ec91810190612199565b60015b61154c573d80801561151d576040519150601f19603f3d011682016040523d82523d6000602084013e611522565b606091505b5080516000036115445760405162461bcd60e51b81526004016104ef9061210a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f78565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106115b05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106115dc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106115fa57662386f26fc10000830492506010015b6305f5e1008310611612576305f5e100830492506008015b612710831061162657612710830492506004015b60648310611638576064830492506002015b600a83106103bc5760010192915050565b61165383836117bc565b6116606000848484611470565b6105905760405162461bcd60e51b81526004016104ef9061210a565b61168884848484611955565b60018111156116f75760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016104ef565b816001600160a01b0385166117535761174e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611776565b836001600160a01b0316856001600160a01b0316146117765761177685826119dd565b6001600160a01b0384166117925761178d81611a7a565b6117b5565b846001600160a01b0316846001600160a01b0316146117b5576117b58482611b29565b5050505050565b6001600160a01b0382166118125760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ef565b6000818152600260205260409020546001600160a01b0316156118775760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6118856000838360016113ee565b6000818152600260205260409020546001600160a01b0316156118ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001811115610b7d576001600160a01b0384161561199b576001600160a01b038416600090815260036020526040812080548392906119959084906121b6565b90915550505b6001600160a01b03831615610b7d576001600160a01b038316600090815260036020526040812080548392906119d29084906120b2565b909155505050505050565b600060016119ea84610aab565b6119f491906121b6565b600083815260076020526040902054909150808214611a47576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611a8c906001906121b6565b60008381526009602052604081205460088054939450909284908110611ab457611ab4611ffd565b906000526020600020015490508060088381548110611ad557611ad5611ffd565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b0d57611b0d6121c9565b6001900381819060005260206000200160009055905550505050565b6000611b3483610aab565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610d6e57600080fd5b600060208284031215611b9557600080fd5b8135610be381611b6d565b60005b83811015611bbb578181015183820152602001611ba3565b50506000910152565b60008151808452611bdc816020860160208601611ba0565b601f01601f19169290920160200192915050565b602081526000610be36020830184611bc4565b600060208284031215611c1557600080fd5b5035919050565b80356001600160a01b0381168114611c3357600080fd5b919050565b60008060408385031215611c4b57600080fd5b611c5483611c1c565b946020939093013593505050565b600080600060608486031215611c7757600080fd5b611c8084611c1c565b9250611c8e60208501611c1c565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611cdd57611cdd611c9e565b604052919050565b600067ffffffffffffffff821115611cff57611cff611c9e565b5060051b60200190565b60006020808385031215611d1c57600080fd5b823567ffffffffffffffff811115611d3357600080fd5b8301601f81018513611d4457600080fd5b8035611d57611d5282611ce5565b611cb4565b81815260059190911b82018301908381019087831115611d7657600080fd5b928401925b82841015611d9457833582529284019290840190611d7b565b979650505050505050565b600060208284031215611db157600080fd5b610be382611c1c565b60008060408385031215611dcd57600080fd5b611dd683611c1c565b915060208301358015158114611deb57600080fd5b809150509250929050565b60008060008060808587031215611e0c57600080fd5b611e1585611c1c565b93506020611e24818701611c1c565b935060408601359250606086013567ffffffffffffffff80821115611e4857600080fd5b818801915088601f830112611e5c57600080fd5b813581811115611e6e57611e6e611c9e565b611e80601f8201601f19168501611cb4565b91508082528984828501011115611e9657600080fd5b808484018584013760008482840101525080935050505092959194509250565b60006020808385031215611ec957600080fd5b823567ffffffffffffffff811115611ee057600080fd5b8301601f81018513611ef157600080fd5b8035611eff611d5282611ce5565b81815260059190911b82018301908381019087831115611f1e57600080fd5b928401925b82841015611d9457611f3484611c1c565b82529284019290840190611f23565b60008060408385031215611f5657600080fd5b611f5f83611c1c565b9150611f6d60208401611c1c565b90509250929050565b600181811c90821680611f8a57607f821691505b602082108103611faa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561202557600080fd5b5051919050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161207c5761207c612054565b5060010190565b60008351612095818460208801611ba0565b8351908301906120a9818360208801611ba0565b01949350505050565b808201808211156103bc576103bc612054565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061218f90830184611bc4565b9695505050505050565b6000602082840312156121ab57600080fd5b8151610be381611b6d565b818103818111156103bc576103bc612054565b634e487b7160e01b600052603160045260246000fdfea264697066735822122086a4861cc4cd7011cfd13ba461d6fc5087ae7a6d4798fad1c6352203bccf0a4d64736f6c63430008110033" +// Deprecated: Use CollectiblesMetaData.Bin instead. +var CollectiblesBin = CollectiblesMetaData.Bin // DeployCollectibles deploys a new Ethereum contract, binding an instance of Collectibles to it. func DeployCollectibles(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _maxSupply *big.Int, _remoteBurnable bool, _transferable bool, _baseTokenURI string, _ownerToken common.Address, _masterToken common.Address) (common.Address, *types.Transaction, *Collectibles, error) { - parsed, err := abi.JSON(strings.NewReader(CollectiblesABI)) + parsed, err := CollectiblesMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(CollectiblesBin), backend, _name, _symbol, _maxSupply, _remoteBurnable, _transferable, _baseTokenURI, _ownerToken, _masterToken) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CollectiblesBin), backend, _name, _symbol, _maxSupply, _remoteBurnable, _transferable, _baseTokenURI, _ownerToken, _masterToken) if err != nil { return common.Address{}, nil, nil, err } @@ -143,11 +157,11 @@ func NewCollectiblesFilterer(address common.Address, filterer bind.ContractFilte // bindCollectibles binds a generic wrapper to an already deployed contract. func bindCollectibles(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(CollectiblesABI)) + parsed, err := CollectiblesMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and diff --git a/contracts/community-tokens/deployer/CommunityTokenDeployer.go b/contracts/community-tokens/deployer/CommunityTokenDeployer.go new file mode 100644 index 000000000..0f94f4e90 --- /dev/null +++ b/contracts/community-tokens/deployer/CommunityTokenDeployer.go @@ -0,0 +1,1812 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package communitytokendeployer + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// CommunityTokenDeployerDeploymentSignature is an auto generated low-level Go binding around an user-defined struct. +type CommunityTokenDeployerDeploymentSignature struct { + Signer common.Address + Deployer common.Address + V uint8 + R [32]byte + S [32]byte +} + +// CommunityTokenDeployerTokenConfig is an auto generated low-level Go binding around an user-defined struct. +type CommunityTokenDeployerTokenConfig struct { + Name string + Symbol string + BaseURI string +} + +// CommunityTokenDeployerMetaData contains all meta data concerning the CommunityTokenDeployer contract. +var CommunityTokenDeployerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_ownerTokenFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_masterTokenFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_AlreadyDeployed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_EqualFactoryAddresses\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidDeployerAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidDeploymentRegistryAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidDeploymentSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidSignerKeyOrCommunityAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidTokenFactoryAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityTokenDeployer_InvalidTokenMetadata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"DeployMasterToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"DeployOwnerToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"DeploymentRegistryAddressChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"MasterTokenFactoryAddressChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"OwnerTokenFactoryAddressChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPLOYMENT_SIGNATURE_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"}],\"internalType\":\"structCommunityTokenDeployer.TokenConfig\",\"name\":\"_ownerToken\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"}],\"internalType\":\"structCommunityTokenDeployer.TokenConfig\",\"name\":\"_masterToken\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"structCommunityTokenDeployer.DeploymentSignature\",\"name\":\"_signature\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_signerPublicKey\",\"type\":\"bytes\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deploymentRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterTokenFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerTokenFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_deploymentRegistry\",\"type\":\"address\"}],\"name\":\"setDeploymentRegistryAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterTokenFactory\",\"type\":\"address\"}],\"name\":\"setMasterTokenFactoryAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ownerTokenFactory\",\"type\":\"address\"}],\"name\":\"setOwnerTokenFactoryAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101606040523480156200001257600080fd5b50604051620020df380380620020df833981016040819052620000359162000372565b6040518060400160405280601681526020017f436f6d6d756e697479546f6b656e4465706c6f79657200000000000000000000815250604051806040016040528060018152602001603160f81b815250620000a06000836200023a60201b62000c0e1790919060201c565b61012052620000bd8160016200023a602090811b62000c0e17901c565b61014052815160208084019190912060e052815190820120610100524660a0526200014b60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526200015f336200028a565b6001600160a01b03831662000187576040516333a066b160e11b815260040160405180910390fd5b6001600160a01b0382161580620001a557506001600160a01b038116155b15620001c457604051633b901c6960e11b815260040160405180910390fd5b806001600160a01b0316826001600160a01b031603620001f757604051631b08426360e11b815260040160405180910390fd5b600480546001600160a01b039485166001600160a01b031991821617909155600580549385169382169390931790925560068054919093169116179055620005a2565b60006020835110156200025a576200025283620002b4565b905062000284565b8262000271836200030060201b62000c411760201c565b906200027e908262000461565b5060ff90505b92915050565b600380546001600160a01b0319169055620002b18162000303602090811b62000c4417901c565b50565b600080829050601f81511115620002eb578260405163305a27a960e01b8152600401620002e291906200052d565b60405180910390fd5b8051620002f8826200057d565b179392505050565b90565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200036d57600080fd5b919050565b6000806000606084860312156200038857600080fd5b620003938462000355565b9250620003a36020850162000355565b9150620003b36040850162000355565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003e757607f821691505b6020821081036200040857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045c57600081815260208120601f850160051c81016020861015620004375750805b601f850160051c820191505b81811015620004585782815560010162000443565b5050505b505050565b81516001600160401b038111156200047d576200047d620003bc565b62000495816200048e8454620003d2565b846200040e565b602080601f831160018114620004cd5760008415620004b45750858301515b600019600386901b1c1916600185901b17855562000458565b600085815260208120601f198616915b82811015620004fe57888601518255948401946001909101908401620004dd565b50858210156200051d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b818110156200055c578581018301518582016040015282016200053e565b506000604082860101526040601f19601f8301168501019250505092915050565b80516020808301519190811015620004085760001960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051611ae2620005fd60003960006103cb015260006103a101526000610da201526000610d7a01526000610cd501526000610cff01526000610d290152611ae26000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80639ff02d1811610097578063c663109211610066578063c663109214610252578063e30c397814610272578063f2fde38b14610290578063f8851475146102a357600080fd5b80639ff02d18146101c5578063a53b2bdb146101d8578063a825483c146101eb578063b0f95f281461021257600080fd5b806379ba5097116100d357806379ba509714610164578063830c26261461016c57806384b0196e1461018c5780638da5cb5b146101a757600080fd5b80633644e515146100fa57806362457f5914610115578063715018a61461015a575b600080fd5b6101026102b6565b6040519081526020015b60405180910390f35b6005546101359073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010c565b6101626102c5565b005b6101626102d9565b6006546101359073ffffffffffffffffffffffffffffffffffffffff1681565b610194610393565b60405161010c979695949392919061148a565b60025473ffffffffffffffffffffffffffffffffffffffff16610135565b6101626101d336600461156b565b610437565b6101626101e636600461156b565b6104fb565b6101027fdd91c30357aafeb2792b5f0facbd83995943c1ea113a906ebbeb58bfeb27dfc281565b6102256102203660046115d6565b6105bf565b6040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301520161010c565b6004546101359073ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff16610135565b61016261029e36600461156b565b610a9a565b6101626102b136600461156b565b610b4a565b60006102c0610cbb565b905090565b6102cd610df3565b6102d76000610e74565b565b600354339073ffffffffffffffffffffffffffffffffffffffff168114610387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61039081610e74565b50565b6000606080828080836103c67f000000000000000000000000000000000000000000000000000000000000000083610ea5565b6103f17f00000000000000000000000000000000000000000000000000000000000000006001610ea5565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b61043f610df3565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f772038d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f17ae1257210039eb267be68929104e6c28fc9ebb9dc6aaa84be39b45eb6f376790600090a250565b610503610df3565b73ffffffffffffffffffffffffffffffffffffffff8116610550576040517f772038d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f184513c31b135bda32c81b8586d52ad5bdbc7b7e4ec5847eee48374ee07e8e4890600090a250565b600080806105d0602086018661156b565b73ffffffffffffffffffffffffffffffffffffffff1614806105f157508251155b15610628576040517fb5709c7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33610639604086016020870161156b565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f3137f20700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045460009073ffffffffffffffffffffffffffffffffffffffff16637db6a4e46106b4602088018861156b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016020604051808303816000875af115801561071f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610743919061172b565b73ffffffffffffffffffffffffffffffffffffffff1614610790576040517f1f58274700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61079984610f49565b6107cf576040517f18f68bed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460009073ffffffffffffffffffffffffffffffffffffffff1663cc3c79756107fa8980611748565b61080760208c018c611748565b61081460408e018e611748565b338c6040518963ffffffff1660e01b81526004016108399897969594939291906117fd565b6020604051808303816000875af1158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c919061172b565b60405190915073ffffffffffffffffffffffffffffffffffffffff8216907f6f60871ce1ae7c2bc82a9fca785cdf029fa7c9984afe96eaa106d1b7b19c632290600090a260065460009073ffffffffffffffffffffffffffffffffffffffff1663cc3c79756108eb8980611748565b6108f860208c018c611748565b61090560408e018e611748565b604080516020810182526000815290517fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b168152610952979695949392918c916004016117fd565b6020604051808303816000875af1158015610971573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610995919061172b565b60405190915073ffffffffffffffffffffffffffffffffffffffff8216907f1464afef6e77413c9c3201405b55530340d684e2a19f3a9d83bc604d4aa3a25590600090a260045473ffffffffffffffffffffffffffffffffffffffff1663a7a95840610a04602089018961156b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529085166024820152604401600060405180830381600087803b158015610a7257600080fd5b505af1158015610a86573d6000803e3d6000fd5b509395509193505050505b94509492505050565b610aa2610df3565b6003805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0560025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610b52610df3565b73ffffffffffffffffffffffffffffffffffffffff8116610b9f576040517f6740cd6200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f8f3be421db34ad7dfa5c7fb9391b363b444007c7b26f0a22c58aad6e130b935e90600090a250565b6000602083511015610c2a57610c2383611040565b9050610c3b565b81610c358482611914565b5060ff90505b92915050565b90565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60003073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015610d2157507f000000000000000000000000000000000000000000000000000000000000000046145b15610d4b57507f000000000000000000000000000000000000000000000000000000000000000090565b6102c0604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60025473ffffffffffffffffffffffffffffffffffffffff1633146102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161037e565b600380547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561039081610c44565b606060ff8314610eb857610c2383611097565b818054610ec490611878565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef090611878565b8015610f3d5780601f10610f1257610100808354040283529160200191610f3d565b820191906000526020600020905b815481529060010190602001808311610f2057829003601f168201915b50505050509050610c3b565b600080610fd97fdd91c30357aafeb2792b5f0facbd83995943c1ea113a906ebbeb58bfeb27dfc2610f7d602086018661156b565b610f8d604087016020880161156b565b60408051602081019490945273ffffffffffffffffffffffffffffffffffffffff92831690840152166060820152608001604051602081830303815290604052805190602001206110d6565b9050610fff610fee6060850160408601611a2e565b82906060860135608087013561111e565b73ffffffffffffffffffffffffffffffffffffffff16611022602085018561156b565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b600080829050601f8151111561108457826040517f305a27a900000000000000000000000000000000000000000000000000000000815260040161037e9190611a51565b805161108f82611a64565b179392505050565b606060006110a483611146565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000610c3b6110e3610cbb565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b600080600061112f87878787611187565b9150915061113c81611273565b5095945050505050565b600060ff8216601f811115610c3b576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156111be5750600090506003610a91565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611212573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661126657600060019250925050610a91565b9660009650945050505050565b600081600481111561128757611287611aa6565b0361128f5750565b60018160048111156112a3576112a3611aa6565b0361130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161037e565b600281600481111561131e5761131e611aa6565b03611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161037e565b600381600481111561139957611399611aa6565b03610390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161037e565b6000815180845260005b8181101561144c57602081850181015186830182015201611430565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e0818401526114c660e084018a611426565b83810360408501526114d8818a611426565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156115375783518352928401929184019160010161151b565b50909c9b505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b60006020828403121561157d57600080fd5b813561158881611549565b9392505050565b6000606082840312156115a157600080fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000808486036101008112156115ee57600080fd5b853567ffffffffffffffff8082111561160657600080fd5b61161289838a0161158f565b9650602088013591508082111561162857600080fd5b61163489838a0161158f565b955060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561166657600080fd5b60408801945060e088013592508083111561168057600080fd5b828801925088601f84011261169457600080fd5b82359150808211156116a8576116a86115a7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156116ee576116ee6115a7565b816040528381528a602085870101111561170757600080fd5b83602086016020830137600060208583010152809550505050505092959194509250565b60006020828403121561173d57600080fd5b815161158881611549565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261177d57600080fd5b83018035915067ffffffffffffffff82111561179857600080fd5b6020019150368190038213156117ad57600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60a08152600061181160a083018a8c6117b4565b828103602084015261182481898b6117b4565b905082810360408401526118398187896117b4565b905073ffffffffffffffffffffffffffffffffffffffff8516606084015282810360808401526118698185611426565b9b9a5050505050505050505050565b600181811c9082168061188c57607f821691505b6020821081036115a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f82111561190f57600081815260208120601f850160051c810160208610156118ec5750805b601f850160051c820191505b8181101561190b578281556001016118f8565b5050505b505050565b815167ffffffffffffffff81111561192e5761192e6115a7565b6119428161193c8454611878565b846118c5565b602080601f831160018114611995576000841561195f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561190b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156119e2578886015182559484019460019091019084016119c3565b5085821015611a1e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215611a4057600080fd5b813560ff8116811461158857600080fd5b6020815260006115886020830184611426565b805160208083015191908110156115a1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000811000a", +} + +// CommunityTokenDeployerABI is the input ABI used to generate the binding from. +// Deprecated: Use CommunityTokenDeployerMetaData.ABI instead. +var CommunityTokenDeployerABI = CommunityTokenDeployerMetaData.ABI + +// CommunityTokenDeployerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use CommunityTokenDeployerMetaData.Bin instead. +var CommunityTokenDeployerBin = CommunityTokenDeployerMetaData.Bin + +// DeployCommunityTokenDeployer deploys a new Ethereum contract, binding an instance of CommunityTokenDeployer to it. +func DeployCommunityTokenDeployer(auth *bind.TransactOpts, backend bind.ContractBackend, _registry common.Address, _ownerTokenFactory common.Address, _masterTokenFactory common.Address) (common.Address, *types.Transaction, *CommunityTokenDeployer, error) { + parsed, err := CommunityTokenDeployerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CommunityTokenDeployerBin), backend, _registry, _ownerTokenFactory, _masterTokenFactory) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CommunityTokenDeployer{CommunityTokenDeployerCaller: CommunityTokenDeployerCaller{contract: contract}, CommunityTokenDeployerTransactor: CommunityTokenDeployerTransactor{contract: contract}, CommunityTokenDeployerFilterer: CommunityTokenDeployerFilterer{contract: contract}}, nil +} + +// CommunityTokenDeployer is an auto generated Go binding around an Ethereum contract. +type CommunityTokenDeployer struct { + CommunityTokenDeployerCaller // Read-only binding to the contract + CommunityTokenDeployerTransactor // Write-only binding to the contract + CommunityTokenDeployerFilterer // Log filterer for contract events +} + +// CommunityTokenDeployerCaller is an auto generated read-only Go binding around an Ethereum contract. +type CommunityTokenDeployerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityTokenDeployerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CommunityTokenDeployerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityTokenDeployerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CommunityTokenDeployerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityTokenDeployerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CommunityTokenDeployerSession struct { + Contract *CommunityTokenDeployer // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommunityTokenDeployerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CommunityTokenDeployerCallerSession struct { + Contract *CommunityTokenDeployerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CommunityTokenDeployerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CommunityTokenDeployerTransactorSession struct { + Contract *CommunityTokenDeployerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommunityTokenDeployerRaw is an auto generated low-level Go binding around an Ethereum contract. +type CommunityTokenDeployerRaw struct { + Contract *CommunityTokenDeployer // Generic contract binding to access the raw methods on +} + +// CommunityTokenDeployerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CommunityTokenDeployerCallerRaw struct { + Contract *CommunityTokenDeployerCaller // Generic read-only contract binding to access the raw methods on +} + +// CommunityTokenDeployerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CommunityTokenDeployerTransactorRaw struct { + Contract *CommunityTokenDeployerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCommunityTokenDeployer creates a new instance of CommunityTokenDeployer, bound to a specific deployed contract. +func NewCommunityTokenDeployer(address common.Address, backend bind.ContractBackend) (*CommunityTokenDeployer, error) { + contract, err := bindCommunityTokenDeployer(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CommunityTokenDeployer{CommunityTokenDeployerCaller: CommunityTokenDeployerCaller{contract: contract}, CommunityTokenDeployerTransactor: CommunityTokenDeployerTransactor{contract: contract}, CommunityTokenDeployerFilterer: CommunityTokenDeployerFilterer{contract: contract}}, nil +} + +// NewCommunityTokenDeployerCaller creates a new read-only instance of CommunityTokenDeployer, bound to a specific deployed contract. +func NewCommunityTokenDeployerCaller(address common.Address, caller bind.ContractCaller) (*CommunityTokenDeployerCaller, error) { + contract, err := bindCommunityTokenDeployer(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerCaller{contract: contract}, nil +} + +// NewCommunityTokenDeployerTransactor creates a new write-only instance of CommunityTokenDeployer, bound to a specific deployed contract. +func NewCommunityTokenDeployerTransactor(address common.Address, transactor bind.ContractTransactor) (*CommunityTokenDeployerTransactor, error) { + contract, err := bindCommunityTokenDeployer(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerTransactor{contract: contract}, nil +} + +// NewCommunityTokenDeployerFilterer creates a new log filterer instance of CommunityTokenDeployer, bound to a specific deployed contract. +func NewCommunityTokenDeployerFilterer(address common.Address, filterer bind.ContractFilterer) (*CommunityTokenDeployerFilterer, error) { + contract, err := bindCommunityTokenDeployer(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerFilterer{contract: contract}, nil +} + +// bindCommunityTokenDeployer binds a generic wrapper to an already deployed contract. +func bindCommunityTokenDeployer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CommunityTokenDeployerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CommunityTokenDeployer *CommunityTokenDeployerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CommunityTokenDeployer.Contract.CommunityTokenDeployerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CommunityTokenDeployer *CommunityTokenDeployerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.CommunityTokenDeployerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CommunityTokenDeployer *CommunityTokenDeployerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.CommunityTokenDeployerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CommunityTokenDeployer.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.contract.Transact(opts, method, params...) +} + +// DEPLOYMENTSIGNATURETYPEHASH is a free data retrieval call binding the contract method 0xa825483c. +// +// Solidity: function DEPLOYMENT_SIGNATURE_TYPEHASH() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) DEPLOYMENTSIGNATURETYPEHASH(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "DEPLOYMENT_SIGNATURE_TYPEHASH") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DEPLOYMENTSIGNATURETYPEHASH is a free data retrieval call binding the contract method 0xa825483c. +// +// Solidity: function DEPLOYMENT_SIGNATURE_TYPEHASH() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) DEPLOYMENTSIGNATURETYPEHASH() ([32]byte, error) { + return _CommunityTokenDeployer.Contract.DEPLOYMENTSIGNATURETYPEHASH(&_CommunityTokenDeployer.CallOpts) +} + +// DEPLOYMENTSIGNATURETYPEHASH is a free data retrieval call binding the contract method 0xa825483c. +// +// Solidity: function DEPLOYMENT_SIGNATURE_TYPEHASH() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) DEPLOYMENTSIGNATURETYPEHASH() ([32]byte, error) { + return _CommunityTokenDeployer.Contract.DEPLOYMENTSIGNATURETYPEHASH(&_CommunityTokenDeployer.CallOpts) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "DOMAIN_SEPARATOR") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) DOMAINSEPARATOR() ([32]byte, error) { + return _CommunityTokenDeployer.Contract.DOMAINSEPARATOR(&_CommunityTokenDeployer.CallOpts) +} + +// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515. +// +// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) DOMAINSEPARATOR() ([32]byte, error) { + return _CommunityTokenDeployer.Contract.DOMAINSEPARATOR(&_CommunityTokenDeployer.CallOpts) +} + +// DeploymentRegistry is a free data retrieval call binding the contract method 0xc6631092. +// +// Solidity: function deploymentRegistry() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) DeploymentRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "deploymentRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DeploymentRegistry is a free data retrieval call binding the contract method 0xc6631092. +// +// Solidity: function deploymentRegistry() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) DeploymentRegistry() (common.Address, error) { + return _CommunityTokenDeployer.Contract.DeploymentRegistry(&_CommunityTokenDeployer.CallOpts) +} + +// DeploymentRegistry is a free data retrieval call binding the contract method 0xc6631092. +// +// Solidity: function deploymentRegistry() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) DeploymentRegistry() (common.Address, error) { + return _CommunityTokenDeployer.Contract.DeploymentRegistry(&_CommunityTokenDeployer.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) Eip712Domain(opts *bind.CallOpts) (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "eip712Domain") + + outstruct := new(struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Fields = *abi.ConvertType(out[0], new([1]byte)).(*[1]byte) + outstruct.Name = *abi.ConvertType(out[1], new(string)).(*string) + outstruct.Version = *abi.ConvertType(out[2], new(string)).(*string) + outstruct.ChainId = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) + outstruct.VerifyingContract = *abi.ConvertType(out[4], new(common.Address)).(*common.Address) + outstruct.Salt = *abi.ConvertType(out[5], new([32]byte)).(*[32]byte) + outstruct.Extensions = *abi.ConvertType(out[6], new([]*big.Int)).(*[]*big.Int) + + return *outstruct, err + +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _CommunityTokenDeployer.Contract.Eip712Domain(&_CommunityTokenDeployer.CallOpts) +} + +// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e. +// +// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) Eip712Domain() (struct { + Fields [1]byte + Name string + Version string + ChainId *big.Int + VerifyingContract common.Address + Salt [32]byte + Extensions []*big.Int +}, error) { + return _CommunityTokenDeployer.Contract.Eip712Domain(&_CommunityTokenDeployer.CallOpts) +} + +// MasterTokenFactory is a free data retrieval call binding the contract method 0x830c2626. +// +// Solidity: function masterTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) MasterTokenFactory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "masterTokenFactory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// MasterTokenFactory is a free data retrieval call binding the contract method 0x830c2626. +// +// Solidity: function masterTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) MasterTokenFactory() (common.Address, error) { + return _CommunityTokenDeployer.Contract.MasterTokenFactory(&_CommunityTokenDeployer.CallOpts) +} + +// MasterTokenFactory is a free data retrieval call binding the contract method 0x830c2626. +// +// Solidity: function masterTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) MasterTokenFactory() (common.Address, error) { + return _CommunityTokenDeployer.Contract.MasterTokenFactory(&_CommunityTokenDeployer.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) Owner() (common.Address, error) { + return _CommunityTokenDeployer.Contract.Owner(&_CommunityTokenDeployer.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) Owner() (common.Address, error) { + return _CommunityTokenDeployer.Contract.Owner(&_CommunityTokenDeployer.CallOpts) +} + +// OwnerTokenFactory is a free data retrieval call binding the contract method 0x62457f59. +// +// Solidity: function ownerTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) OwnerTokenFactory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "ownerTokenFactory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OwnerTokenFactory is a free data retrieval call binding the contract method 0x62457f59. +// +// Solidity: function ownerTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) OwnerTokenFactory() (common.Address, error) { + return _CommunityTokenDeployer.Contract.OwnerTokenFactory(&_CommunityTokenDeployer.CallOpts) +} + +// OwnerTokenFactory is a free data retrieval call binding the contract method 0x62457f59. +// +// Solidity: function ownerTokenFactory() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) OwnerTokenFactory() (common.Address, error) { + return _CommunityTokenDeployer.Contract.OwnerTokenFactory(&_CommunityTokenDeployer.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityTokenDeployer.contract.Call(opts, &out, "pendingOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) PendingOwner() (common.Address, error) { + return _CommunityTokenDeployer.Contract.PendingOwner(&_CommunityTokenDeployer.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityTokenDeployer *CommunityTokenDeployerCallerSession) PendingOwner() (common.Address, error) { + return _CommunityTokenDeployer.Contract.PendingOwner(&_CommunityTokenDeployer.CallOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "acceptOwnership") +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) AcceptOwnership() (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.AcceptOwnership(&_CommunityTokenDeployer.TransactOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.AcceptOwnership(&_CommunityTokenDeployer.TransactOpts) +} + +// Deploy is a paid mutator transaction binding the contract method 0xb0f95f28. +// +// Solidity: function deploy((string,string,string) _ownerToken, (string,string,string) _masterToken, (address,address,uint8,bytes32,bytes32) _signature, bytes _signerPublicKey) returns(address, address) +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) Deploy(opts *bind.TransactOpts, _ownerToken CommunityTokenDeployerTokenConfig, _masterToken CommunityTokenDeployerTokenConfig, _signature CommunityTokenDeployerDeploymentSignature, _signerPublicKey []byte) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "deploy", _ownerToken, _masterToken, _signature, _signerPublicKey) +} + +// Deploy is a paid mutator transaction binding the contract method 0xb0f95f28. +// +// Solidity: function deploy((string,string,string) _ownerToken, (string,string,string) _masterToken, (address,address,uint8,bytes32,bytes32) _signature, bytes _signerPublicKey) returns(address, address) +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) Deploy(_ownerToken CommunityTokenDeployerTokenConfig, _masterToken CommunityTokenDeployerTokenConfig, _signature CommunityTokenDeployerDeploymentSignature, _signerPublicKey []byte) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.Deploy(&_CommunityTokenDeployer.TransactOpts, _ownerToken, _masterToken, _signature, _signerPublicKey) +} + +// Deploy is a paid mutator transaction binding the contract method 0xb0f95f28. +// +// Solidity: function deploy((string,string,string) _ownerToken, (string,string,string) _masterToken, (address,address,uint8,bytes32,bytes32) _signature, bytes _signerPublicKey) returns(address, address) +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) Deploy(_ownerToken CommunityTokenDeployerTokenConfig, _masterToken CommunityTokenDeployerTokenConfig, _signature CommunityTokenDeployerDeploymentSignature, _signerPublicKey []byte) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.Deploy(&_CommunityTokenDeployer.TransactOpts, _ownerToken, _masterToken, _signature, _signerPublicKey) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) RenounceOwnership() (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.RenounceOwnership(&_CommunityTokenDeployer.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.RenounceOwnership(&_CommunityTokenDeployer.TransactOpts) +} + +// SetDeploymentRegistryAddress is a paid mutator transaction binding the contract method 0xf8851475. +// +// Solidity: function setDeploymentRegistryAddress(address _deploymentRegistry) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) SetDeploymentRegistryAddress(opts *bind.TransactOpts, _deploymentRegistry common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "setDeploymentRegistryAddress", _deploymentRegistry) +} + +// SetDeploymentRegistryAddress is a paid mutator transaction binding the contract method 0xf8851475. +// +// Solidity: function setDeploymentRegistryAddress(address _deploymentRegistry) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) SetDeploymentRegistryAddress(_deploymentRegistry common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetDeploymentRegistryAddress(&_CommunityTokenDeployer.TransactOpts, _deploymentRegistry) +} + +// SetDeploymentRegistryAddress is a paid mutator transaction binding the contract method 0xf8851475. +// +// Solidity: function setDeploymentRegistryAddress(address _deploymentRegistry) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) SetDeploymentRegistryAddress(_deploymentRegistry common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetDeploymentRegistryAddress(&_CommunityTokenDeployer.TransactOpts, _deploymentRegistry) +} + +// SetMasterTokenFactoryAddress is a paid mutator transaction binding the contract method 0xa53b2bdb. +// +// Solidity: function setMasterTokenFactoryAddress(address _masterTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) SetMasterTokenFactoryAddress(opts *bind.TransactOpts, _masterTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "setMasterTokenFactoryAddress", _masterTokenFactory) +} + +// SetMasterTokenFactoryAddress is a paid mutator transaction binding the contract method 0xa53b2bdb. +// +// Solidity: function setMasterTokenFactoryAddress(address _masterTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) SetMasterTokenFactoryAddress(_masterTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetMasterTokenFactoryAddress(&_CommunityTokenDeployer.TransactOpts, _masterTokenFactory) +} + +// SetMasterTokenFactoryAddress is a paid mutator transaction binding the contract method 0xa53b2bdb. +// +// Solidity: function setMasterTokenFactoryAddress(address _masterTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) SetMasterTokenFactoryAddress(_masterTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetMasterTokenFactoryAddress(&_CommunityTokenDeployer.TransactOpts, _masterTokenFactory) +} + +// SetOwnerTokenFactoryAddress is a paid mutator transaction binding the contract method 0x9ff02d18. +// +// Solidity: function setOwnerTokenFactoryAddress(address _ownerTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) SetOwnerTokenFactoryAddress(opts *bind.TransactOpts, _ownerTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "setOwnerTokenFactoryAddress", _ownerTokenFactory) +} + +// SetOwnerTokenFactoryAddress is a paid mutator transaction binding the contract method 0x9ff02d18. +// +// Solidity: function setOwnerTokenFactoryAddress(address _ownerTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) SetOwnerTokenFactoryAddress(_ownerTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetOwnerTokenFactoryAddress(&_CommunityTokenDeployer.TransactOpts, _ownerTokenFactory) +} + +// SetOwnerTokenFactoryAddress is a paid mutator transaction binding the contract method 0x9ff02d18. +// +// Solidity: function setOwnerTokenFactoryAddress(address _ownerTokenFactory) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) SetOwnerTokenFactoryAddress(_ownerTokenFactory common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.SetOwnerTokenFactoryAddress(&_CommunityTokenDeployer.TransactOpts, _ownerTokenFactory) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.TransferOwnership(&_CommunityTokenDeployer.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityTokenDeployer *CommunityTokenDeployerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _CommunityTokenDeployer.Contract.TransferOwnership(&_CommunityTokenDeployer.TransactOpts, newOwner) +} + +// CommunityTokenDeployerDeployMasterTokenIterator is returned from FilterDeployMasterToken and is used to iterate over the raw logs and unpacked data for DeployMasterToken events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeployMasterTokenIterator struct { + Event *CommunityTokenDeployerDeployMasterToken // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerDeployMasterTokenIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeployMasterToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeployMasterToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerDeployMasterTokenIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerDeployMasterTokenIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerDeployMasterToken represents a DeployMasterToken event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeployMasterToken struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDeployMasterToken is a free log retrieval operation binding the contract event 0x1464afef6e77413c9c3201405b55530340d684e2a19f3a9d83bc604d4aa3a255. +// +// Solidity: event DeployMasterToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterDeployMasterToken(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityTokenDeployerDeployMasterTokenIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "DeployMasterToken", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerDeployMasterTokenIterator{contract: _CommunityTokenDeployer.contract, event: "DeployMasterToken", logs: logs, sub: sub}, nil +} + +// WatchDeployMasterToken is a free log subscription operation binding the contract event 0x1464afef6e77413c9c3201405b55530340d684e2a19f3a9d83bc604d4aa3a255. +// +// Solidity: event DeployMasterToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchDeployMasterToken(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerDeployMasterToken, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "DeployMasterToken", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerDeployMasterToken) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeployMasterToken", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDeployMasterToken is a log parse operation binding the contract event 0x1464afef6e77413c9c3201405b55530340d684e2a19f3a9d83bc604d4aa3a255. +// +// Solidity: event DeployMasterToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseDeployMasterToken(log types.Log) (*CommunityTokenDeployerDeployMasterToken, error) { + event := new(CommunityTokenDeployerDeployMasterToken) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeployMasterToken", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerDeployOwnerTokenIterator is returned from FilterDeployOwnerToken and is used to iterate over the raw logs and unpacked data for DeployOwnerToken events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeployOwnerTokenIterator struct { + Event *CommunityTokenDeployerDeployOwnerToken // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerDeployOwnerTokenIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeployOwnerToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeployOwnerToken) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerDeployOwnerTokenIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerDeployOwnerTokenIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerDeployOwnerToken represents a DeployOwnerToken event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeployOwnerToken struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDeployOwnerToken is a free log retrieval operation binding the contract event 0x6f60871ce1ae7c2bc82a9fca785cdf029fa7c9984afe96eaa106d1b7b19c6322. +// +// Solidity: event DeployOwnerToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterDeployOwnerToken(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityTokenDeployerDeployOwnerTokenIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "DeployOwnerToken", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerDeployOwnerTokenIterator{contract: _CommunityTokenDeployer.contract, event: "DeployOwnerToken", logs: logs, sub: sub}, nil +} + +// WatchDeployOwnerToken is a free log subscription operation binding the contract event 0x6f60871ce1ae7c2bc82a9fca785cdf029fa7c9984afe96eaa106d1b7b19c6322. +// +// Solidity: event DeployOwnerToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchDeployOwnerToken(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerDeployOwnerToken, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "DeployOwnerToken", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerDeployOwnerToken) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeployOwnerToken", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDeployOwnerToken is a log parse operation binding the contract event 0x6f60871ce1ae7c2bc82a9fca785cdf029fa7c9984afe96eaa106d1b7b19c6322. +// +// Solidity: event DeployOwnerToken(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseDeployOwnerToken(log types.Log) (*CommunityTokenDeployerDeployOwnerToken, error) { + event := new(CommunityTokenDeployerDeployOwnerToken) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeployOwnerToken", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerDeploymentRegistryAddressChangeIterator is returned from FilterDeploymentRegistryAddressChange and is used to iterate over the raw logs and unpacked data for DeploymentRegistryAddressChange events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeploymentRegistryAddressChangeIterator struct { + Event *CommunityTokenDeployerDeploymentRegistryAddressChange // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerDeploymentRegistryAddressChangeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeploymentRegistryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerDeploymentRegistryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerDeploymentRegistryAddressChangeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerDeploymentRegistryAddressChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerDeploymentRegistryAddressChange represents a DeploymentRegistryAddressChange event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerDeploymentRegistryAddressChange struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDeploymentRegistryAddressChange is a free log retrieval operation binding the contract event 0x8f3be421db34ad7dfa5c7fb9391b363b444007c7b26f0a22c58aad6e130b935e. +// +// Solidity: event DeploymentRegistryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterDeploymentRegistryAddressChange(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityTokenDeployerDeploymentRegistryAddressChangeIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "DeploymentRegistryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerDeploymentRegistryAddressChangeIterator{contract: _CommunityTokenDeployer.contract, event: "DeploymentRegistryAddressChange", logs: logs, sub: sub}, nil +} + +// WatchDeploymentRegistryAddressChange is a free log subscription operation binding the contract event 0x8f3be421db34ad7dfa5c7fb9391b363b444007c7b26f0a22c58aad6e130b935e. +// +// Solidity: event DeploymentRegistryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchDeploymentRegistryAddressChange(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerDeploymentRegistryAddressChange, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "DeploymentRegistryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerDeploymentRegistryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeploymentRegistryAddressChange", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDeploymentRegistryAddressChange is a log parse operation binding the contract event 0x8f3be421db34ad7dfa5c7fb9391b363b444007c7b26f0a22c58aad6e130b935e. +// +// Solidity: event DeploymentRegistryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseDeploymentRegistryAddressChange(log types.Log) (*CommunityTokenDeployerDeploymentRegistryAddressChange, error) { + event := new(CommunityTokenDeployerDeploymentRegistryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "DeploymentRegistryAddressChange", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerEIP712DomainChangedIterator struct { + Event *CommunityTokenDeployerEIP712DomainChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerEIP712DomainChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerEIP712DomainChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerEIP712DomainChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerEIP712DomainChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerEIP712DomainChanged represents a EIP712DomainChanged event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerEIP712DomainChanged struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*CommunityTokenDeployerEIP712DomainChangedIterator, error) { + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return &CommunityTokenDeployerEIP712DomainChangedIterator{contract: _CommunityTokenDeployer.contract, event: "EIP712DomainChanged", logs: logs, sub: sub}, nil +} + +// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerEIP712DomainChanged) (event.Subscription, error) { + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "EIP712DomainChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerEIP712DomainChanged) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31. +// +// Solidity: event EIP712DomainChanged() +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseEIP712DomainChanged(log types.Log) (*CommunityTokenDeployerEIP712DomainChanged, error) { + event := new(CommunityTokenDeployerEIP712DomainChanged) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "EIP712DomainChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator is returned from FilterMasterTokenFactoryAddressChange and is used to iterate over the raw logs and unpacked data for MasterTokenFactoryAddressChange events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator struct { + Event *CommunityTokenDeployerMasterTokenFactoryAddressChange // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerMasterTokenFactoryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerMasterTokenFactoryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerMasterTokenFactoryAddressChange represents a MasterTokenFactoryAddressChange event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerMasterTokenFactoryAddressChange struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMasterTokenFactoryAddressChange is a free log retrieval operation binding the contract event 0x184513c31b135bda32c81b8586d52ad5bdbc7b7e4ec5847eee48374ee07e8e48. +// +// Solidity: event MasterTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterMasterTokenFactoryAddressChange(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "MasterTokenFactoryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerMasterTokenFactoryAddressChangeIterator{contract: _CommunityTokenDeployer.contract, event: "MasterTokenFactoryAddressChange", logs: logs, sub: sub}, nil +} + +// WatchMasterTokenFactoryAddressChange is a free log subscription operation binding the contract event 0x184513c31b135bda32c81b8586d52ad5bdbc7b7e4ec5847eee48374ee07e8e48. +// +// Solidity: event MasterTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchMasterTokenFactoryAddressChange(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerMasterTokenFactoryAddressChange, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "MasterTokenFactoryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerMasterTokenFactoryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "MasterTokenFactoryAddressChange", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseMasterTokenFactoryAddressChange is a log parse operation binding the contract event 0x184513c31b135bda32c81b8586d52ad5bdbc7b7e4ec5847eee48374ee07e8e48. +// +// Solidity: event MasterTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseMasterTokenFactoryAddressChange(log types.Log) (*CommunityTokenDeployerMasterTokenFactoryAddressChange, error) { + event := new(CommunityTokenDeployerMasterTokenFactoryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "MasterTokenFactoryAddressChange", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator is returned from FilterOwnerTokenFactoryAddressChange and is used to iterate over the raw logs and unpacked data for OwnerTokenFactoryAddressChange events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator struct { + Event *CommunityTokenDeployerOwnerTokenFactoryAddressChange // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnerTokenFactoryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnerTokenFactoryAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerOwnerTokenFactoryAddressChange represents a OwnerTokenFactoryAddressChange event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnerTokenFactoryAddressChange struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnerTokenFactoryAddressChange is a free log retrieval operation binding the contract event 0x17ae1257210039eb267be68929104e6c28fc9ebb9dc6aaa84be39b45eb6f3767. +// +// Solidity: event OwnerTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterOwnerTokenFactoryAddressChange(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "OwnerTokenFactoryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerOwnerTokenFactoryAddressChangeIterator{contract: _CommunityTokenDeployer.contract, event: "OwnerTokenFactoryAddressChange", logs: logs, sub: sub}, nil +} + +// WatchOwnerTokenFactoryAddressChange is a free log subscription operation binding the contract event 0x17ae1257210039eb267be68929104e6c28fc9ebb9dc6aaa84be39b45eb6f3767. +// +// Solidity: event OwnerTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchOwnerTokenFactoryAddressChange(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerOwnerTokenFactoryAddressChange, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "OwnerTokenFactoryAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerOwnerTokenFactoryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnerTokenFactoryAddressChange", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnerTokenFactoryAddressChange is a log parse operation binding the contract event 0x17ae1257210039eb267be68929104e6c28fc9ebb9dc6aaa84be39b45eb6f3767. +// +// Solidity: event OwnerTokenFactoryAddressChange(address indexed arg0) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseOwnerTokenFactoryAddressChange(log types.Log) (*CommunityTokenDeployerOwnerTokenFactoryAddressChange, error) { + event := new(CommunityTokenDeployerOwnerTokenFactoryAddressChange) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnerTokenFactoryAddressChange", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnershipTransferStartedIterator struct { + Event *CommunityTokenDeployerOwnershipTransferStarted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerOwnershipTransferStartedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerOwnershipTransferStartedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerOwnershipTransferStartedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnershipTransferStarted struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CommunityTokenDeployerOwnershipTransferStartedIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerOwnershipTransferStartedIterator{contract: _CommunityTokenDeployer.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerOwnershipTransferStarted) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseOwnershipTransferStarted(log types.Log) (*CommunityTokenDeployerOwnershipTransferStarted, error) { + event := new(CommunityTokenDeployerOwnershipTransferStarted) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityTokenDeployerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnershipTransferredIterator struct { + Event *CommunityTokenDeployerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityTokenDeployerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityTokenDeployerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityTokenDeployerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityTokenDeployerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityTokenDeployerOwnershipTransferred represents a OwnershipTransferred event raised by the CommunityTokenDeployer contract. +type CommunityTokenDeployerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CommunityTokenDeployerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityTokenDeployer.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &CommunityTokenDeployerOwnershipTransferredIterator{contract: _CommunityTokenDeployer.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CommunityTokenDeployerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityTokenDeployer.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityTokenDeployerOwnershipTransferred) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityTokenDeployer *CommunityTokenDeployerFilterer) ParseOwnershipTransferred(log types.Log) (*CommunityTokenDeployerOwnershipTransferred, error) { + event := new(CommunityTokenDeployerOwnershipTransferred) + if err := _CommunityTokenDeployer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/community-tokens/deployer/CommunityTokenDeployer.sol b/contracts/community-tokens/deployer/CommunityTokenDeployer.sol new file mode 100644 index 000000000..82e0ff65e --- /dev/null +++ b/contracts/community-tokens/deployer/CommunityTokenDeployer.sol @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.17; + +import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; +import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; +import { ITokenFactory } from "./interfaces/ITokenFactory.sol"; +import { IAddressRegistry } from "./interfaces/IAddressRegistry.sol"; + +/** + * @title CommunityTokenDeployer contract + * @author 0x-r4bbit + * + * This contract serves as a deployment process for Status community owners + * to deploy access control token contracts on behalf of their Status community. + * The contract keep a reference to token factories that are used for deploying tokens. + * The contract deploys the two token contracts `OwnerToken` and `MasterToken` those factories. + * The contract maintains a registry which keeps track of `OwnerToken` contract + * addresses per community. + * + * Only one deployment per community can be done. + * Status community owners have to provide an EIP712 hash signature that was + * created using their community's private key to successfully execute a deployment. + * + * @notice This contract is used by Status community owners to deploy + * community access control token contracts. + * @notice This contract maintains a registry that tracks contract addresses + * and community addresses + * @dev This contract will be deployed by Status, making Status the owner + * of the contract. + * @dev A contract address for a `CommunityTokenRegistry` contract has to be provided + * to create this contract. + * @dev A contract address for a `CommunityOwnerTokenFactory` contract has to be provided + * to create this contract. + * @dev A contract address for a `CommunityMasterTokenFactory` contract has to be provided + * to create this contract. + * @dev The `CommunityTokenRegistry` address can be changed by the owner of this contract. + * @dev The `CommunityOwnerTokenFactory` address can be changed by the owner of this contract. + * @dev The `CommunityMasterTokenFactory` address can be changed by the owner of this contract. + */ +contract CommunityTokenDeployer is EIP712("CommunityTokenDeployer", "1"), Ownable2Step { + using ECDSA for bytes32; + + error CommunityTokenDeployer_InvalidDeploymentRegistryAddress(); + error CommunityTokenDeployer_InvalidTokenFactoryAddress(); + error CommunityTokenDeployer_EqualFactoryAddresses(); + error CommunityTokenDeployer_AlreadyDeployed(); + error CommunityTokenDeployer_InvalidSignerKeyOrCommunityAddress(); + error CommunityTokenDeployer_InvalidTokenMetadata(); + error CommunityTokenDeployer_InvalidDeployerAddress(); + error CommunityTokenDeployer_InvalidDeploymentSignature(); + + event OwnerTokenFactoryAddressChange(address indexed); + event MasterTokenFactoryAddressChange(address indexed); + event DeploymentRegistryAddressChange(address indexed); + event DeployOwnerToken(address indexed); + event DeployMasterToken(address indexed); + + /// @dev Needed to avoid "Stack too deep" error. + struct TokenConfig { + string name; + string symbol; + string baseURI; + } + + /// @dev Used to verify signatures. + struct DeploymentSignature { + address signer; + address deployer; + uint8 v; + bytes32 r; + bytes32 s; + } + + bytes32 public constant DEPLOYMENT_SIGNATURE_TYPEHASH = keccak256("Deploy(address signer,address deployer)"); + + /// @dev Address of the `CommunityTokenRegistry` contract instance. + address public deploymentRegistry; + + /// @dev Address of the `CommunityOwnerTokenFactory` contract instance. + address public ownerTokenFactory; + + /// @dev Address of the `CommunityMasterTokenFactory` contract instance. + address public masterTokenFactory; + + /// @param _registry The address of the `CommunityTokenRegistry` contract. + /// @param _ownerTokenFactory The address of the `CommunityOwnerTokenFactory` contract. + /// @param _masterTokenFactory The address of the `CommunityMasterTokenFactory` contract. + constructor(address _registry, address _ownerTokenFactory, address _masterTokenFactory) { + if (_registry == address(0)) { + revert CommunityTokenDeployer_InvalidDeploymentRegistryAddress(); + } + if (_ownerTokenFactory == address(0) || _masterTokenFactory == address(0)) { + revert CommunityTokenDeployer_InvalidTokenFactoryAddress(); + } + if (_ownerTokenFactory == _masterTokenFactory) { + revert CommunityTokenDeployer_EqualFactoryAddresses(); + } + deploymentRegistry = _registry; + ownerTokenFactory = _ownerTokenFactory; + masterTokenFactory = _masterTokenFactory; + } + + /** + * @notice Deploys an instance of `OwnerToken` and `MasterToken` on behalf + * of a Status community account, provided `_signature` is valid and was signed + * by that Status community account, using the configured factory contracts. + * @dev Anyone can call this function but a valid EIP712 hash signature has to be + * provided for a successful deployment. + * @dev Emits {CreateToken} events via underlying token factories. + * @dev Emits {DeployOwnerToken} event. + * @dev Emits {DeployMasterToken} event. + * + * @param _ownerToken A `TokenConfig` containing ERC721 metadata for `OwnerToken` + * @param _masterToken A `TokenConfig` containing ERC721 metadata for `MasterToken` + * @param _signature A `DeploymentSignature` containing a signer and deployer address, + * and a signature created by a Status community + * @return address The address of the deployed `OwnerToken` contract. + * @return address The address of the deployed `MasterToken` contract. + */ + function deploy( + TokenConfig calldata _ownerToken, + TokenConfig calldata _masterToken, + DeploymentSignature calldata _signature, + bytes memory _signerPublicKey + ) + external + returns (address, address) + { + if (_signature.signer == address(0) || _signerPublicKey.length == 0) { + revert CommunityTokenDeployer_InvalidSignerKeyOrCommunityAddress(); + } + + if (_signature.deployer != msg.sender) { + revert CommunityTokenDeployer_InvalidDeployerAddress(); + } + + if (IAddressRegistry(deploymentRegistry).getEntry(_signature.signer) != address(0)) { + revert CommunityTokenDeployer_AlreadyDeployed(); + } + + if (!_verifySignature(_signature)) { + revert CommunityTokenDeployer_InvalidDeploymentSignature(); + } + + address ownerToken = ITokenFactory(ownerTokenFactory).create( + _ownerToken.name, _ownerToken.symbol, _ownerToken.baseURI, msg.sender, _signerPublicKey + ); + + emit DeployOwnerToken(ownerToken); + + address masterToken = ITokenFactory(masterTokenFactory).create( + _masterToken.name, _masterToken.symbol, _masterToken.baseURI, ownerToken, bytes("") + ); + + emit DeployMasterToken(masterToken); + + IAddressRegistry(deploymentRegistry).addEntry(_signature.signer, ownerToken); + return (ownerToken, masterToken); + } + + /** + * @notice Sets a deployment registry address. + * @dev Only the owner can call this function. + * @dev Emits a {DeploymentRegistryAddressChange} event. + * @dev Reverts if the provided address is a zero address. + * + * @param _deploymentRegistry The address of the deployment registry contract. + */ + function setDeploymentRegistryAddress(address _deploymentRegistry) external onlyOwner { + if (_deploymentRegistry == address(0)) { + revert CommunityTokenDeployer_InvalidDeploymentRegistryAddress(); + } + deploymentRegistry = _deploymentRegistry; + emit DeploymentRegistryAddressChange(deploymentRegistry); + } + + /** + * @notice Sets the `OwnerToken` factory contract address. + * @dev Only the owner can call this function. + * @dev Emits a {OwnerTokenFactoryChange} event. + * @dev Reverts if the provided address is a zero address. + * + * @param _ownerTokenFactory The address of the `OwnerToken` factory contract. + */ + function setOwnerTokenFactoryAddress(address _ownerTokenFactory) external onlyOwner { + if (_ownerTokenFactory == address(0)) { + revert CommunityTokenDeployer_InvalidTokenFactoryAddress(); + } + ownerTokenFactory = _ownerTokenFactory; + emit OwnerTokenFactoryAddressChange(ownerTokenFactory); + } + + /** + * @notice Sets the `MasterToken` factory contract address. + * @dev Only the owner can call this function. + * @dev Emits a {MasterTokenFactoryChange} event. + * @dev Reverts if the provided address is a zero address. + * + * @param _masterTokenFactory The address of the `MasterToken` factory contract. + */ + function setMasterTokenFactoryAddress(address _masterTokenFactory) external onlyOwner { + if (_masterTokenFactory == address(0)) { + revert CommunityTokenDeployer_InvalidTokenFactoryAddress(); + } + masterTokenFactory = _masterTokenFactory; + emit MasterTokenFactoryAddressChange(masterTokenFactory); + } + + /** + * @notice Returns an EIP712 domain separator hash + * @return bytes32 An EIP712 domain separator hash + */ + function DOMAIN_SEPARATOR() external view returns (bytes32) { + return _domainSeparatorV4(); + } + + /** + * @notice Verifies provided `DeploymentSignature` which was created by + * the Status community account for which the access control token contracts + * will be deployed. + * @dev This contract does not maintain nonces for the typed data hash, which + * is typically done to prevent signature replay attacks. The `deploy()` function + * allows only one deployment per Status community, so replay attacks are not possible. + * @return bool Whether the provided signature could be recovered. + */ + function _verifySignature(DeploymentSignature calldata signature) internal view returns (bool) { + bytes32 digest = + _hashTypedDataV4(keccak256(abi.encode(DEPLOYMENT_SIGNATURE_TYPEHASH, signature.signer, signature.deployer))); + return signature.signer == digest.recover(signature.v, signature.r, signature.s); + } +} diff --git a/contracts/community-tokens/deployer/address.go b/contracts/community-tokens/deployer/address.go new file mode 100644 index 000000000..3a9c5b558 --- /dev/null +++ b/contracts/community-tokens/deployer/address.go @@ -0,0 +1,22 @@ +package communitytokendeployer + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" +) + +var errorNotAvailableOnChainID = errors.New("deployer contract not available for chainID") + +// TODO add addresses for other chains +var contractAddressByChainID = map[uint64]common.Address{ + 420: common.HexToAddress("0xfFa8A255D905c909379859eA45B959D090DDC2d4"), // Optimism Goerli +} + +func ContractAddress(chainID uint64) (common.Address, error) { + addr, exists := contractAddressByChainID[chainID] + if !exists { + return *new(common.Address), errorNotAvailableOnChainID + } + return addr, nil +} diff --git a/contracts/community-tokens/mastertoken/MasterToken.go b/contracts/community-tokens/mastertoken/MasterToken.go index aef4723d0..a21724ded 100644 --- a/contracts/community-tokens/mastertoken/MasterToken.go +++ b/contracts/community-tokens/mastertoken/MasterToken.go @@ -4,6 +4,7 @@ package mastertoken import ( + "errors" "math/big" "strings" @@ -17,6 +18,7 @@ import ( // Reference imports to suppress errors if they are not otherwise used. var ( + _ = errors.New _ = big.NewInt _ = strings.NewReader _ = ethereum.NotFound @@ -24,22 +26,34 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) +// MasterTokenMetaData contains all meta data concerning the MasterToken contract. +var MasterTokenMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_ownerToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BaseToken_InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_MaxSupplyLowerThanTotalSupply\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_MaxSupplyReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotRemoteBurnable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BaseToken_NotTransferable\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b5060405162002b5838038062002b588339810160408190526200003491620001d9565b8383600019600160008686828787826200004f83826200031b565b5060016200005e82826200031b565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009d84826200031b565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055158015620000e35750600d546001600160a01b0316155b15620001025760405163e42d451560e01b815260040160405180910390fd5b505050505050505050505050620003e7565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200013c57600080fd5b81516001600160401b038082111562000159576200015962000114565b604051601f8301601f19908116603f0116810190828211818310171562000184576200018462000114565b81604052838152602092508683858801011115620001a157600080fd5b600091505b83821015620001c55785820183015181830184015290820190620001a6565b600093810190920192909252949350505050565b60008060008060808587031215620001f057600080fd5b84516001600160401b03808211156200020857600080fd5b62000216888389016200012a565b955060208701519150808211156200022d57600080fd5b6200023b888389016200012a565b945060408701519150808211156200025257600080fd5b5062000261878288016200012a565b606087015190935090506001600160a01b03811681146200028157600080fd5b939692955090935050565b600181811c90821680620002a157607f821691505b602082108103620002c257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200031657600081815260208120601f850160051c81016020861015620002f15750805b601f850160051c820191505b818110156200031257828155600101620002fd565b5050505b505050565b81516001600160401b0381111562000337576200033762000114565b6200034f816200034884546200028c565b84620002c8565b602080601f8311600181146200038757600084156200036e5750858301515b600019600386901b1c1916600185901b17855562000312565b600085815260208120601f198616915b82811015620003b85788860151825594840194600190910190840162000397565b5085821015620003d75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61276180620003f76000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806365371883116100ee578063b88d4fde11610097578063cf721b1511610071578063cf721b151461039f578063d547cfb7146103a7578063d5abeb01146103af578063e985e9c5146103b857600080fd5b8063b88d4fde14610366578063c87b56dd14610379578063ce7c8b491461038c57600080fd5b806392ff0d31116100c857806392ff0d311461032557806395d89b411461034b578063a22cb4651461035357600080fd5b806365371883146102ec5780636f8b44b0146102ff57806370a082311461031257600080fd5b806323b872dd1161015b57806342842e0e1161013557806342842e0e146102a05780634f6ccce7146102b35780634fb95e02146102c65780636352211e146102d957600080fd5b806323b872dd146102675780632bb5e31e1461027a5780632f745c591461028d57600080fd5b8063095ea7b31161018c578063095ea7b31461021b578063101639f51461023057806318160ddd1461025557600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc146101f0575b600080fd5b6101c66101c136600461210f565b6103f4565b60405190151581526020015b60405180910390f35b6101e3610405565b6040516101d2919061219a565b6102036101fe3660046121ad565b610497565b6040516001600160a01b0390911681526020016101d2565b61022e6102293660046121e2565b6104be565b005b600d546101c69074010000000000000000000000000000000000000000900460ff1681565b6008545b6040519081526020016101d2565b61022e61027536600461220c565b6105f4565b600d54610203906001600160a01b031681565b61025961029b3660046121e2565b61067b565b61022e6102ae36600461220c565b610723565b6102596102c13660046121ad565b61073e565b61022e6102d43660046122ea565b6107e2565b6102036102e73660046121ad565b6109f0565b600c54610203906001600160a01b031681565b61022e61030d3660046121ad565b610a55565b610259610320366004612380565b610c0c565b600d546101c6907501000000000000000000000000000000000000000000900460ff1681565b6101e3610ca6565b61022e61036136600461239b565b610cb5565b61022e6103743660046123d7565b610cc0565b6101e36103873660046121ad565b610d4e565b61022e61039a3660046124b5565b610db5565b610259610f81565b6101e3610f91565b610259600b5481565b6101c66103c6366004612542565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006103ff8261101f565b92915050565b60606000805461041490612575565b80601f016020809104026020016040519081016040528092919081815260200182805461044090612575565b801561048d5780601f106104625761010080835404028352916020019161048d565b820191906000526020600020905b81548152906001019060200180831161047057829003601f168201915b5050505050905090565b60006104a282611075565b506000908152600460205260409020546001600160a01b031690565b60006104c9826109f0565b9050806001600160a01b0316836001600160a01b0316036105575760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b0382161480610573575061057381336103c6565b6105e55760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161054e565b6105ef83836110d9565b505050565b6105fe338261115f565b6106705760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161054e565b6105ef8383836111de565b600061068683610c0c565b82106106fa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161054e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6105ef83838360405180602001604052806000815250610cc0565b600061074960085490565b82106107bd5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161054e565b600882815481106107d0576107d06125c8565b90600052602060002001549050919050565b600c546001600160a01b03161580159061087e5750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087c91906125f7565b155b80156109215750600d546001600160a01b0316158015906109215750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f91906125f7565b155b15610958576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5474010000000000000000000000000000000000000000900460ff166109ac576040517f98209e6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81518110156109ec576109da8282815181106109cd576109cd6125c8565b602002602001015161144a565b806109e48161263f565b9150506109af565b5050565b6000818152600260205260408120546001600160a01b0316806103ff5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161054e565b600c546001600160a01b031615801590610af15750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aef91906125f7565b155b8015610b945750600d546001600160a01b031615801590610b945750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9291906125f7565b155b15610bcb576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854811015610c07576040517fad8783d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b55565b60006001600160a01b038216610c8a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161054e565b506001600160a01b031660009081526003602052604090205490565b60606001805461041490612575565b6109ec338383611523565b610cca338361115f565b610d3c5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161054e565b610d488484848461160f565b50505050565b6060610d5982611075565b6000610d63611698565b90506000815111610d835760405180602001604052806000815250610dae565b80610d8d846116a7565b604051602001610d9e929190612677565b6040516020818303038152906040525b9392505050565b600c546001600160a01b031615801590610e515750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f91906125f7565b155b8015610ef45750600d546001600160a01b031615801590610ef45750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef291906125f7565b155b15610f2b576040517f548d2e3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b548151600a54610f3d91906126a6565b1115610f75576040517f23d6539900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f7e81611765565b50565b6000610f8c600a5490565b905090565b600e8054610f9e90612575565b80601f0160208091040260200160405190810160405280929190818152602001828054610fca90612575565b80156110175780601f10610fec57610100808354040283529160200191611017565b820191906000526020600020905b815481529060010190602001808311610ffa57829003601f168201915b505050505081565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806103ff57506103ff826117cc565b6000818152600260205260409020546001600160a01b0316610f7e5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161054e565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611126826109f0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061116b836109f0565b9050806001600160a01b0316846001600160a01b031614806111b257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806111d65750836001600160a01b03166111cb84610497565b6001600160a01b0316145b949350505050565b826001600160a01b03166111f1826109f0565b6001600160a01b03161461126d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161054e565b6001600160a01b0382166112e85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161054e565b6112f583838360016118af565b826001600160a01b0316611308826109f0565b6001600160a01b0316146113845760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161054e565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b038781168086526003855283862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611455826109f0565b90506114658160008460016118af565b61146e826109f0565b600083815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b0385168085526003845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036115845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161054e565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61161a8484846111de565b6116268484848461193a565b610d485760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161054e565b6060600e805461041490612575565b606060006116b483611af9565b600101905060008167ffffffffffffffff8111156116d4576116d4612248565b6040519080825280601f01601f1916602001820160405280156116fe576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461170857509392505050565b60005b81518110156109ec576117ac828281518110611786576117866125c8565b6020026020010151611797600a5490565b60405180602001604052806000815250611bdb565b6117ba600a80546001019055565b806117c48161263f565b915050611768565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061185f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806103ff57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146103ff565b6001600160a01b038416158015906118cf57506001600160a01b03831615155b80156118f75750600d547501000000000000000000000000000000000000000000900460ff16155b1561192e576040517f6b2b9e5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d4884848484611c64565b60006001600160a01b0384163b15611aee576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906119979033908990889088906004016126b9565b6020604051808303816000875af19250505080156119f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119ed918101906126f5565b60015b611aa3573d808015611a1e576040519150601f19603f3d011682016040523d82523d6000602084013e611a23565b606091505b508051600003611a9b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161054e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506111d6565b506001949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611b42577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611b6e576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b8c57662386f26fc10000830492506010015b6305f5e1008310611ba4576305f5e100830492506008015b6127108310611bb857612710830492506004015b60648310611bca576064830492506002015b600a83106103ff5760010192915050565b611be58383611da0565b611bf2600084848461193a565b6105ef5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161054e565b6001811115611cdb5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f727465640000000000000000000000606482015260840161054e565b816001600160a01b038516611d3757611d3281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611d5a565b836001600160a01b0316856001600160a01b031614611d5a57611d5a8582611f51565b6001600160a01b038416611d7657611d7181611fee565b611d99565b846001600160a01b0316846001600160a01b031614611d9957611d99848261209d565b5050505050565b6001600160a01b038216611df65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161054e565b6000818152600260205260409020546001600160a01b031615611e5b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161054e565b611e696000838360016118af565b6000818152600260205260409020546001600160a01b031615611ece5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161054e565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611f5e84610c0c565b611f689190612712565b600083815260076020526040902054909150808214611fbb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061200090600190612712565b60008381526009602052604081205460088054939450909284908110612028576120286125c8565b906000526020600020015490508060088381548110612049576120496125c8565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061208157612081612725565b6001900381819060005260206000200160009055905550505050565b60006120a883610c0c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610f7e57600080fd5b60006020828403121561212157600080fd5b8135610dae816120e1565b60005b8381101561214757818101518382015260200161212f565b50506000910152565b6000815180845261216881602086016020860161212c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610dae6020830184612150565b6000602082840312156121bf57600080fd5b5035919050565b80356001600160a01b03811681146121dd57600080fd5b919050565b600080604083850312156121f557600080fd5b6121fe836121c6565b946020939093013593505050565b60008060006060848603121561222157600080fd5b61222a846121c6565b9250612238602085016121c6565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122be576122be612248565b604052919050565b600067ffffffffffffffff8211156122e0576122e0612248565b5060051b60200190565b600060208083850312156122fd57600080fd5b823567ffffffffffffffff81111561231457600080fd5b8301601f8101851361232557600080fd5b8035612338612333826122c6565b612277565b81815260059190911b8201830190838101908783111561235757600080fd5b928401925b828410156123755783358252928401929084019061235c565b979650505050505050565b60006020828403121561239257600080fd5b610dae826121c6565b600080604083850312156123ae57600080fd5b6123b7836121c6565b9150602083013580151581146123cc57600080fd5b809150509250929050565b600080600080608085870312156123ed57600080fd5b6123f6856121c6565b935060206124058187016121c6565b935060408601359250606086013567ffffffffffffffff8082111561242957600080fd5b818801915088601f83011261243d57600080fd5b81358181111561244f5761244f612248565b61247f847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612277565b9150808252898482850101111561249557600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060208083850312156124c857600080fd5b823567ffffffffffffffff8111156124df57600080fd5b8301601f810185136124f057600080fd5b80356124fe612333826122c6565b81815260059190911b8201830190838101908783111561251d57600080fd5b928401925b8284101561237557612533846121c6565b82529284019290840190612522565b6000806040838503121561255557600080fd5b61255e836121c6565b915061256c602084016121c6565b90509250929050565b600181811c9082168061258957607f821691505b6020821081036125c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561260957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361267057612670612610565b5060010190565b6000835161268981846020880161212c565b83519083019061269d81836020880161212c565b01949350505050565b808201808211156103ff576103ff612610565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126eb6080830184612150565b9695505050505050565b60006020828403121561270757600080fd5b8151610dae816120e1565b818103818111156103ff576103ff612610565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000811000a", +} + // MasterTokenABI is the input ABI used to generate the binding from. -const MasterTokenABI = "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_ownerToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" +// Deprecated: Use MasterTokenMetaData.ABI instead. +var MasterTokenABI = MasterTokenMetaData.ABI // MasterTokenBin is the compiled bytecode used for deploying new contracts. -var MasterTokenBin = "0x60806040523480156200001157600080fd5b506040516200263f3803806200263f83398101604081905262000034916200020c565b8383600019600160008686828787826200004f83826200034e565b5060016200005e82826200034e565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009d84826200034e565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055151580620000e45750600d546001600160a01b031615155b620001355760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206f72206d617374657220746f6b656e7320726571756972656400604482015260640160405180910390fd5b5050505050505050505050506200041a565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016f57600080fd5b81516001600160401b03808211156200018c576200018c62000147565b604051601f8301601f19908116603f01168101908282118183101715620001b757620001b762000147565b81604052838152602092508683858801011115620001d457600080fd5b600091505b83821015620001f85785820183015181830184015290820190620001d9565b600093810190920192909252949350505050565b600080600080608085870312156200022357600080fd5b84516001600160401b03808211156200023b57600080fd5b62000249888389016200015d565b955060208701519150808211156200026057600080fd5b6200026e888389016200015d565b945060408701519150808211156200028557600080fd5b5062000294878288016200015d565b606087015190935090506001600160a01b0381168114620002b457600080fd5b939692955090935050565b600181811c90821680620002d457607f821691505b602082108103620002f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034957600081815260208120601f850160051c81016020861015620003245750805b601f850160051c820191505b81811015620003455782815560010162000330565b5050505b505050565b81516001600160401b038111156200036a576200036a62000147565b62000382816200037b8454620002bf565b84620002fb565b602080601f831160018114620003ba5760008415620003a15750858301515b600019600386901b1c1916600185901b17855562000345565b600085815260208120601f198616915b82811015620003eb57888601518255948401946001909101908401620003ca565b50858210156200040a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612215806200042a6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806365371883116100de578063b88d4fde11610097578063cf721b1511610071578063cf721b151461035c578063d547cfb714610364578063d5abeb011461036c578063e985e9c51461037557600080fd5b8063b88d4fde14610323578063c87b56dd14610336578063ce7c8b491461034957600080fd5b806365371883146102bb5780636f8b44b0146102ce57806370a08231146102e157806392ff0d31146102f457806395d89b4114610308578063a22cb4651461031057600080fd5b806323b872dd1161014b57806342842e0e1161012557806342842e0e1461026f5780634f6ccce7146102825780634fb95e02146102955780636352211e146102a857600080fd5b806323b872dd146102365780632bb5e31e146102495780632f745c591461025c57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb578063101639f51461021057806318160ddd14610224575b600080fd5b6101a66101a1366004611b83565b6103b1565b60405190151581526020015b60405180910390f35b6101c36103c2565b6040516101b29190611bf0565b6101e36101de366004611c03565b610454565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004611c38565b61047b565b005b600d546101a690600160a01b900460ff1681565b6008545b6040519081526020016101b2565b61020e610244366004611c62565b610595565b600d546101e3906001600160a01b031681565b61022861026a366004611c38565b6105c6565b61020e61027d366004611c62565b61065c565b610228610290366004611c03565b610677565b61020e6102a3366004611d09565b61070a565b6101e36102b6366004611c03565b6108c3565b600c546101e3906001600160a01b031681565b61020e6102dc366004611c03565b610923565b6102286102ef366004611d9f565b610aab565b600d546101a690600160a81b900460ff1681565b6101c3610b31565b61020e61031e366004611dba565b610b40565b61020e610331366004611df6565b610b4b565b6101c3610344366004611c03565b610b83565b61020e610357366004611eb6565b610bea565b610228610d71565b6101c3610d81565b610228600b5481565b6101a6610383366004611f43565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006103bc82610e0f565b92915050565b6060600080546103d190611f76565b80601f01602080910402602001604051908101604052809291908181526020018280546103fd90611f76565b801561044a5780601f1061041f5761010080835404028352916020019161044a565b820191906000526020600020905b81548152906001019060200180831161042d57829003601f168201915b5050505050905090565b600061045f82610e34565b506000908152600460205260409020546001600160a01b031690565b6000610486826108c3565b9050806001600160a01b0316836001600160a01b0316036104f85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061051457506105148133610383565b6105865760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ef565b6105908383610e93565b505050565b61059f3382610f01565b6105bb5760405162461bcd60e51b81526004016104ef90611fb0565b610590838383610f80565b60006105d183610aab565b82106106335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104ef565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61059083838360405180602001604052806000815250610b4b565b600061068260085490565b82106106e55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104ef565b600882815481106106f8576106f8611ffd565b90600052602060002001549050919050565b600c546001600160a01b0316158061078c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078a9190612013565b115b806108145750600d546001600160a01b031615806108145750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190612013565b115b6108305760405162461bcd60e51b81526004016104ef9061202c565b600d54600160a01b900460ff1661087f5760405162461bcd60e51b81526020600482015260136024820152724e4f545f52454d4f54455f4255524e41424c4560681b60448201526064016104ef565b60005b81518110156108bf576108ad8282815181106108a0576108a0611ffd565b60200260200101516110f1565b806108b78161206a565b915050610882565b5050565b6000818152600260205260408120546001600160a01b0316806103bc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600c546001600160a01b031615806109a55750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190612013565b115b80610a2d5750600d546001600160a01b03161580610a2d5750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2b9190612013565b115b610a495760405162461bcd60e51b81526004016104ef9061202c565b600854811015610aa65760405162461bcd60e51b815260206004820152602260248201527f4d41585f535550504c595f4c4f5745525f5448414e5f544f54414c5f535550506044820152614c5960f01b60648201526084016104ef565b600b55565b60006001600160a01b038216610b155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ef565b506001600160a01b031660009081526003602052604090205490565b6060600180546103d190611f76565b6108bf338383611194565b610b553383610f01565b610b715760405162461bcd60e51b81526004016104ef90611fb0565b610b7d84848484611262565b50505050565b6060610b8e82610e34565b6000610b98611295565b90506000815111610bb85760405180602001604052806000815250610be3565b80610bc2846112a4565b604051602001610bd3929190612083565b6040516020818303038152906040525b9392505050565b600c546001600160a01b03161580610c6c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190612013565b115b80610cf45750600d546001600160a01b03161580610cf45750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190612013565b115b610d105760405162461bcd60e51b81526004016104ef9061202c565b600b548151600a54610d2291906120b2565b1115610d655760405162461bcd60e51b815260206004820152601260248201527113505617d4d55414131657d4915050d2115160721b60448201526064016104ef565b610d6e81611337565b50565b6000610d7c600a5490565b905090565b600e8054610d8e90611f76565b80601f0160208091040260200160405190810160405280929190818152602001828054610dba90611f76565b8015610e075780601f10610ddc57610100808354040283529160200191610e07565b820191906000526020600020905b815481529060010190602001808311610dea57829003601f168201915b505050505081565b60006001600160e01b0319821663780e9d6360e01b14806103bc57506103bc8261139e565b6000818152600260205260409020546001600160a01b0316610d6e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ec8826108c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f0d836108c3565b9050806001600160a01b0316846001600160a01b03161480610f5457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610f785750836001600160a01b0316610f6d84610454565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f93826108c3565b6001600160a01b031614610fb95760405162461bcd60e51b81526004016104ef906120c5565b6001600160a01b03821661101b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ef565b61102883838360016113ee565b826001600160a01b031661103b826108c3565b6001600160a01b0316146110615760405162461bcd60e51b81526004016104ef906120c5565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110fc826108c3565b905061110c8160008460016113ee565b611115826108c3565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104ef565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61126d848484610f80565b61127984848484611470565b610b7d5760405162461bcd60e51b81526004016104ef9061210a565b6060600e80546103d190611f76565b606060006112b183611571565b600101905060008167ffffffffffffffff8111156112d1576112d1611c9e565b6040519080825280601f01601f1916602001820160405280156112fb576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461130557509392505050565b60005b81518110156108bf5761137e82828151811061135857611358611ffd565b6020026020010151611369600a5490565b60405180602001604052806000815250611649565b61138c600a80546001019055565b806113968161206a565b91505061133a565b60006001600160e01b031982166380ac58cd60e01b14806113cf57506001600160e01b03198216635b5e139f60e01b145b806103bc57506301ffc9a760e01b6001600160e01b03198316146103bc565b6001600160a01b0384161580159061140e57506001600160a01b03831615155b80156114245750600d54600160a81b900460ff16155b156114645760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b60448201526064016104ef565b610b7d8484848461167c565b60006001600160a01b0384163b1561156657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114b490339089908890889060040161215c565b6020604051808303816000875af19250505080156114ef575060408051601f3d908101601f191682019092526114ec91810190612199565b60015b61154c573d80801561151d576040519150601f19603f3d011682016040523d82523d6000602084013e611522565b606091505b5080516000036115445760405162461bcd60e51b81526004016104ef9061210a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f78565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106115b05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106115dc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106115fa57662386f26fc10000830492506010015b6305f5e1008310611612576305f5e100830492506008015b612710831061162657612710830492506004015b60648310611638576064830492506002015b600a83106103bc5760010192915050565b61165383836117bc565b6116606000848484611470565b6105905760405162461bcd60e51b81526004016104ef9061210a565b61168884848484611955565b60018111156116f75760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016104ef565b816001600160a01b0385166117535761174e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611776565b836001600160a01b0316856001600160a01b0316146117765761177685826119dd565b6001600160a01b0384166117925761178d81611a7a565b6117b5565b846001600160a01b0316846001600160a01b0316146117b5576117b58482611b29565b5050505050565b6001600160a01b0382166118125760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ef565b6000818152600260205260409020546001600160a01b0316156118775760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6118856000838360016113ee565b6000818152600260205260409020546001600160a01b0316156118ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001811115610b7d576001600160a01b0384161561199b576001600160a01b038416600090815260036020526040812080548392906119959084906121b6565b90915550505b6001600160a01b03831615610b7d576001600160a01b038316600090815260036020526040812080548392906119d29084906120b2565b909155505050505050565b600060016119ea84610aab565b6119f491906121b6565b600083815260076020526040902054909150808214611a47576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611a8c906001906121b6565b60008381526009602052604081205460088054939450909284908110611ab457611ab4611ffd565b906000526020600020015490508060088381548110611ad557611ad5611ffd565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b0d57611b0d6121c9565b6001900381819060005260206000200160009055905550505050565b6000611b3483610aab565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610d6e57600080fd5b600060208284031215611b9557600080fd5b8135610be381611b6d565b60005b83811015611bbb578181015183820152602001611ba3565b50506000910152565b60008151808452611bdc816020860160208601611ba0565b601f01601f19169290920160200192915050565b602081526000610be36020830184611bc4565b600060208284031215611c1557600080fd5b5035919050565b80356001600160a01b0381168114611c3357600080fd5b919050565b60008060408385031215611c4b57600080fd5b611c5483611c1c565b946020939093013593505050565b600080600060608486031215611c7757600080fd5b611c8084611c1c565b9250611c8e60208501611c1c565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611cdd57611cdd611c9e565b604052919050565b600067ffffffffffffffff821115611cff57611cff611c9e565b5060051b60200190565b60006020808385031215611d1c57600080fd5b823567ffffffffffffffff811115611d3357600080fd5b8301601f81018513611d4457600080fd5b8035611d57611d5282611ce5565b611cb4565b81815260059190911b82018301908381019087831115611d7657600080fd5b928401925b82841015611d9457833582529284019290840190611d7b565b979650505050505050565b600060208284031215611db157600080fd5b610be382611c1c565b60008060408385031215611dcd57600080fd5b611dd683611c1c565b915060208301358015158114611deb57600080fd5b809150509250929050565b60008060008060808587031215611e0c57600080fd5b611e1585611c1c565b93506020611e24818701611c1c565b935060408601359250606086013567ffffffffffffffff80821115611e4857600080fd5b818801915088601f830112611e5c57600080fd5b813581811115611e6e57611e6e611c9e565b611e80601f8201601f19168501611cb4565b91508082528984828501011115611e9657600080fd5b808484018584013760008482840101525080935050505092959194509250565b60006020808385031215611ec957600080fd5b823567ffffffffffffffff811115611ee057600080fd5b8301601f81018513611ef157600080fd5b8035611eff611d5282611ce5565b81815260059190911b82018301908381019087831115611f1e57600080fd5b928401925b82841015611d9457611f3484611c1c565b82529284019290840190611f23565b60008060408385031215611f5657600080fd5b611f5f83611c1c565b9150611f6d60208401611c1c565b90509250929050565b600181811c90821680611f8a57607f821691505b602082108103611faa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561202557600080fd5b5051919050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161207c5761207c612054565b5060010190565b60008351612095818460208801611ba0565b8351908301906120a9818360208801611ba0565b01949350505050565b808201808211156103bc576103bc612054565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061218f90830184611bc4565b9695505050505050565b6000602082840312156121ab57600080fd5b8151610be381611b6d565b818103818111156103bc576103bc612054565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e8152b9960944a2fd38286972b6dc3d8a3cffd1232a5105e82f02c12af7f532064736f6c63430008110033" +// Deprecated: Use MasterTokenMetaData.Bin instead. +var MasterTokenBin = MasterTokenMetaData.Bin // DeployMasterToken deploys a new Ethereum contract, binding an instance of MasterToken to it. func DeployMasterToken(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _baseTokenURI string, _ownerToken common.Address) (common.Address, *types.Transaction, *MasterToken, error) { - parsed, err := abi.JSON(strings.NewReader(MasterTokenABI)) + parsed, err := MasterTokenMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(MasterTokenBin), backend, _name, _symbol, _baseTokenURI, _ownerToken) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MasterTokenBin), backend, _name, _symbol, _baseTokenURI, _ownerToken) if err != nil { return common.Address{}, nil, nil, err } @@ -143,11 +157,11 @@ func NewMasterTokenFilterer(address common.Address, filterer bind.ContractFilter // bindMasterToken binds a generic wrapper to an already deployed contract. func bindMasterToken(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(MasterTokenABI)) + parsed, err := MasterTokenMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and diff --git a/contracts/community-tokens/mastertoken/MasterToken.sol b/contracts/community-tokens/mastertoken/MasterToken.sol new file mode 100644 index 000000000..a80b46021 --- /dev/null +++ b/contracts/community-tokens/mastertoken/MasterToken.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Mozilla Public License 2.0 +pragma solidity ^0.8.17; + +import "./BaseToken.sol"; + +contract MasterToken is BaseToken { + constructor( + string memory _name, + string memory _symbol, + string memory _baseTokenURI, + address _ownerToken + ) + BaseToken(_name, _symbol, type(uint256).max, true, false, _baseTokenURI, _ownerToken, address(0x0)) + { } +} diff --git a/contracts/community-tokens/ownertoken/OwnerToken.go b/contracts/community-tokens/ownertoken/OwnerToken.go index eee02f00b..70374ae23 100644 --- a/contracts/community-tokens/ownertoken/OwnerToken.go +++ b/contracts/community-tokens/ownertoken/OwnerToken.go @@ -4,6 +4,7 @@ package ownertoken import ( + "errors" "math/big" "strings" @@ -17,6 +18,7 @@ import ( // Reference imports to suppress errors if they are not otherwise used. var ( + _ = errors.New _ = big.NewInt _ = strings.NewReader _ = ethereum.NotFound @@ -24,22 +26,34 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) +// OwnerTokenMetaData contains all meta data concerning the OwnerToken contract. +var OwnerTokenMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_signerPublicKey\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_newSignerPublicKey\",\"type\":\"bytes\"}],\"name\":\"setSignerPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"signerPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b506040516200391238038062003912833981016040819052620000349162000adb565b848460016000818730808787866200004d838262000c44565b5060016200005c828262000c44565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009b848262000c44565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055151580620000e25750600d546001600160a01b031615155b620001345760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206f72206d617374657220746f6b656e732072657175697265640060448201526064015b60405180910390fd5b505050505050505080600f90816200014d919062000c44565b5060408051600180825281830190925260009160208083019080368337019050509050828160008151811062000187576200018762000d10565b6001600160a01b0390921660209283029190910190910152620001aa81620001b6565b50505050505062000e13565b60005b81518110156200023c5762000210828281518110620001dc57620001dc62000d10565b6020026020010151620001fb600a6200024060201b6200125a1760201c565b60408051602081019091526000815262000244565b62000227600a620002bc60201b6200125e1760201c565b80620002338162000d3c565b915050620001b9565b5050565b5490565b620002508383620002c5565b6200025f600084848462000466565b620002b75760405162461bcd60e51b81526020600482015260326024820152600080516020620038f283398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200012b565b505050565b80546001019055565b6001600160a01b0382166200031d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200012b565b6000818152600260205260409020546001600160a01b031615620003845760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200012b565b62000394600083836001620005c2565b6000818152600260205260409020546001600160a01b031615620003fb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200012b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000487846001600160a01b03166200065b60201b620012671760201c565b15620005b657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620004c190339089908890889060040162000d58565b6020604051808303816000875af1925050508015620004ff575060408051601f3d908101601f19168201909252620004fc9181019062000dae565b60015b6200059b573d80801562000530576040519150601f19603f3d011682016040523d82523d6000602084013e62000535565b606091505b508051600003620005935760405162461bcd60e51b81526020600482015260326024820152600080516020620038f283398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200012b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620005ba565b5060015b949350505050565b6001600160a01b03841615801590620005e357506001600160a01b03831615155b8015620005fa5750600d54600160a81b900460ff16155b156200063c5760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b60448201526064016200012b565b62000655848484846200066a60201b620012761760201c565b50505050565b6001600160a01b03163b151590565b62000683848484846200065560201b62000fdc1760201c565b6001811115620006fc5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f72746564000000000000000000000060648201526084016200012b565b816001600160a01b0385166200075b576200075581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000781565b836001600160a01b0316856001600160a01b0316146200078157620007818582620007ce565b6001600160a01b038416620007a1576200079b816200087b565b620007c7565b846001600160a01b0316846001600160a01b031614620007c757620007c7848262000935565b5050505050565b60006001620007e8846200098660201b62000d0c1760201c565b620007f4919062000de1565b60008381526007602052604090205490915080821462000848576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906200088f9060019062000de1565b60008381526009602052604081205460088054939450909284908110620008ba57620008ba62000d10565b906000526020600020015490508060088381548110620008de57620008de62000d10565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000919576200091962000dfd565b6001900381819060005260206000200160009055905550505050565b60006200094d836200098660201b62000d0c1760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620009f25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016200012b565b506001600160a01b031660009081526003602052604090205490565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000a4157818101518382015260200162000a27565b50506000910152565b600082601f83011262000a5c57600080fd5b81516001600160401b038082111562000a795762000a7962000a0e565b604051601f8301601f19908116603f0116810190828211818310171562000aa45762000aa462000a0e565b8160405283815286602085880101111562000abe57600080fd5b62000ad184602083016020890162000a24565b9695505050505050565b600080600080600060a0868803121562000af457600080fd5b85516001600160401b038082111562000b0c57600080fd5b62000b1a89838a0162000a4a565b9650602088015191508082111562000b3157600080fd5b62000b3f89838a0162000a4a565b9550604088015191508082111562000b5657600080fd5b62000b6489838a0162000a4a565b606089015190955091506001600160a01b038216821462000b8457600080fd5b60808801519193508082111562000b9a57600080fd5b5062000ba98882890162000a4a565b9150509295509295909350565b600181811c9082168062000bcb57607f821691505b60208210810362000bec57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002b757600081815260208120601f850160051c8101602086101562000c1b5750805b601f850160051c820191505b8181101562000c3c5782815560010162000c27565b505050505050565b81516001600160401b0381111562000c605762000c6062000a0e565b62000c788162000c71845462000bb6565b8462000bf2565b602080601f83116001811462000cb0576000841562000c975750858301515b600019600386901b1c1916600185901b17855562000c3c565b600085815260208120601f198616915b8281101562000ce15788860151825594840194600190910190840162000cc0565b508582101562000d005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000d515762000d5162000d26565b5060010190565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000d978160a085016020870162000a24565b601f01601f19169190910160a00195945050505050565b60006020828403121562000dc157600080fd5b81516001600160e01b03198116811462000dda57600080fd5b9392505050565b8181038181111562000df75762000df762000d26565b92915050565b634e487b7160e01b600052603160045260246000fd5b612acf8062000e236000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806365371883116100f9578063b88d4fde11610097578063cf721b1511610071578063cf721b15146103d0578063d547cfb7146103d8578063d5abeb01146103e0578063e985e9c5146103e957600080fd5b8063b88d4fde14610397578063c87b56dd146103aa578063ce7c8b49146103bd57600080fd5b806392ff0d31116100d357806392ff0d31146103435780639404c91a1461036957806395d89b411461037c578063a22cb4651461038457600080fd5b8063653718831461030a5780636f8b44b01461031d57806370a082311461033057600080fd5b80632bb5e31e116101665780634f6ccce7116101405780634f6ccce7146102c95780634fb95e02146102dc578063549a95ea146102ef5780636352211e146102f757600080fd5b80632bb5e31e146102905780632f745c59146102a357806342842e0e146102b657600080fd5b8063095ea7b3116101a2578063095ea7b314610231578063101639f51461024657806318160ddd1461026b57806323b872dd1461027d57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004612322565b610425565b60405190151581526020015b60405180910390f35b6101f9610436565b6040516101e891906123ad565b6102196102143660046123c0565b6104c8565b6040516001600160a01b0390911681526020016101e8565b61024461023f3660046123f5565b6104ef565b005b600d546101dc9074010000000000000000000000000000000000000000900460ff1681565b6008545b6040519081526020016101e8565b61024461028b36600461241f565b610625565b600d54610219906001600160a01b031681565b61026f6102b13660046123f5565b6106ac565b6102446102c436600461241f565b610754565b61026f6102d73660046123c0565b61076f565b6102446102ea3660046124fd565b610813565b6101f9610a49565b6102196103053660046123c0565b610ad7565b600c54610219906001600160a01b031681565b61024461032b3660046123c0565b610b3c565b61026f61033e366004612593565b610d0c565b600d546101dc907501000000000000000000000000000000000000000000900460ff1681565b61024461037736600461263c565b610da6565b6101f9610f3a565b610244610392366004612671565b610f49565b6102446103a53660046126ad565b610f54565b6101f96103b83660046123c0565b610fe2565b6102446103cb366004612715565b611049565b61026f61123d565b6101f961124d565b61026f600b5481565b6101dc6103f73660046127a2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000610430826113b2565b92915050565b606060008054610445906127d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610471906127d5565b80156104be5780601f10610493576101008083540402835291602001916104be565b820191906000526020600020905b8154815290600101906020018083116104a157829003601f168201915b5050505050905090565b60006104d382611408565b506000908152600460205260409020546001600160a01b031690565b60006104fa82610ad7565b9050806001600160a01b0316836001600160a01b0316036105885760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806105a457506105a481336103f7565b6106165760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161057f565b610620838361146c565b505050565b61062f33826114f2565b6106a15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161057f565b610620838383611571565b60006106b783610d0c565b821061072b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161057f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61062083838360405180602001604052806000815250610f54565b600061077a60085490565b82106107ee5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161057f565b6008828154811061080157610801612828565b90600052602060002001549050919050565b600c546001600160a01b031615806108ae5750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ac9190612857565b115b8061094f5750600d546001600160a01b0316158061094f5750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d9190612857565b115b61099b5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161057f565b600d5474010000000000000000000000000000000000000000900460ff16610a055760405162461bcd60e51b815260206004820152601360248201527f4e4f545f52454d4f54455f4255524e41424c4500000000000000000000000000604482015260640161057f565b60005b8151811015610a4557610a33828281518110610a2657610a26612828565b60200260200101516117bf565b80610a3d8161289f565b915050610a08565b5050565b600f8054610a56906127d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a82906127d5565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b0316806104305760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161057f565b600c546001600160a01b03161580610bd75750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd59190612857565b115b80610c785750600d546001600160a01b03161580610c785750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c769190612857565b115b610cc45760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161057f565b60405162461bcd60e51b815260206004820152601160248201527f6d617820737570706c79206c6f636b6564000000000000000000000000000000604482015260640161057f565b60006001600160a01b038216610d8a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161057f565b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b03161580610e415750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190612857565b115b80610ee25750600d546001600160a01b03161580610ee25750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190612857565b115b610f2e5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161057f565b600f610a458282612907565b606060018054610445906127d5565b610a4533838361187a565b610f5e33836114f2565b610fd05760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161057f565b610fdc84848484611966565b50505050565b6060610fed82611408565b6000610ff76119ef565b905060008151116110175760405180602001604052806000815250611042565b80611021846119fe565b6040516020016110329291906129e5565b6040516020818303038152906040525b9392505050565b600c546001600160a01b031615806110e45750600c546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e29190612857565b115b806111855750600d546001600160a01b031615806111855750600d546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561115f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111839190612857565b115b6111d15760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a6564000000000000000000000000000000000000604482015260640161057f565b600b548151600a546111e39190612a14565b11156112315760405162461bcd60e51b815260206004820152601260248201527f4d41585f535550504c595f524541434845440000000000000000000000000000604482015260640161057f565b61123a81611a9e565b50565b6000611248600a5490565b905090565b600e8054610a56906127d5565b5490565b80546001019055565b6001600160a01b03163b151590565b60018111156112ed5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f727465640000000000000000000000606482015260840161057f565b816001600160a01b0385166113495761134481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61136c565b836001600160a01b0316856001600160a01b03161461136c5761136c8582611b05565b6001600160a01b0384166113885761138381611ba2565b6113ab565b846001600160a01b0316846001600160a01b0316146113ab576113ab8482611c51565b5050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610430575061043082611c95565b6000818152600260205260409020546001600160a01b031661123a5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161057f565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915581906114b982610ad7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806114fe83610ad7565b9050806001600160a01b0316846001600160a01b0316148061154557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806115695750836001600160a01b031661155e846104c8565b6001600160a01b0316145b949350505050565b826001600160a01b031661158482610ad7565b6001600160a01b0316146116005760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161057f565b6001600160a01b03821661167b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161057f565b6116888383836001611d78565b826001600160a01b031661169b82610ad7565b6001600160a01b0316146117175760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161057f565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006117ca82610ad7565b90506117da816000846001611d78565b6117e382610ad7565b600083815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036118db5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057f565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611971848484611571565b61197d84848484611e19565b610fdc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161057f565b6060600e8054610445906127d5565b60606000611a0b83611fd8565b600101905060008167ffffffffffffffff811115611a2b57611a2b61245b565b6040519080825280601f01601f191660200182016040528015611a55576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084611a5f57509392505050565b60005b8151811015610a4557611ae5828281518110611abf57611abf612828565b6020026020010151611ad0600a5490565b604051806020016040528060008152506120ba565b611af3600a80546001019055565b80611afd8161289f565b915050611aa1565b60006001611b1284610d0c565b611b1c9190612a27565b600083815260076020526040902054909150808214611b6f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611bb490600190612a27565b60008381526009602052604081205460088054939450909284908110611bdc57611bdc612828565b906000526020600020015490508060088381548110611bfd57611bfd612828565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611c3557611c35612a3a565b6001900381819060005260206000200160009055905550505050565b6000611c5c83610d0c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611d2857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061043057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610430565b6001600160a01b03841615801590611d9857506001600160a01b03831615155b8015611dc05750600d547501000000000000000000000000000000000000000000900460ff16155b15611e0d5760405162461bcd60e51b815260206004820152601060248201527f6e6f74207472616e7366657261626c6500000000000000000000000000000000604482015260640161057f565b610fdc84848484611276565b60006001600160a01b0384163b15611fcd576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611e76903390899088908890600401612a69565b6020604051808303816000875af1925050508015611ecf575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ecc91810190612aa5565b60015b611f82573d808015611efd576040519150601f19603f3d011682016040523d82523d6000602084013e611f02565b606091505b508051600003611f7a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161057f565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611569565b506001949350505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612021577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061204d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061206b57662386f26fc10000830492506010015b6305f5e1008310612083576305f5e100830492506008015b612710831061209757612710830492506004015b606483106120a9576064830492506002015b600a83106104305760010192915050565b6120c48383612143565b6120d16000848484611e19565b6106205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161057f565b6001600160a01b0382166121995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057f565b6000818152600260205260409020546001600160a01b0316156121fe5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057f565b61220c600083836001611d78565b6000818152600260205260409020546001600160a01b0316156122715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461123a57600080fd5b60006020828403121561233457600080fd5b8135611042816122f4565b60005b8381101561235a578181015183820152602001612342565b50506000910152565b6000815180845261237b81602086016020860161233f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006110426020830184612363565b6000602082840312156123d257600080fd5b5035919050565b80356001600160a01b03811681146123f057600080fd5b919050565b6000806040838503121561240857600080fd5b612411836123d9565b946020939093013593505050565b60008060006060848603121561243457600080fd5b61243d846123d9565b925061244b602085016123d9565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124d1576124d161245b565b604052919050565b600067ffffffffffffffff8211156124f3576124f361245b565b5060051b60200190565b6000602080838503121561251057600080fd5b823567ffffffffffffffff81111561252757600080fd5b8301601f8101851361253857600080fd5b803561254b612546826124d9565b61248a565b81815260059190911b8201830190838101908783111561256a57600080fd5b928401925b828410156125885783358252928401929084019061256f565b979650505050505050565b6000602082840312156125a557600080fd5b611042826123d9565b600082601f8301126125bf57600080fd5b813567ffffffffffffffff8111156125d9576125d961245b565b61260a60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161248a565b81815284602083860101111561261f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561264e57600080fd5b813567ffffffffffffffff81111561266557600080fd5b611569848285016125ae565b6000806040838503121561268457600080fd5b61268d836123d9565b9150602083013580151581146126a257600080fd5b809150509250929050565b600080600080608085870312156126c357600080fd5b6126cc856123d9565b93506126da602086016123d9565b925060408501359150606085013567ffffffffffffffff8111156126fd57600080fd5b612709878288016125ae565b91505092959194509250565b6000602080838503121561272857600080fd5b823567ffffffffffffffff81111561273f57600080fd5b8301601f8101851361275057600080fd5b803561275e612546826124d9565b81815260059190911b8201830190838101908783111561277d57600080fd5b928401925b8284101561258857612793846123d9565b82529284019290840190612782565b600080604083850312156127b557600080fd5b6127be836123d9565b91506127cc602084016123d9565b90509250929050565b600181811c908216806127e957607f821691505b602082108103612822577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561286957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060001982036128b2576128b2612870565b5060010190565b601f82111561062057600081815260208120601f850160051c810160208610156128e05750805b601f850160051c820191505b818110156128ff578281556001016128ec565b505050505050565b815167ffffffffffffffff8111156129215761292161245b565b6129358161292f84546127d5565b846128b9565b602080601f83116001811461296a57600084156129525750858301515b600019600386901b1c1916600185901b1785556128ff565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156129b757888601518255948401946001909101908401612998565b50858210156129d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516129f781846020880161233f565b835190830190612a0b81836020880161233f565b01949350505050565b8082018082111561043057610430612870565b8181038181111561043057610430612870565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152612a9b6080830184612363565b9695505050505050565b600060208284031215612ab757600080fd5b8151611042816122f456fea164736f6c6343000811000a4552433732313a207472616e7366657220746f206e6f6e204552433732315265", +} + // OwnerTokenABI is the input ABI used to generate the binding from. -const OwnerTokenABI = "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_baseTokenURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_masterName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_masterSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_masterBaseTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"_signerPublicKey\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"masterToken\",\"type\":\"address\"}],\"name\":\"MasterTokenCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintedCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ownerToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"remoteBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"remoteBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxSupply\",\"type\":\"uint256\"}],\"name\":\"setMaxSupply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_newSignerPublicKey\",\"type\":\"bytes\"}],\"name\":\"setSignerPublicKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"signerPublicKey\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" +// Deprecated: Use OwnerTokenMetaData.ABI instead. +var OwnerTokenABI = OwnerTokenMetaData.ABI // OwnerTokenBin is the compiled bytecode used for deploying new contracts. -var OwnerTokenBin = "0x60806040523480156200001157600080fd5b5060405162005b6938038062005b69833981016040819052620000349162000bfb565b868660016000818930808787866200004d838262000db9565b5060016200005c828262000db9565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009b848262000db9565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055151580620000e25750600d546001600160a01b031615155b620001345760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206f72206d617374657220746f6b656e732072657175697265640060448201526064015b60405180910390fd5b505050505050505080600f90816200014d919062000db9565b50600084848430604051620001629062000b20565b62000171949392919062000eb3565b604051809103906000f0801580156200018e573d6000803e3d6000fd5b506040516001600160a01b03821681529091507f02a0dab88b41e2a6fa5a9b4d40c16209315d6158c6a42f30879c8df1871326019060200160405180910390a160408051600180825281830190925260009160208083019080368337019050509050338160008151811062000207576200020762000f0c565b6001600160a01b03909216602092830291909101909101526200022a8162000239565b50505050505050505062001004565b60005b8151811015620002bf57620002938282815181106200025f576200025f62000f0c565b60200260200101516200027e600a620002c360201b62000f791760201c565b604080516020810190915260008152620002c7565b620002aa600a6200033f60201b62000f7d1760201c565b80620002b68162000f38565b9150506200023c565b5050565b5490565b620002d3838362000348565b620002e26000848484620004e9565b6200033a5760405162461bcd60e51b8152602060048201526032602482015260008051602062005b4983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200012b565b505050565b80546001019055565b6001600160a01b038216620003a05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200012b565b6000818152600260205260409020546001600160a01b031615620004075760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200012b565b6200041760008383600162000645565b6000818152600260205260409020546001600160a01b0316156200047e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200012b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200050a846001600160a01b0316620006de60201b62000f861760201c565b156200063957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200054490339089908890889060040162000f54565b6020604051808303816000875af192505050801562000582575060408051601f3d908101601f191682019092526200057f9181019062000f89565b60015b6200061e573d808015620005b3576040519150601f19603f3d011682016040523d82523d6000602084013e620005b8565b606091505b508051600003620006165760405162461bcd60e51b8152602060048201526032602482015260008051602062005b4983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200012b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200063d565b5060015b949350505050565b6001600160a01b038416158015906200066657506001600160a01b03831615155b80156200067d5750600d54600160a81b900460ff16155b15620006bf5760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b60448201526064016200012b565b620006d884848484620006ed60201b62000f951760201c565b50505050565b6001600160a01b03163b151590565b62000706848484846200085160201b620010d51760201c565b60018111156200077f5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f72746564000000000000000000000060648201526084016200012b565b816001600160a01b038516620007de57620007d881600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000804565b836001600160a01b0316856001600160a01b0316146200080457620008048582620008e0565b6001600160a01b03841662000824576200081e816200098d565b6200084a565b846001600160a01b0316846001600160a01b0316146200084a576200084a848262000a47565b5050505050565b6001811115620006d8576001600160a01b038416156200089b576001600160a01b038416600090815260036020526040812080548392906200089590849062000fbc565b90915550505b6001600160a01b03831615620006d8576001600160a01b03831660009081526003602052604081208054839290620008d590849062000fd8565b909155505050505050565b60006001620008fa8462000a9860201b62000b641760201c565b62000906919062000fbc565b6000838152600760205260409020549091508082146200095a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620009a19060019062000fbc565b60008381526009602052604081205460088054939450909284908110620009cc57620009cc62000f0c565b906000526020600020015490508060088381548110620009f057620009f062000f0c565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000a2b5762000a2b62000fee565b6001900381819060005260206000200160009055905550505050565b600062000a5f8362000a9860201b62000b641760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000b045760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016200012b565b506001600160a01b031660009081526003602052604090205490565b61263f806200350a83390190565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000b6157818101518382015260200162000b47565b50506000910152565b600082601f83011262000b7c57600080fd5b81516001600160401b038082111562000b995762000b9962000b2e565b604051601f8301601f19908116603f0116810190828211818310171562000bc45762000bc462000b2e565b8160405283815286602085880101111562000bde57600080fd5b62000bf184602083016020890162000b44565b9695505050505050565b600080600080600080600060e0888a03121562000c1757600080fd5b87516001600160401b038082111562000c2f57600080fd5b62000c3d8b838c0162000b6a565b985060208a015191508082111562000c5457600080fd5b62000c628b838c0162000b6a565b975060408a015191508082111562000c7957600080fd5b62000c878b838c0162000b6a565b965060608a015191508082111562000c9e57600080fd5b62000cac8b838c0162000b6a565b955060808a015191508082111562000cc357600080fd5b62000cd18b838c0162000b6a565b945060a08a015191508082111562000ce857600080fd5b62000cf68b838c0162000b6a565b935060c08a015191508082111562000d0d57600080fd5b5062000d1c8a828b0162000b6a565b91505092959891949750929550565b600181811c9082168062000d4057607f821691505b60208210810362000d6157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200033a57600081815260208120601f850160051c8101602086101562000d905750805b601f850160051c820191505b8181101562000db15782815560010162000d9c565b505050505050565b81516001600160401b0381111562000dd55762000dd562000b2e565b62000ded8162000de6845462000d2b565b8462000d67565b602080601f83116001811462000e25576000841562000e0c5750858301515b600019600386901b1c1916600185901b17855562000db1565b600085815260208120601f198616915b8281101562000e565788860151825594840194600190910190840162000e35565b508582101562000e755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815180845262000e9f81602086016020860162000b44565b601f01601f19169290920160200192915050565b60808152600062000ec8608083018762000e85565b828103602084015262000edc818762000e85565b9050828103604084015262000ef2818662000e85565b91505060018060a01b038316606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000f4d5762000f4d62000f22565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009062000bf19083018462000e85565b60006020828403121562000f9c57600080fd5b81516001600160e01b03198116811462000fb557600080fd5b9392505050565b8181038181111562000fd25762000fd262000f22565b92915050565b8082018082111562000fd25762000fd262000f22565b634e487b7160e01b600052603160045260246000fd5b6124f680620010146000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806365371883116100f9578063b88d4fde11610097578063cf721b1511610071578063cf721b15146103ad578063d547cfb7146103b5578063d5abeb01146103bd578063e985e9c5146103c657600080fd5b8063b88d4fde14610374578063c87b56dd14610387578063ce7c8b491461039a57600080fd5b806392ff0d31116100d357806392ff0d31146103325780639404c91a1461034657806395d89b4114610359578063a22cb4651461036157600080fd5b806365371883146102f95780636f8b44b01461030c57806370a082311461031f57600080fd5b80632bb5e31e116101665780634f6ccce7116101405780634f6ccce7146102b85780634fb95e02146102cb578063549a95ea146102de5780636352211e146102e657600080fd5b80632bb5e31e1461027f5780632f745c591461029257806342842e0e146102a557600080fd5b8063095ea7b3116101a2578063095ea7b314610231578063101639f51461024657806318160ddd1461025a57806323b872dd1461026c57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004611d09565b610402565b60405190151581526020015b60405180910390f35b6101f9610413565b6040516101e89190611d76565b610219610214366004611d89565b6104a5565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004611dbe565b6104cc565b005b600d546101dc90600160a01b900460ff1681565b6008545b6040519081526020016101e8565b61024461027a366004611de8565b6105e6565b600d54610219906001600160a01b031681565b61025e6102a0366004611dbe565b610617565b6102446102b3366004611de8565b6106ad565b61025e6102c6366004611d89565b6106c8565b6102446102d9366004611e8f565b61075b565b6101f9610914565b6102196102f4366004611d89565b6109a2565b600c54610219906001600160a01b031681565b61024461031a366004611d89565b610a02565b61025e61032d366004611f25565b610b64565b600d546101dc90600160a81b900460ff1681565b610244610354366004611fb0565b610bea565b6101f9610d1c565b61024461036f366004611fe5565b610d2b565b610244610382366004612021565b610d36565b6101f9610395366004611d89565b610d6e565b6102446103a8366004612089565b610dd5565b61025e610f5c565b6101f9610f6c565b61025e600b5481565b6101dc6103d4366004612116565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061040d8261115d565b92915050565b60606000805461042290612149565b80601f016020809104026020016040519081016040528092919081815260200182805461044e90612149565b801561049b5780601f106104705761010080835404028352916020019161049b565b820191906000526020600020905b81548152906001019060200180831161047e57829003601f168201915b5050505050905090565b60006104b082611182565b506000908152600460205260409020546001600160a01b031690565b60006104d7826109a2565b9050806001600160a01b0316836001600160a01b0316036105495760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610565575061056581336103d4565b6105d75760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610540565b6105e183836111e1565b505050565b6105f0338261124f565b61060c5760405162461bcd60e51b815260040161054090612183565b6105e18383836112ce565b600061062283610b64565b82106106845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610540565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6105e183838360405180602001604052806000815250610d36565b60006106d360085490565b82106107365760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610540565b60088281548110610749576107496121d0565b90600052602060002001549050919050565b600c546001600160a01b031615806107dd5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107db91906121e6565b115b806108655750600d546001600160a01b031615806108655750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086391906121e6565b115b6108815760405162461bcd60e51b8152600401610540906121ff565b600d54600160a01b900460ff166108d05760405162461bcd60e51b81526020600482015260136024820152724e4f545f52454d4f54455f4255524e41424c4560681b6044820152606401610540565b60005b8151811015610910576108fe8282815181106108f1576108f16121d0565b602002602001015161143f565b806109088161223d565b9150506108d3565b5050565b600f805461092190612149565b80601f016020809104026020016040519081016040528092919081815260200182805461094d90612149565b801561099a5780601f1061096f5761010080835404028352916020019161099a565b820191906000526020600020905b81548152906001019060200180831161097d57829003601f168201915b505050505081565b6000818152600260205260408120546001600160a01b03168061040d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610540565b600c546001600160a01b03161580610a845750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8291906121e6565b115b80610b0c5750600d546001600160a01b03161580610b0c5750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a91906121e6565b115b610b285760405162461bcd60e51b8152600401610540906121ff565b60405162461bcd60e51b81526020600482015260116024820152701b585e081cdd5c1c1b1e481b1bd8dad959607a1b6044820152606401610540565b60006001600160a01b038216610bce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610540565b506001600160a01b031660009081526003602052604090205490565b600c546001600160a01b03161580610c6c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a91906121e6565b115b80610cf45750600d546001600160a01b03161580610cf45750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf291906121e6565b115b610d105760405162461bcd60e51b8152600401610540906121ff565b600f61091082826122a4565b60606001805461042290612149565b6109103383836114e2565b610d40338361124f565b610d5c5760405162461bcd60e51b815260040161054090612183565b610d68848484846115b0565b50505050565b6060610d7982611182565b6000610d836115e3565b90506000815111610da35760405180602001604052806000815250610dce565b80610dad846115f2565b604051602001610dbe929190612364565b6040516020818303038152906040525b9392505050565b600c546001600160a01b03161580610e575750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5591906121e6565b115b80610edf5750600d546001600160a01b03161580610edf5750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610eb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edd91906121e6565b115b610efb5760405162461bcd60e51b8152600401610540906121ff565b600b548151600a54610f0d9190612393565b1115610f505760405162461bcd60e51b815260206004820152601260248201527113505617d4d55414131657d4915050d2115160721b6044820152606401610540565b610f5981611685565b50565b6000610f67600a5490565b905090565b600e805461092190612149565b5490565b80546001019055565b6001600160a01b03163b151590565b610fa1848484846110d5565b60018111156110105760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610540565b816001600160a01b03851661106c5761106781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61108f565b836001600160a01b0316856001600160a01b03161461108f5761108f85826116ec565b6001600160a01b0384166110ab576110a681611789565b6110ce565b846001600160a01b0316846001600160a01b0316146110ce576110ce8482611838565b5050505050565b6001811115610d68576001600160a01b0384161561111b576001600160a01b038416600090815260036020526040812080548392906111159084906123a6565b90915550505b6001600160a01b03831615610d68576001600160a01b03831660009081526003602052604081208054839290611152908490612393565b909155505050505050565b60006001600160e01b0319821663780e9d6360e01b148061040d575061040d8261187c565b6000818152600260205260409020546001600160a01b0316610f595760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610540565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611216826109a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061125b836109a2565b9050806001600160a01b0316846001600160a01b031614806112a257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806112c65750836001600160a01b03166112bb846104a5565b6001600160a01b0316145b949350505050565b826001600160a01b03166112e1826109a2565b6001600160a01b0316146113075760405162461bcd60e51b8152600401610540906123b9565b6001600160a01b0382166113695760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610540565b61137683838360016118cc565b826001600160a01b0316611389826109a2565b6001600160a01b0316146113af5760405162461bcd60e51b8152600401610540906123b9565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061144a826109a2565b905061145a8160008460016118cc565b611463826109a2565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036115435760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610540565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6115bb8484846112ce565b6115c78484848461194e565b610d685760405162461bcd60e51b8152600401610540906123fe565b6060600e805461042290612149565b606060006115ff83611a4f565b600101905060008167ffffffffffffffff81111561161f5761161f611e24565b6040519080825280601f01601f191660200182016040528015611649576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461165357509392505050565b60005b8151811015610910576116cc8282815181106116a6576116a66121d0565b60200260200101516116b7600a5490565b60405180602001604052806000815250611b27565b6116da600a80546001019055565b806116e48161223d565b915050611688565b600060016116f984610b64565b61170391906123a6565b600083815260076020526040902054909150808214611756576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061179b906001906123a6565b600083815260096020526040812054600880549394509092849081106117c3576117c36121d0565b9060005260206000200154905080600883815481106117e4576117e46121d0565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061181c5761181c612450565b6001900381819060005260206000200160009055905550505050565b600061184383610b64565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982166380ac58cd60e01b14806118ad57506001600160e01b03198216635b5e139f60e01b145b8061040d57506301ffc9a760e01b6001600160e01b031983161461040d565b6001600160a01b038416158015906118ec57506001600160a01b03831615155b80156119025750600d54600160a81b900460ff16155b156119425760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b6044820152606401610540565b610d6884848484610f95565b60006001600160a01b0384163b15611a4457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611992903390899088908890600401612466565b6020604051808303816000875af19250505080156119cd575060408051601f3d908101601f191682019092526119ca918101906124a3565b60015b611a2a573d8080156119fb576040519150601f19603f3d011682016040523d82523d6000602084013e611a00565b606091505b508051600003611a225760405162461bcd60e51b8152600401610540906123fe565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506112c6565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a8e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611aba576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ad857662386f26fc10000830492506010015b6305f5e1008310611af0576305f5e100830492506008015b6127108310611b0457612710830492506004015b60648310611b16576064830492506002015b600a831061040d5760010192915050565b611b318383611b5a565b611b3e600084848461194e565b6105e15760405162461bcd60e51b8152600401610540906123fe565b6001600160a01b038216611bb05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610540565b6000818152600260205260409020546001600160a01b031615611c155760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610540565b611c236000838360016118cc565b6000818152600260205260409020546001600160a01b031615611c885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610540565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610f5957600080fd5b600060208284031215611d1b57600080fd5b8135610dce81611cf3565b60005b83811015611d41578181015183820152602001611d29565b50506000910152565b60008151808452611d62816020860160208601611d26565b601f01601f19169290920160200192915050565b602081526000610dce6020830184611d4a565b600060208284031215611d9b57600080fd5b5035919050565b80356001600160a01b0381168114611db957600080fd5b919050565b60008060408385031215611dd157600080fd5b611dda83611da2565b946020939093013593505050565b600080600060608486031215611dfd57600080fd5b611e0684611da2565b9250611e1460208501611da2565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611e6357611e63611e24565b604052919050565b600067ffffffffffffffff821115611e8557611e85611e24565b5060051b60200190565b60006020808385031215611ea257600080fd5b823567ffffffffffffffff811115611eb957600080fd5b8301601f81018513611eca57600080fd5b8035611edd611ed882611e6b565b611e3a565b81815260059190911b82018301908381019087831115611efc57600080fd5b928401925b82841015611f1a57833582529284019290840190611f01565b979650505050505050565b600060208284031215611f3757600080fd5b610dce82611da2565b600082601f830112611f5157600080fd5b813567ffffffffffffffff811115611f6b57611f6b611e24565b611f7e601f8201601f1916602001611e3a565b818152846020838601011115611f9357600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611fc257600080fd5b813567ffffffffffffffff811115611fd957600080fd5b6112c684828501611f40565b60008060408385031215611ff857600080fd5b61200183611da2565b91506020830135801515811461201657600080fd5b809150509250929050565b6000806000806080858703121561203757600080fd5b61204085611da2565b935061204e60208601611da2565b925060408501359150606085013567ffffffffffffffff81111561207157600080fd5b61207d87828801611f40565b91505092959194509250565b6000602080838503121561209c57600080fd5b823567ffffffffffffffff8111156120b357600080fd5b8301601f810185136120c457600080fd5b80356120d2611ed882611e6b565b81815260059190911b820183019083810190878311156120f157600080fd5b928401925b82841015611f1a5761210784611da2565b825292840192908401906120f6565b6000806040838503121561212957600080fd5b61213283611da2565b915061214060208401611da2565b90509250929050565b600181811c9082168061215d57607f821691505b60208210810361217d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156121f857600080fd5b5051919050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161224f5761224f612227565b5060010190565b601f8211156105e157600081815260208120601f850160051c8101602086101561227d5750805b601f850160051c820191505b8181101561229c57828155600101612289565b505050505050565b815167ffffffffffffffff8111156122be576122be611e24565b6122d2816122cc8454612149565b84612256565b602080601f83116001811461230757600084156122ef5750858301515b600019600386901b1c1916600185901b17855561229c565b600085815260208120601f198616915b8281101561233657888601518255948401946001909101908401612317565b50858210156123545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351612376818460208801611d26565b83519083019061238a818360208801611d26565b01949350505050565b8082018082111561040d5761040d612227565b8181038181111561040d5761040d612227565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061249990830184611d4a565b9695505050505050565b6000602082840312156124b557600080fd5b8151610dce81611cf356fea26469706673582212205d36cc9d9c3ba8e2c7aeea69cbb43f31d98de9c2bedfefb95670e64d5b45319364736f6c6343000811003360806040523480156200001157600080fd5b506040516200263f3803806200263f83398101604081905262000034916200020c565b8383600019600160008686828787826200004f83826200034e565b5060016200005e82826200034e565b505050600b869055600d805461ffff60a01b1916600160a01b8715150260ff60a81b191617600160a81b86151502179055600e6200009d84826200034e565b50600c80546001600160a01b038085166001600160a01b03199283168117909355600d805491851691909216179055151580620000e45750600d546001600160a01b031615155b620001355760405162461bcd60e51b815260206004820152601f60248201527f6f776e6572206f72206d617374657220746f6b656e7320726571756972656400604482015260640160405180910390fd5b5050505050505050505050506200041a565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016f57600080fd5b81516001600160401b03808211156200018c576200018c62000147565b604051601f8301601f19908116603f01168101908282118183101715620001b757620001b762000147565b81604052838152602092508683858801011115620001d457600080fd5b600091505b83821015620001f85785820183015181830184015290820190620001d9565b600093810190920192909252949350505050565b600080600080608085870312156200022357600080fd5b84516001600160401b03808211156200023b57600080fd5b62000249888389016200015d565b955060208701519150808211156200026057600080fd5b6200026e888389016200015d565b945060408701519150808211156200028557600080fd5b5062000294878288016200015d565b606087015190935090506001600160a01b0381168114620002b457600080fd5b939692955090935050565b600181811c90821680620002d457607f821691505b602082108103620002f557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034957600081815260208120601f850160051c81016020861015620003245750805b601f850160051c820191505b81811015620003455782815560010162000330565b5050505b505050565b81516001600160401b038111156200036a576200036a62000147565b62000382816200037b8454620002bf565b84620002fb565b602080601f831160018114620003ba5760008415620003a15750858301515b600019600386901b1c1916600185901b17855562000345565b600085815260208120601f198616915b82811015620003eb57888601518255948401946001909101908401620003ca565b50858210156200040a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612215806200042a6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806365371883116100de578063b88d4fde11610097578063cf721b1511610071578063cf721b151461035c578063d547cfb714610364578063d5abeb011461036c578063e985e9c51461037557600080fd5b8063b88d4fde14610323578063c87b56dd14610336578063ce7c8b491461034957600080fd5b806365371883146102bb5780636f8b44b0146102ce57806370a08231146102e157806392ff0d31146102f457806395d89b4114610308578063a22cb4651461031057600080fd5b806323b872dd1161014b57806342842e0e1161012557806342842e0e1461026f5780634f6ccce7146102825780634fb95e02146102955780636352211e146102a857600080fd5b806323b872dd146102365780632bb5e31e146102495780632f745c591461025c57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb578063101639f51461021057806318160ddd14610224575b600080fd5b6101a66101a1366004611b83565b6103b1565b60405190151581526020015b60405180910390f35b6101c36103c2565b6040516101b29190611bf0565b6101e36101de366004611c03565b610454565b6040516001600160a01b0390911681526020016101b2565b61020e610209366004611c38565b61047b565b005b600d546101a690600160a01b900460ff1681565b6008545b6040519081526020016101b2565b61020e610244366004611c62565b610595565b600d546101e3906001600160a01b031681565b61022861026a366004611c38565b6105c6565b61020e61027d366004611c62565b61065c565b610228610290366004611c03565b610677565b61020e6102a3366004611d09565b61070a565b6101e36102b6366004611c03565b6108c3565b600c546101e3906001600160a01b031681565b61020e6102dc366004611c03565b610923565b6102286102ef366004611d9f565b610aab565b600d546101a690600160a81b900460ff1681565b6101c3610b31565b61020e61031e366004611dba565b610b40565b61020e610331366004611df6565b610b4b565b6101c3610344366004611c03565b610b83565b61020e610357366004611eb6565b610bea565b610228610d71565b6101c3610d81565b610228600b5481565b6101a6610383366004611f43565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006103bc82610e0f565b92915050565b6060600080546103d190611f76565b80601f01602080910402602001604051908101604052809291908181526020018280546103fd90611f76565b801561044a5780601f1061041f5761010080835404028352916020019161044a565b820191906000526020600020905b81548152906001019060200180831161042d57829003601f168201915b5050505050905090565b600061045f82610e34565b506000908152600460205260409020546001600160a01b031690565b6000610486826108c3565b9050806001600160a01b0316836001600160a01b0316036104f85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061051457506105148133610383565b6105865760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016104ef565b6105908383610e93565b505050565b61059f3382610f01565b6105bb5760405162461bcd60e51b81526004016104ef90611fb0565b610590838383610f80565b60006105d183610aab565b82106106335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016104ef565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61059083838360405180602001604052806000815250610b4b565b600061068260085490565b82106106e55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016104ef565b600882815481106106f8576106f8611ffd565b90600052602060002001549050919050565b600c546001600160a01b0316158061078c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078a9190612013565b115b806108145750600d546001600160a01b031615806108145750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190612013565b115b6108305760405162461bcd60e51b81526004016104ef9061202c565b600d54600160a01b900460ff1661087f5760405162461bcd60e51b81526020600482015260136024820152724e4f545f52454d4f54455f4255524e41424c4560681b60448201526064016104ef565b60005b81518110156108bf576108ad8282815181106108a0576108a0611ffd565b60200260200101516110f1565b806108b78161206a565b915050610882565b5050565b6000818152600260205260408120546001600160a01b0316806103bc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600c546001600160a01b031615806109a55750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190612013565b115b80610a2d5750600d546001600160a01b03161580610a2d5750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2b9190612013565b115b610a495760405162461bcd60e51b81526004016104ef9061202c565b600854811015610aa65760405162461bcd60e51b815260206004820152602260248201527f4d41585f535550504c595f4c4f5745525f5448414e5f544f54414c5f535550506044820152614c5960f01b60648201526084016104ef565b600b55565b60006001600160a01b038216610b155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104ef565b506001600160a01b031660009081526003602052604090205490565b6060600180546103d190611f76565b6108bf338383611194565b610b553383610f01565b610b715760405162461bcd60e51b81526004016104ef90611fb0565b610b7d84848484611262565b50505050565b6060610b8e82610e34565b6000610b98611295565b90506000815111610bb85760405180602001604052806000815250610be3565b80610bc2846112a4565b604051602001610bd3929190612083565b6040516020818303038152906040525b9392505050565b600c546001600160a01b03161580610c6c5750600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190612013565b115b80610cf45750600d546001600160a01b03161580610cf45750600d546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190612013565b115b610d105760405162461bcd60e51b81526004016104ef9061202c565b600b548151600a54610d2291906120b2565b1115610d655760405162461bcd60e51b815260206004820152601260248201527113505617d4d55414131657d4915050d2115160721b60448201526064016104ef565b610d6e81611337565b50565b6000610d7c600a5490565b905090565b600e8054610d8e90611f76565b80601f0160208091040260200160405190810160405280929190818152602001828054610dba90611f76565b8015610e075780601f10610ddc57610100808354040283529160200191610e07565b820191906000526020600020905b815481529060010190602001808311610dea57829003601f168201915b505050505081565b60006001600160e01b0319821663780e9d6360e01b14806103bc57506103bc8261139e565b6000818152600260205260409020546001600160a01b0316610d6e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016104ef565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ec8826108c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f0d836108c3565b9050806001600160a01b0316846001600160a01b03161480610f5457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610f785750836001600160a01b0316610f6d84610454565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f93826108c3565b6001600160a01b031614610fb95760405162461bcd60e51b81526004016104ef906120c5565b6001600160a01b03821661101b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104ef565b61102883838360016113ee565b826001600160a01b031661103b826108c3565b6001600160a01b0316146110615760405162461bcd60e51b81526004016104ef906120c5565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006110fc826108c3565b905061110c8160008460016113ee565b611115826108c3565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104ef565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61126d848484610f80565b61127984848484611470565b610b7d5760405162461bcd60e51b81526004016104ef9061210a565b6060600e80546103d190611f76565b606060006112b183611571565b600101905060008167ffffffffffffffff8111156112d1576112d1611c9e565b6040519080825280601f01601f1916602001820160405280156112fb576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461130557509392505050565b60005b81518110156108bf5761137e82828151811061135857611358611ffd565b6020026020010151611369600a5490565b60405180602001604052806000815250611649565b61138c600a80546001019055565b806113968161206a565b91505061133a565b60006001600160e01b031982166380ac58cd60e01b14806113cf57506001600160e01b03198216635b5e139f60e01b145b806103bc57506301ffc9a760e01b6001600160e01b03198316146103bc565b6001600160a01b0384161580159061140e57506001600160a01b03831615155b80156114245750600d54600160a81b900460ff16155b156114645760405162461bcd60e51b815260206004820152601060248201526f6e6f74207472616e7366657261626c6560801b60448201526064016104ef565b610b7d8484848461167c565b60006001600160a01b0384163b1561156657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114b490339089908890889060040161215c565b6020604051808303816000875af19250505080156114ef575060408051601f3d908101601f191682019092526114ec91810190612199565b60015b61154c573d80801561151d576040519150601f19603f3d011682016040523d82523d6000602084013e611522565b606091505b5080516000036115445760405162461bcd60e51b81526004016104ef9061210a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f78565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106115b05772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106115dc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106115fa57662386f26fc10000830492506010015b6305f5e1008310611612576305f5e100830492506008015b612710831061162657612710830492506004015b60648310611638576064830492506002015b600a83106103bc5760010192915050565b61165383836117bc565b6116606000848484611470565b6105905760405162461bcd60e51b81526004016104ef9061210a565b61168884848484611955565b60018111156116f75760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016104ef565b816001600160a01b0385166117535761174e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611776565b836001600160a01b0316856001600160a01b0316146117765761177685826119dd565b6001600160a01b0384166117925761178d81611a7a565b6117b5565b846001600160a01b0316846001600160a01b0316146117b5576117b58482611b29565b5050505050565b6001600160a01b0382166118125760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104ef565b6000818152600260205260409020546001600160a01b0316156118775760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6118856000838360016113ee565b6000818152600260205260409020546001600160a01b0316156118ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104ef565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001811115610b7d576001600160a01b0384161561199b576001600160a01b038416600090815260036020526040812080548392906119959084906121b6565b90915550505b6001600160a01b03831615610b7d576001600160a01b038316600090815260036020526040812080548392906119d29084906120b2565b909155505050505050565b600060016119ea84610aab565b6119f491906121b6565b600083815260076020526040902054909150808214611a47576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611a8c906001906121b6565b60008381526009602052604081205460088054939450909284908110611ab457611ab4611ffd565b906000526020600020015490508060088381548110611ad557611ad5611ffd565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611b0d57611b0d6121c9565b6001900381819060005260206000200160009055905550505050565b6000611b3483610aab565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610d6e57600080fd5b600060208284031215611b9557600080fd5b8135610be381611b6d565b60005b83811015611bbb578181015183820152602001611ba3565b50506000910152565b60008151808452611bdc816020860160208601611ba0565b601f01601f19169290920160200192915050565b602081526000610be36020830184611bc4565b600060208284031215611c1557600080fd5b5035919050565b80356001600160a01b0381168114611c3357600080fd5b919050565b60008060408385031215611c4b57600080fd5b611c5483611c1c565b946020939093013593505050565b600080600060608486031215611c7757600080fd5b611c8084611c1c565b9250611c8e60208501611c1c565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611cdd57611cdd611c9e565b604052919050565b600067ffffffffffffffff821115611cff57611cff611c9e565b5060051b60200190565b60006020808385031215611d1c57600080fd5b823567ffffffffffffffff811115611d3357600080fd5b8301601f81018513611d4457600080fd5b8035611d57611d5282611ce5565b611cb4565b81815260059190911b82018301908381019087831115611d7657600080fd5b928401925b82841015611d9457833582529284019290840190611d7b565b979650505050505050565b600060208284031215611db157600080fd5b610be382611c1c565b60008060408385031215611dcd57600080fd5b611dd683611c1c565b915060208301358015158114611deb57600080fd5b809150509250929050565b60008060008060808587031215611e0c57600080fd5b611e1585611c1c565b93506020611e24818701611c1c565b935060408601359250606086013567ffffffffffffffff80821115611e4857600080fd5b818801915088601f830112611e5c57600080fd5b813581811115611e6e57611e6e611c9e565b611e80601f8201601f19168501611cb4565b91508082528984828501011115611e9657600080fd5b808484018584013760008482840101525080935050505092959194509250565b60006020808385031215611ec957600080fd5b823567ffffffffffffffff811115611ee057600080fd5b8301601f81018513611ef157600080fd5b8035611eff611d5282611ce5565b81815260059190911b82018301908381019087831115611f1e57600080fd5b928401925b82841015611d9457611f3484611c1c565b82529284019290840190611f23565b60008060408385031215611f5657600080fd5b611f5f83611c1c565b9150611f6d60208401611c1c565b90509250929050565b600181811c90821680611f8a57607f821691505b602082108103611faa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561202557600080fd5b5051919050565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161207c5761207c612054565b5060010190565b60008351612095818460208801611ba0565b8351908301906120a9818360208801611ba0565b01949350505050565b808201808211156103bc576103bc612054565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061218f90830184611bc4565b9695505050505050565b6000602082840312156121ab57600080fd5b8151610be381611b6d565b818103818111156103bc576103bc612054565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e8152b9960944a2fd38286972b6dc3d8a3cffd1232a5105e82f02c12af7f532064736f6c634300081100334552433732313a207472616e7366657220746f206e6f6e204552433732315265" +// Deprecated: Use OwnerTokenMetaData.Bin instead. +var OwnerTokenBin = OwnerTokenMetaData.Bin // DeployOwnerToken deploys a new Ethereum contract, binding an instance of OwnerToken to it. -func DeployOwnerToken(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _baseTokenURI string, _masterName string, _masterSymbol string, _masterBaseTokenURI string, _signerPublicKey []byte) (common.Address, *types.Transaction, *OwnerToken, error) { - parsed, err := abi.JSON(strings.NewReader(OwnerTokenABI)) +func DeployOwnerToken(auth *bind.TransactOpts, backend bind.ContractBackend, _name string, _symbol string, _baseTokenURI string, _receiver common.Address, _signerPublicKey []byte) (common.Address, *types.Transaction, *OwnerToken, error) { + parsed, err := OwnerTokenMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(OwnerTokenBin), backend, _name, _symbol, _baseTokenURI, _masterName, _masterSymbol, _masterBaseTokenURI, _signerPublicKey) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OwnerTokenBin), backend, _name, _symbol, _baseTokenURI, _receiver, _signerPublicKey) if err != nil { return common.Address{}, nil, nil, err } @@ -143,11 +157,11 @@ func NewOwnerTokenFilterer(address common.Address, filterer bind.ContractFiltere // bindOwnerToken binds a generic wrapper to an already deployed contract. func bindOwnerToken(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(OwnerTokenABI)) + parsed, err := OwnerTokenMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and @@ -1282,140 +1296,6 @@ func (_OwnerToken *OwnerTokenFilterer) ParseApprovalForAll(log types.Log) (*Owne return event, nil } -// OwnerTokenMasterTokenCreatedIterator is returned from FilterMasterTokenCreated and is used to iterate over the raw logs and unpacked data for MasterTokenCreated events raised by the OwnerToken contract. -type OwnerTokenMasterTokenCreatedIterator struct { - Event *OwnerTokenMasterTokenCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *OwnerTokenMasterTokenCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(OwnerTokenMasterTokenCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(OwnerTokenMasterTokenCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *OwnerTokenMasterTokenCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *OwnerTokenMasterTokenCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// OwnerTokenMasterTokenCreated represents a MasterTokenCreated event raised by the OwnerToken contract. -type OwnerTokenMasterTokenCreated struct { - MasterToken common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterMasterTokenCreated is a free log retrieval operation binding the contract event 0x02a0dab88b41e2a6fa5a9b4d40c16209315d6158c6a42f30879c8df187132601. -// -// Solidity: event MasterTokenCreated(address masterToken) -func (_OwnerToken *OwnerTokenFilterer) FilterMasterTokenCreated(opts *bind.FilterOpts) (*OwnerTokenMasterTokenCreatedIterator, error) { - - logs, sub, err := _OwnerToken.contract.FilterLogs(opts, "MasterTokenCreated") - if err != nil { - return nil, err - } - return &OwnerTokenMasterTokenCreatedIterator{contract: _OwnerToken.contract, event: "MasterTokenCreated", logs: logs, sub: sub}, nil -} - -// WatchMasterTokenCreated is a free log subscription operation binding the contract event 0x02a0dab88b41e2a6fa5a9b4d40c16209315d6158c6a42f30879c8df187132601. -// -// Solidity: event MasterTokenCreated(address masterToken) -func (_OwnerToken *OwnerTokenFilterer) WatchMasterTokenCreated(opts *bind.WatchOpts, sink chan<- *OwnerTokenMasterTokenCreated) (event.Subscription, error) { - - logs, sub, err := _OwnerToken.contract.WatchLogs(opts, "MasterTokenCreated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(OwnerTokenMasterTokenCreated) - if err := _OwnerToken.contract.UnpackLog(event, "MasterTokenCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseMasterTokenCreated is a log parse operation binding the contract event 0x02a0dab88b41e2a6fa5a9b4d40c16209315d6158c6a42f30879c8df187132601. -// -// Solidity: event MasterTokenCreated(address masterToken) -func (_OwnerToken *OwnerTokenFilterer) ParseMasterTokenCreated(log types.Log) (*OwnerTokenMasterTokenCreated, error) { - event := new(OwnerTokenMasterTokenCreated) - if err := _OwnerToken.contract.UnpackLog(event, "MasterTokenCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // OwnerTokenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the OwnerToken contract. type OwnerTokenTransferIterator struct { Event *OwnerTokenTransfer // Event containing the contract specifics and raw log diff --git a/contracts/community-tokens/ownertoken/OwnerToken.sol b/contracts/community-tokens/ownertoken/OwnerToken.sol new file mode 100644 index 000000000..49ee7b505 --- /dev/null +++ b/contracts/community-tokens/ownertoken/OwnerToken.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Mozilla Public License 2.0 +pragma solidity ^0.8.17; + +import "./BaseToken.sol"; + +contract OwnerToken is BaseToken { + bytes public signerPublicKey; + + constructor( + string memory _name, + string memory _symbol, + string memory _baseTokenURI, + address _receiver, + bytes memory _signerPublicKey + ) + BaseToken(_name, _symbol, 1, false, true, _baseTokenURI, address(this), address(this)) + { + signerPublicKey = _signerPublicKey; + address[] memory addresses = new address[](1); + addresses[0] = _receiver; + _mintTo(addresses); + } + + function setMaxSupply(uint256 _newMaxSupply) external override onlyOwner { + revert("max supply locked"); + } + + function setSignerPublicKey(bytes memory _newSignerPublicKey) external onlyOwner { + signerPublicKey = _newSignerPublicKey; + } +} diff --git a/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.go b/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.go new file mode 100644 index 000000000..c8388da75 --- /dev/null +++ b/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.go @@ -0,0 +1,1066 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package communityownertokenregistry + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// CommunityOwnerTokenRegistryMetaData contains all meta data concerning the CommunityOwnerTokenRegistry contract. +var CommunityOwnerTokenRegistryMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"CommunityOwnerTokenRegistry_EntryAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityOwnerTokenRegistry_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommunityOwnerTokenRegistry_NotAuthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"AddEntry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"TokenDeployerAddressChange\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_communityAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"}],\"name\":\"addEntry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"communityAddressToTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_communityAddress\",\"type\":\"address\"}],\"name\":\"getEntry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenDeployer\",\"type\":\"address\"}],\"name\":\"setCommunityTokenDeployerAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenDeployer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b5061001a3361001f565b610096565b600180546001600160a01b031916905561004381610046602090811b6105de17901c565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610790806100a56000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063a7a9584011610076578063d1f7c48a1161005b578063d1f7c48a146101be578063e30c3978146101d1578063f2fde38b146101ef57600080fd5b8063a7a9584014610175578063b97e6ab91461018857600080fd5b806379ba5097116100a757806379ba5097146101165780637db6a4e41461011e5780638da5cb5b1461015757600080fd5b80632a2dae0a146100c3578063715018a61461010c575b600080fd5b6002546100e39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610114610202565b005b610114610216565b6100e361012c36600461072e565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600360205260409020541690565b60005473ffffffffffffffffffffffffffffffffffffffff166100e3565b610114610183366004610750565b6102d0565b6100e361019636600461072e565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6101146101cc36600461072e565b61046a565b60015473ffffffffffffffffffffffffffffffffffffffff166100e3565b6101146101fd36600461072e565b61052e565b61020a610653565b61021460006106d4565b565b600154339073ffffffffffffffffffffffffffffffffffffffff1681146102c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102cd816106d4565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610321576040517f6a60770200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600360205260409020541615610380576040517fec22bbb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821615806103b7575073ffffffffffffffffffffffffffffffffffffffff8116155b156103ee576040517f911f6bec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055517f4bc4774424bf8749f142d7c1df17ee73cf36394616f38dd6799e99ea3bb4763a9190a35050565b610472610653565b73ffffffffffffffffffffffffffffffffffffffff81166104bf576040517f911f6bec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f057829294de8b35baa4c034fc338afc6ecb2eb9b3035615c44100d80ecc93db790600090a250565b610536610653565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915561059960005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bb565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556102cd816105de565b803573ffffffffffffffffffffffffffffffffffffffff8116811461072957600080fd5b919050565b60006020828403121561074057600080fd5b61074982610705565b9392505050565b6000806040838503121561076357600080fd5b61076c83610705565b915061077a60208401610705565b9050925092905056fea164736f6c6343000811000a", +} + +// CommunityOwnerTokenRegistryABI is the input ABI used to generate the binding from. +// Deprecated: Use CommunityOwnerTokenRegistryMetaData.ABI instead. +var CommunityOwnerTokenRegistryABI = CommunityOwnerTokenRegistryMetaData.ABI + +// CommunityOwnerTokenRegistryBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use CommunityOwnerTokenRegistryMetaData.Bin instead. +var CommunityOwnerTokenRegistryBin = CommunityOwnerTokenRegistryMetaData.Bin + +// DeployCommunityOwnerTokenRegistry deploys a new Ethereum contract, binding an instance of CommunityOwnerTokenRegistry to it. +func DeployCommunityOwnerTokenRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *CommunityOwnerTokenRegistry, error) { + parsed, err := CommunityOwnerTokenRegistryMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CommunityOwnerTokenRegistryBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CommunityOwnerTokenRegistry{CommunityOwnerTokenRegistryCaller: CommunityOwnerTokenRegistryCaller{contract: contract}, CommunityOwnerTokenRegistryTransactor: CommunityOwnerTokenRegistryTransactor{contract: contract}, CommunityOwnerTokenRegistryFilterer: CommunityOwnerTokenRegistryFilterer{contract: contract}}, nil +} + +// CommunityOwnerTokenRegistry is an auto generated Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistry struct { + CommunityOwnerTokenRegistryCaller // Read-only binding to the contract + CommunityOwnerTokenRegistryTransactor // Write-only binding to the contract + CommunityOwnerTokenRegistryFilterer // Log filterer for contract events +} + +// CommunityOwnerTokenRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityOwnerTokenRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityOwnerTokenRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CommunityOwnerTokenRegistryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CommunityOwnerTokenRegistrySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CommunityOwnerTokenRegistrySession struct { + Contract *CommunityOwnerTokenRegistry // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommunityOwnerTokenRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CommunityOwnerTokenRegistryCallerSession struct { + Contract *CommunityOwnerTokenRegistryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CommunityOwnerTokenRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CommunityOwnerTokenRegistryTransactorSession struct { + Contract *CommunityOwnerTokenRegistryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CommunityOwnerTokenRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistryRaw struct { + Contract *CommunityOwnerTokenRegistry // Generic contract binding to access the raw methods on +} + +// CommunityOwnerTokenRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistryCallerRaw struct { + Contract *CommunityOwnerTokenRegistryCaller // Generic read-only contract binding to access the raw methods on +} + +// CommunityOwnerTokenRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CommunityOwnerTokenRegistryTransactorRaw struct { + Contract *CommunityOwnerTokenRegistryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCommunityOwnerTokenRegistry creates a new instance of CommunityOwnerTokenRegistry, bound to a specific deployed contract. +func NewCommunityOwnerTokenRegistry(address common.Address, backend bind.ContractBackend) (*CommunityOwnerTokenRegistry, error) { + contract, err := bindCommunityOwnerTokenRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistry{CommunityOwnerTokenRegistryCaller: CommunityOwnerTokenRegistryCaller{contract: contract}, CommunityOwnerTokenRegistryTransactor: CommunityOwnerTokenRegistryTransactor{contract: contract}, CommunityOwnerTokenRegistryFilterer: CommunityOwnerTokenRegistryFilterer{contract: contract}}, nil +} + +// NewCommunityOwnerTokenRegistryCaller creates a new read-only instance of CommunityOwnerTokenRegistry, bound to a specific deployed contract. +func NewCommunityOwnerTokenRegistryCaller(address common.Address, caller bind.ContractCaller) (*CommunityOwnerTokenRegistryCaller, error) { + contract, err := bindCommunityOwnerTokenRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryCaller{contract: contract}, nil +} + +// NewCommunityOwnerTokenRegistryTransactor creates a new write-only instance of CommunityOwnerTokenRegistry, bound to a specific deployed contract. +func NewCommunityOwnerTokenRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*CommunityOwnerTokenRegistryTransactor, error) { + contract, err := bindCommunityOwnerTokenRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryTransactor{contract: contract}, nil +} + +// NewCommunityOwnerTokenRegistryFilterer creates a new log filterer instance of CommunityOwnerTokenRegistry, bound to a specific deployed contract. +func NewCommunityOwnerTokenRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*CommunityOwnerTokenRegistryFilterer, error) { + contract, err := bindCommunityOwnerTokenRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryFilterer{contract: contract}, nil +} + +// bindCommunityOwnerTokenRegistry binds a generic wrapper to an already deployed contract. +func bindCommunityOwnerTokenRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CommunityOwnerTokenRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CommunityOwnerTokenRegistry.Contract.CommunityOwnerTokenRegistryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.CommunityOwnerTokenRegistryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.CommunityOwnerTokenRegistryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CommunityOwnerTokenRegistry.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.contract.Transact(opts, method, params...) +} + +// CommunityAddressToTokenAddress is a free data retrieval call binding the contract method 0xb97e6ab9. +// +// Solidity: function communityAddressToTokenAddress(address ) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCaller) CommunityAddressToTokenAddress(opts *bind.CallOpts, arg0 common.Address) (common.Address, error) { + var out []interface{} + err := _CommunityOwnerTokenRegistry.contract.Call(opts, &out, "communityAddressToTokenAddress", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// CommunityAddressToTokenAddress is a free data retrieval call binding the contract method 0xb97e6ab9. +// +// Solidity: function communityAddressToTokenAddress(address ) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) CommunityAddressToTokenAddress(arg0 common.Address) (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.CommunityAddressToTokenAddress(&_CommunityOwnerTokenRegistry.CallOpts, arg0) +} + +// CommunityAddressToTokenAddress is a free data retrieval call binding the contract method 0xb97e6ab9. +// +// Solidity: function communityAddressToTokenAddress(address ) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerSession) CommunityAddressToTokenAddress(arg0 common.Address) (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.CommunityAddressToTokenAddress(&_CommunityOwnerTokenRegistry.CallOpts, arg0) +} + +// GetEntry is a free data retrieval call binding the contract method 0x7db6a4e4. +// +// Solidity: function getEntry(address _communityAddress) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCaller) GetEntry(opts *bind.CallOpts, _communityAddress common.Address) (common.Address, error) { + var out []interface{} + err := _CommunityOwnerTokenRegistry.contract.Call(opts, &out, "getEntry", _communityAddress) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetEntry is a free data retrieval call binding the contract method 0x7db6a4e4. +// +// Solidity: function getEntry(address _communityAddress) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) GetEntry(_communityAddress common.Address) (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.GetEntry(&_CommunityOwnerTokenRegistry.CallOpts, _communityAddress) +} + +// GetEntry is a free data retrieval call binding the contract method 0x7db6a4e4. +// +// Solidity: function getEntry(address _communityAddress) view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerSession) GetEntry(_communityAddress common.Address) (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.GetEntry(&_CommunityOwnerTokenRegistry.CallOpts, _communityAddress) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityOwnerTokenRegistry.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) Owner() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.Owner(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerSession) Owner() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.Owner(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityOwnerTokenRegistry.contract.Call(opts, &out, "pendingOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) PendingOwner() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.PendingOwner(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerSession) PendingOwner() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.PendingOwner(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// TokenDeployer is a free data retrieval call binding the contract method 0x2a2dae0a. +// +// Solidity: function tokenDeployer() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCaller) TokenDeployer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CommunityOwnerTokenRegistry.contract.Call(opts, &out, "tokenDeployer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TokenDeployer is a free data retrieval call binding the contract method 0x2a2dae0a. +// +// Solidity: function tokenDeployer() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) TokenDeployer() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.TokenDeployer(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// TokenDeployer is a free data retrieval call binding the contract method 0x2a2dae0a. +// +// Solidity: function tokenDeployer() view returns(address) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryCallerSession) TokenDeployer() (common.Address, error) { + return _CommunityOwnerTokenRegistry.Contract.TokenDeployer(&_CommunityOwnerTokenRegistry.CallOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.contract.Transact(opts, "acceptOwnership") +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) AcceptOwnership() (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.AcceptOwnership(&_CommunityOwnerTokenRegistry.TransactOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.AcceptOwnership(&_CommunityOwnerTokenRegistry.TransactOpts) +} + +// AddEntry is a paid mutator transaction binding the contract method 0xa7a95840. +// +// Solidity: function addEntry(address _communityAddress, address _tokenAddress) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactor) AddEntry(opts *bind.TransactOpts, _communityAddress common.Address, _tokenAddress common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.contract.Transact(opts, "addEntry", _communityAddress, _tokenAddress) +} + +// AddEntry is a paid mutator transaction binding the contract method 0xa7a95840. +// +// Solidity: function addEntry(address _communityAddress, address _tokenAddress) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) AddEntry(_communityAddress common.Address, _tokenAddress common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.AddEntry(&_CommunityOwnerTokenRegistry.TransactOpts, _communityAddress, _tokenAddress) +} + +// AddEntry is a paid mutator transaction binding the contract method 0xa7a95840. +// +// Solidity: function addEntry(address _communityAddress, address _tokenAddress) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorSession) AddEntry(_communityAddress common.Address, _tokenAddress common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.AddEntry(&_CommunityOwnerTokenRegistry.TransactOpts, _communityAddress, _tokenAddress) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) RenounceOwnership() (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.RenounceOwnership(&_CommunityOwnerTokenRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.RenounceOwnership(&_CommunityOwnerTokenRegistry.TransactOpts) +} + +// SetCommunityTokenDeployerAddress is a paid mutator transaction binding the contract method 0xd1f7c48a. +// +// Solidity: function setCommunityTokenDeployerAddress(address _tokenDeployer) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactor) SetCommunityTokenDeployerAddress(opts *bind.TransactOpts, _tokenDeployer common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.contract.Transact(opts, "setCommunityTokenDeployerAddress", _tokenDeployer) +} + +// SetCommunityTokenDeployerAddress is a paid mutator transaction binding the contract method 0xd1f7c48a. +// +// Solidity: function setCommunityTokenDeployerAddress(address _tokenDeployer) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) SetCommunityTokenDeployerAddress(_tokenDeployer common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.SetCommunityTokenDeployerAddress(&_CommunityOwnerTokenRegistry.TransactOpts, _tokenDeployer) +} + +// SetCommunityTokenDeployerAddress is a paid mutator transaction binding the contract method 0xd1f7c48a. +// +// Solidity: function setCommunityTokenDeployerAddress(address _tokenDeployer) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorSession) SetCommunityTokenDeployerAddress(_tokenDeployer common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.SetCommunityTokenDeployerAddress(&_CommunityOwnerTokenRegistry.TransactOpts, _tokenDeployer) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistrySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.TransferOwnership(&_CommunityOwnerTokenRegistry.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _CommunityOwnerTokenRegistry.Contract.TransferOwnership(&_CommunityOwnerTokenRegistry.TransactOpts, newOwner) +} + +// CommunityOwnerTokenRegistryAddEntryIterator is returned from FilterAddEntry and is used to iterate over the raw logs and unpacked data for AddEntry events raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryAddEntryIterator struct { + Event *CommunityOwnerTokenRegistryAddEntry // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityOwnerTokenRegistryAddEntryIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryAddEntry) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryAddEntry) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityOwnerTokenRegistryAddEntryIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityOwnerTokenRegistryAddEntryIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityOwnerTokenRegistryAddEntry represents a AddEntry event raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryAddEntry struct { + Arg0 common.Address + Arg1 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddEntry is a free log retrieval operation binding the contract event 0x4bc4774424bf8749f142d7c1df17ee73cf36394616f38dd6799e99ea3bb4763a. +// +// Solidity: event AddEntry(address indexed arg0, address indexed arg1) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) FilterAddEntry(opts *bind.FilterOpts, arg0 []common.Address, arg1 []common.Address) (*CommunityOwnerTokenRegistryAddEntryIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + var arg1Rule []interface{} + for _, arg1Item := range arg1 { + arg1Rule = append(arg1Rule, arg1Item) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.FilterLogs(opts, "AddEntry", arg0Rule, arg1Rule) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryAddEntryIterator{contract: _CommunityOwnerTokenRegistry.contract, event: "AddEntry", logs: logs, sub: sub}, nil +} + +// WatchAddEntry is a free log subscription operation binding the contract event 0x4bc4774424bf8749f142d7c1df17ee73cf36394616f38dd6799e99ea3bb4763a. +// +// Solidity: event AddEntry(address indexed arg0, address indexed arg1) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) WatchAddEntry(opts *bind.WatchOpts, sink chan<- *CommunityOwnerTokenRegistryAddEntry, arg0 []common.Address, arg1 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + var arg1Rule []interface{} + for _, arg1Item := range arg1 { + arg1Rule = append(arg1Rule, arg1Item) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.WatchLogs(opts, "AddEntry", arg0Rule, arg1Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityOwnerTokenRegistryAddEntry) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "AddEntry", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAddEntry is a log parse operation binding the contract event 0x4bc4774424bf8749f142d7c1df17ee73cf36394616f38dd6799e99ea3bb4763a. +// +// Solidity: event AddEntry(address indexed arg0, address indexed arg1) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) ParseAddEntry(log types.Log) (*CommunityOwnerTokenRegistryAddEntry, error) { + event := new(CommunityOwnerTokenRegistryAddEntry) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "AddEntry", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityOwnerTokenRegistryOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryOwnershipTransferStartedIterator struct { + Event *CommunityOwnerTokenRegistryOwnershipTransferStarted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityOwnerTokenRegistryOwnershipTransferStartedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityOwnerTokenRegistryOwnershipTransferStartedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityOwnerTokenRegistryOwnershipTransferStartedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityOwnerTokenRegistryOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryOwnershipTransferStarted struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CommunityOwnerTokenRegistryOwnershipTransferStartedIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryOwnershipTransferStartedIterator{contract: _CommunityOwnerTokenRegistry.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *CommunityOwnerTokenRegistryOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityOwnerTokenRegistryOwnershipTransferStarted) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) ParseOwnershipTransferStarted(log types.Log) (*CommunityOwnerTokenRegistryOwnershipTransferStarted, error) { + event := new(CommunityOwnerTokenRegistryOwnershipTransferStarted) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityOwnerTokenRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryOwnershipTransferredIterator struct { + Event *CommunityOwnerTokenRegistryOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityOwnerTokenRegistryOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityOwnerTokenRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityOwnerTokenRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityOwnerTokenRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CommunityOwnerTokenRegistryOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryOwnershipTransferredIterator{contract: _CommunityOwnerTokenRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CommunityOwnerTokenRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityOwnerTokenRegistryOwnershipTransferred) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*CommunityOwnerTokenRegistryOwnershipTransferred, error) { + event := new(CommunityOwnerTokenRegistryOwnershipTransferred) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator is returned from FilterTokenDeployerAddressChange and is used to iterate over the raw logs and unpacked data for TokenDeployerAddressChange events raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator struct { + Event *CommunityOwnerTokenRegistryTokenDeployerAddressChange // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryTokenDeployerAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CommunityOwnerTokenRegistryTokenDeployerAddressChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CommunityOwnerTokenRegistryTokenDeployerAddressChange represents a TokenDeployerAddressChange event raised by the CommunityOwnerTokenRegistry contract. +type CommunityOwnerTokenRegistryTokenDeployerAddressChange struct { + Arg0 common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenDeployerAddressChange is a free log retrieval operation binding the contract event 0x057829294de8b35baa4c034fc338afc6ecb2eb9b3035615c44100d80ecc93db7. +// +// Solidity: event TokenDeployerAddressChange(address indexed arg0) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) FilterTokenDeployerAddressChange(opts *bind.FilterOpts, arg0 []common.Address) (*CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.FilterLogs(opts, "TokenDeployerAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return &CommunityOwnerTokenRegistryTokenDeployerAddressChangeIterator{contract: _CommunityOwnerTokenRegistry.contract, event: "TokenDeployerAddressChange", logs: logs, sub: sub}, nil +} + +// WatchTokenDeployerAddressChange is a free log subscription operation binding the contract event 0x057829294de8b35baa4c034fc338afc6ecb2eb9b3035615c44100d80ecc93db7. +// +// Solidity: event TokenDeployerAddressChange(address indexed arg0) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) WatchTokenDeployerAddressChange(opts *bind.WatchOpts, sink chan<- *CommunityOwnerTokenRegistryTokenDeployerAddressChange, arg0 []common.Address) (event.Subscription, error) { + + var arg0Rule []interface{} + for _, arg0Item := range arg0 { + arg0Rule = append(arg0Rule, arg0Item) + } + + logs, sub, err := _CommunityOwnerTokenRegistry.contract.WatchLogs(opts, "TokenDeployerAddressChange", arg0Rule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CommunityOwnerTokenRegistryTokenDeployerAddressChange) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "TokenDeployerAddressChange", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTokenDeployerAddressChange is a log parse operation binding the contract event 0x057829294de8b35baa4c034fc338afc6ecb2eb9b3035615c44100d80ecc93db7. +// +// Solidity: event TokenDeployerAddressChange(address indexed arg0) +func (_CommunityOwnerTokenRegistry *CommunityOwnerTokenRegistryFilterer) ParseTokenDeployerAddressChange(log types.Log) (*CommunityOwnerTokenRegistryTokenDeployerAddressChange, error) { + event := new(CommunityOwnerTokenRegistryTokenDeployerAddressChange) + if err := _CommunityOwnerTokenRegistry.contract.UnpackLog(event, "TokenDeployerAddressChange", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.sol b/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.sol new file mode 100644 index 000000000..63c4deab6 --- /dev/null +++ b/contracts/community-tokens/registry/CommunityOwnerTokenRegistry.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: UNLICENSED + +pragma solidity ^0.8.17; + +import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol"; +import { IAddressRegistry } from "./interfaces/IAddressRegistry.sol"; +import { OwnerToken } from "./tokens/OwnerToken.sol"; + +/** + * @title CommunityOwnerTokenRegistry contract + * @author 0x-r4bbit + * + * This contract serves as a simple registry to map Status community addresses + * to Status community `OwnerToken` addresses. + * The `CommunityTokenDeployer` contract uses this registry contract to maintain + * a list of community address and their token addresses. + * @notice This contract will be deployed by Status similar to the `CommunityTokenDeployer` + * contract. + * @notice This contract maps community addresses to `OwnerToken` addresses. + * @notice Only one entry per community address can exist in the registry. + * @dev This registry has been extracted into its own contract so that it's possible + * to introduce different version of a `CommunityDeployerContract` without needing to + * migrate existing registry data, as the deployer contract would simply point at this + * registry contract. + * @dev Only `tokenDeployer` can add entries to the registry. + */ +contract CommunityOwnerTokenRegistry is IAddressRegistry, Ownable2Step { + error CommunityOwnerTokenRegistry_NotAuthorized(); + error CommunityOwnerTokenRegistry_EntryAlreadyExists(); + error CommunityOwnerTokenRegistry_InvalidAddress(); + + event TokenDeployerAddressChange(address indexed); + event AddEntry(address indexed, address indexed); + + /// @dev The address of the token deployer contract. + address public tokenDeployer; + + mapping(address => address) public communityAddressToTokenAddress; + + modifier onlyTokenDeployer() { + if (msg.sender != tokenDeployer) { + revert CommunityOwnerTokenRegistry_NotAuthorized(); + } + _; + } + + /** + * @notice Sets the address of the community token deployer contract. This is needed to + * ensure only the known token deployer contract can add new entries to the registry. + * @dev Only the owner of this contract can call this function. + * @dev Emits a {TokenDeployerAddressChange} event. + * + * @param _tokenDeployer The address of the community token deployer contract + */ + function setCommunityTokenDeployerAddress(address _tokenDeployer) external onlyOwner { + if (_tokenDeployer == address(0)) { + revert CommunityOwnerTokenRegistry_InvalidAddress(); + } + tokenDeployer = _tokenDeployer; + emit TokenDeployerAddressChange(tokenDeployer); + } + + /** + * @notice Adds an entry to the registry. Only one entry per community address can exist. + * @dev Only the token deployer contract can call this function. + * @dev Reverts when the entry already exists. + * @dev Reverts when either `_communityAddress` or `_tokenAddress` are zero addresses. + * @dev Emits a {AddEntry} event. + */ + function addEntry(address _communityAddress, address _tokenAddress) external onlyTokenDeployer { + if (getEntry(_communityAddress) != address(0)) { + revert CommunityOwnerTokenRegistry_EntryAlreadyExists(); + } + + if (_communityAddress == address(0) || _tokenAddress == address(0)) { + revert CommunityOwnerTokenRegistry_InvalidAddress(); + } + + communityAddressToTokenAddress[_communityAddress] = _tokenAddress; + emit AddEntry(_communityAddress, _tokenAddress); + } + + /** + * @notice Returns the owner token address for a given community address. + * @param _communityAddress The community address to look up an owner token address. + * @return address The owner token address for the community addres, or zero address . + */ + function getEntry(address _communityAddress) public view returns (address) { + return communityAddressToTokenAddress[_communityAddress]; + } +} diff --git a/protocol/communities/manager.go b/protocol/communities/manager.go index 4bef5010a..41bab5835 100644 --- a/protocol/communities/manager.go +++ b/protocol/communities/manager.go @@ -4933,3 +4933,21 @@ func (m *Manager) GetCommunityRequestsToJoinWithRevealedAddresses(communityID ty func (m *Manager) SaveCommunity(community *Community) error { return m.persistence.SaveCommunity(community) } + +func (m *Manager) CreateCommunityTokenDeploymentSignature(ctx context.Context, chainID uint64, addressFrom string, communityID string) ([]byte, error) { + community, err := m.GetByIDString(communityID) + if err != nil { + return nil, err + } + if community == nil { + return nil, ErrOrgNotFound + } + if !community.IsControlNode() { + return nil, ErrNotControlNode + } + digest, err := m.communityTokensService.DeploymentSignatureDigest(chainID, addressFrom, communityID) + if err != nil { + return nil, err + } + return crypto.Sign(digest, community.PrivateKey()) +} diff --git a/protocol/communities_messenger_helpers_test.go b/protocol/communities_messenger_helpers_test.go index 0f4a8c2ee..a845e1368 100644 --- a/protocol/communities_messenger_helpers_test.go +++ b/protocol/communities_messenger_helpers_test.go @@ -118,6 +118,10 @@ func (c *CollectiblesServiceMock) SetMockAssetContractData(chainID uint64, contr c.Assets[chainID][contractAddress] = assetData } +func (c *CollectiblesServiceMock) DeploymentSignatureDigest(chainID uint64, addressFrom string, communityID string) ([]byte, error) { + return gethcommon.Hex2Bytes("ccbb375343347491706cf4b43796f7b96ccc89c9e191a8b78679daeba1684ec7"), nil +} + func newMessenger(s *suite.Suite, shh types.Waku, logger *zap.Logger, password string, walletAddresses []string, mockedBalances *map[uint64]map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big, collectiblesService communitytokens.ServiceInterface) *Messenger { accountsManagerMock := &AccountManagerMock{} diff --git a/protocol/messenger.go b/protocol/messenger.go index 0801a1356..2b10fe01c 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -5077,6 +5077,10 @@ func (m *Messenger) SignMessage(message string) ([]byte, error) { return crypto.Sign(hash, m.identity) } +func (m *Messenger) CreateCommunityTokenDeploymentSignature(ctx context.Context, chainID uint64, addressFrom string, communityID string) ([]byte, error) { + return m.communitiesManager.CreateCommunityTokenDeploymentSignature(ctx, chainID, addressFrom, communityID) +} + func (m *Messenger) getTimesource() common.TimeSource { return m.transport } diff --git a/services/communitytokens/api.go b/services/communitytokens/api.go index b00d29e3d..61a5de048 100644 --- a/services/communitytokens/api.go +++ b/services/communitytokens/api.go @@ -14,8 +14,10 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/status-im/status-go/contracts/community-tokens/assets" "github.com/status-im/status-go/contracts/community-tokens/collectibles" + communitytokendeployer "github.com/status-im/status-go/contracts/community-tokens/deployer" "github.com/status-im/status-go/contracts/community-tokens/mastertoken" "github.com/status-im/status-go/contracts/community-tokens/ownertoken" + communityownertokenregistry "github.com/status-im/status-go/contracts/community-tokens/registry" "github.com/status-im/status-go/eth-node/crypto" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/services/utils" @@ -129,12 +131,48 @@ func (api *API) DeployCollectibles(ctx context.Context, chainID uint64, deployme return DeploymentDetails{address.Hex(), tx.Hash().Hex()}, nil } -func (api *API) DeployOwnerToken(ctx context.Context, chainID uint64, ownerTokenParameters DeploymentParameters, masterTokenParameters DeploymentParameters, txArgs transactions.SendTxArgs, password string) (DeploymentDetails, error) { +func decodeSignature(sig []byte) (r [32]byte, s [32]byte, v uint8, err error) { + if len(sig) != crypto.SignatureLength { + return [32]byte{}, [32]byte{}, 0, fmt.Errorf("wrong size for signature: got %d, want %d", len(sig), crypto.SignatureLength) + } + copy(r[:], sig[:32]) + copy(s[:], sig[32:64]) + v = sig[64] + 27 + return r, s, v, nil +} + +func prepareDeploymentSignatureStruct(signature string, communityID string, addressFrom common.Address) (communitytokendeployer.CommunityTokenDeployerDeploymentSignature, error) { + r, s, v, err := decodeSignature(common.FromHex(signature)) + if err != nil { + return communitytokendeployer.CommunityTokenDeployerDeploymentSignature{}, err + } + communityEthAddress, err := convert33BytesPubKeyToEthAddress(communityID) + if err != nil { + return communitytokendeployer.CommunityTokenDeployerDeploymentSignature{}, err + } + communitySignature := communitytokendeployer.CommunityTokenDeployerDeploymentSignature{ + V: v, + R: r, + S: s, + Deployer: addressFrom, + Signer: communityEthAddress, + } + return communitySignature, nil +} + +func (api *API) DeployOwnerToken(ctx context.Context, chainID uint64, + ownerTokenParameters DeploymentParameters, masterTokenParameters DeploymentParameters, + signature string, communityID string, signerPubKey string, + txArgs transactions.SendTxArgs, password string) (DeploymentDetails, error) { err := ownerTokenParameters.Validate(false) if err != nil { return DeploymentDetails{}, err } + if len(signerPubKey) <= 0 { + return DeploymentDetails{}, fmt.Errorf("signerPubKey is empty") + } + err = masterTokenParameters.Validate(false) if err != nil { return DeploymentDetails{}, err @@ -142,18 +180,32 @@ func (api *API) DeployOwnerToken(ctx context.Context, chainID uint64, ownerToken transactOpts := txArgs.ToTransactOpts(utils.GetSigner(chainID, api.s.accountsManager, api.s.config.KeyStoreDir, txArgs.From, password)) - ethClient, err := api.s.manager.rpcClient.EthClient(chainID) + deployerContractInst, err := api.NewCommunityTokenDeployerInstance(chainID) if err != nil { - log.Error(err.Error()) return DeploymentDetails{}, err } - signerPubKey := []byte{} + ownerTokenConfig := communitytokendeployer.CommunityTokenDeployerTokenConfig{ + Name: ownerTokenParameters.Name, + Symbol: ownerTokenParameters.Symbol, + BaseURI: ownerTokenParameters.TokenURI, + } + + masterTokenConfig := communitytokendeployer.CommunityTokenDeployerTokenConfig{ + Name: masterTokenParameters.Name, + Symbol: masterTokenParameters.Symbol, + BaseURI: masterTokenParameters.TokenURI, + } + + communitySignature, err := prepareDeploymentSignatureStruct(signature, communityID, common.Address(txArgs.From)) + if err != nil { + return DeploymentDetails{}, err + } + + log.Debug("Signature:", communitySignature) + + tx, err := deployerContractInst.Deploy(transactOpts, ownerTokenConfig, masterTokenConfig, communitySignature, common.FromHex(signerPubKey)) - address, tx, _, err := ownertoken.DeployOwnerToken(transactOpts, ethClient, ownerTokenParameters.Name, - ownerTokenParameters.Symbol, ownerTokenParameters.TokenURI, - masterTokenParameters.Name, masterTokenParameters.Symbol, - masterTokenParameters.TokenURI, signerPubKey) if err != nil { log.Error(err.Error()) return DeploymentDetails{}, err @@ -171,7 +223,7 @@ func (api *API) DeployOwnerToken(ctx context.Context, chainID uint64, ownerToken return DeploymentDetails{}, err } - return DeploymentDetails{address.Hex(), tx.Hash().Hex()}, nil + return DeploymentDetails{"", tx.Hash().Hex()}, nil } func (api *API) GetMasterTokenContractAddressFromHash(ctx context.Context, chainID uint64, txHash string) (string, error) { @@ -185,26 +237,57 @@ func (api *API) GetMasterTokenContractAddressFromHash(ctx context.Context, chain return "", err } - logMasterTokenCreatedSig := []byte("MasterTokenCreated(address)") + deployerContractInst, err := api.NewCommunityTokenDeployerInstance(chainID) + if err != nil { + return "", err + } + + logMasterTokenCreatedSig := []byte("DeployMasterToken(address)") logMasterTokenCreatedSigHash := crypto.Keccak256Hash(logMasterTokenCreatedSig) for _, vLog := range receipt.Logs { if vLog.Topics[0].Hex() == logMasterTokenCreatedSigHash.Hex() { - ownerTokenABI, err := abi.JSON(strings.NewReader(ownertoken.OwnerTokenABI)) + event, err := deployerContractInst.ParseDeployMasterToken(*vLog) if err != nil { return "", err } - event := new(ownertoken.OwnerTokenMasterTokenCreated) - err = ownerTokenABI.UnpackIntoInterface(event, "MasterTokenCreated", vLog.Data) - if err != nil { - return "", err - } - return event.MasterToken.Hex(), nil + return event.Arg0.Hex(), nil } } return "", fmt.Errorf("can't find master token address in transaction: %v", txHash) } +func (api *API) GetOwnerTokenContractAddressFromHash(ctx context.Context, chainID uint64, txHash string) (string, error) { + ethClient, err := api.s.manager.rpcClient.EthClient(chainID) + if err != nil { + return "", err + } + + receipt, err := ethClient.TransactionReceipt(ctx, common.HexToHash(txHash)) + if err != nil { + return "", err + } + + deployerContractInst, err := api.NewCommunityTokenDeployerInstance(chainID) + if err != nil { + return "", err + } + + logOwnerTokenCreatedSig := []byte("DeployOwnerToken(address)") + logOwnerTokenCreatedSigHash := crypto.Keccak256Hash(logOwnerTokenCreatedSig) + + for _, vLog := range receipt.Logs { + if vLog.Topics[0].Hex() == logOwnerTokenCreatedSigHash.Hex() { + event, err := deployerContractInst.ParseDeployOwnerToken(*vLog) + if err != nil { + return "", err + } + return event.Arg0.Hex(), nil + } + } + return "", fmt.Errorf("can't find owner token address in transaction: %v", txHash) +} + func (api *API) DeployAssets(ctx context.Context, chainID uint64, deploymentParameters DeploymentParameters, txArgs transactions.SendTxArgs, password string) (DeploymentDetails, error) { err := deploymentParameters.Validate(true) @@ -220,8 +303,9 @@ func (api *API) DeployAssets(ctx context.Context, chainID uint64, deploymentPara return DeploymentDetails{}, err } + const decimals = 18 address, tx, _, err := assets.DeployAssets(transactOpts, ethClient, deploymentParameters.Name, - deploymentParameters.Symbol, deploymentParameters.GetSupply()) + deploymentParameters.Symbol, decimals, deploymentParameters.GetSupply()) if err != nil { log.Error(err.Error()) return DeploymentDetails{}, err @@ -244,20 +328,105 @@ func (api *API) DeployAssets(ctx context.Context, chainID uint64, deploymentPara // Returns gas units + 10% func (api *API) DeployCollectiblesEstimate(ctx context.Context) (uint64, error) { - gasAmount := uint64(2091605) + // TODO investigate why the code below does not return correct values + /*ethClient, err := api.s.manager.rpcClient.EthClient(420) + if err != nil { + log.Error(err.Error()) + return 0, err + } + + collectiblesABI, err := abi.JSON(strings.NewReader(collectibles.CollectiblesABI)) + if err != nil { + return 0, err + } + + data, err := collectiblesABI.Pack("", "name", "SYMBOL", big.NewInt(20), true, false, "tokenUriwhcih is very long asdkfjlsdkjflk", + common.HexToAddress("0x77b48394c650520012795a1a25696d7eb542d110"), common.HexToAddress("0x77b48394c650520012795a1a25696d7eb542d110")) + if err != nil { + return 0, err + } + + callMsg := ethereum.CallMsg{ + From: common.HexToAddress("0x77b48394c650520012795a1a25696d7eb542d110"), + To: nil, + Value: big.NewInt(0), + Data: data, + } + estimate, err := ethClient.EstimateGas(ctx, callMsg) + if err != nil { + return 0, err + } + return estimate + uint64(float32(estimate)*0.1), nil*/ + + // TODO compute fee dynamically + // the code above returns too low fees, need to investigate + gasAmount := uint64(2500000) return gasAmount + uint64(float32(gasAmount)*0.1), nil } // Returns gas units + 10% func (api *API) DeployAssetsEstimate(ctx context.Context) (uint64, error) { - gasAmount := uint64(957483) + // TODO compute fee dynamically + gasAmount := uint64(1500000) return gasAmount + uint64(float32(gasAmount)*0.1), nil } -// Returns gas units + 10% -func (api *API) DeployOwnerTokenEstimate(ctx context.Context) (uint64, error) { - ownerGasAmount := uint64(4389457) - return ownerGasAmount + uint64(float32(ownerGasAmount)*0.1), nil +func (api *API) DeployOwnerTokenEstimate(ctx context.Context, chainID uint64, fromAddress string, + ownerTokenParameters DeploymentParameters, masterTokenParameters DeploymentParameters, + signature string, communityID string, signerPubKey string) (uint64, error) { + ethClient, err := api.s.manager.rpcClient.EthClient(chainID) + if err != nil { + log.Error(err.Error()) + return 0, err + } + + deployerAddress, err := communitytokendeployer.ContractAddress(chainID) + if err != nil { + return 0, err + } + + deployerABI, err := abi.JSON(strings.NewReader(communitytokendeployer.CommunityTokenDeployerABI)) + if err != nil { + return 0, err + } + + ownerTokenConfig := communitytokendeployer.CommunityTokenDeployerTokenConfig{ + Name: ownerTokenParameters.Name, + Symbol: ownerTokenParameters.Symbol, + BaseURI: ownerTokenParameters.TokenURI, + } + + masterTokenConfig := communitytokendeployer.CommunityTokenDeployerTokenConfig{ + Name: masterTokenParameters.Name, + Symbol: masterTokenParameters.Symbol, + BaseURI: masterTokenParameters.TokenURI, + } + + communitySignature, err := prepareDeploymentSignatureStruct(signature, communityID, common.HexToAddress(fromAddress)) + if err != nil { + return 0, err + } + + data, err := deployerABI.Pack("deploy", ownerTokenConfig, masterTokenConfig, communitySignature, common.FromHex(signerPubKey)) + + if err != nil { + return 0, err + } + + toAddr := deployerAddress + fromAddr := common.HexToAddress(fromAddress) + + callMsg := ethereum.CallMsg{ + From: fromAddr, + To: &toAddr, + Value: big.NewInt(0), + Data: data, + } + estimate, err := ethClient.EstimateGas(ctx, callMsg) + if err != nil { + return 0, err + } + return estimate + uint64(float32(estimate)*0.1), nil } func (api *API) NewMasterTokenInstance(chainID uint64, contractAddress string) (*mastertoken.MasterToken, error) { @@ -268,6 +437,26 @@ func (api *API) NewMasterTokenInstance(chainID uint64, contractAddress string) ( return mastertoken.NewMasterToken(common.HexToAddress(contractAddress), backend) } +func (api *API) NewOwnerTokenInstance(chainID uint64, contractAddress string) (*ownertoken.OwnerToken, error) { + backend, err := api.s.manager.rpcClient.EthClient(chainID) + if err != nil { + return nil, err + } + return ownertoken.NewOwnerToken(common.HexToAddress(contractAddress), backend) +} + +func (api *API) NewCommunityTokenDeployerInstance(chainID uint64) (*communitytokendeployer.CommunityTokenDeployer, error) { + return api.s.manager.NewCommunityTokenDeployerInstance(chainID) +} + +func (api *API) NewCommunityOwnerTokenRegistryInstance(chainID uint64, contractAddress string) (*communityownertokenregistry.CommunityOwnerTokenRegistry, error) { + backend, err := api.s.manager.rpcClient.EthClient(chainID) + if err != nil { + return nil, err + } + return communityownertokenregistry.NewCommunityOwnerTokenRegistry(common.HexToAddress(contractAddress), backend) +} + func (api *API) NewCollectiblesInstance(chainID uint64, contractAddress string) (*collectibles.Collectibles, error) { return api.s.manager.NewCollectiblesInstance(chainID, contractAddress) } @@ -679,3 +868,91 @@ func (api *API) estimateMethod(ctx context.Context, chainID uint64, contractAddr } return estimate + uint64(float32(estimate)*0.1), nil } + +// Gets signer public key from smart contract with a given chainId and address +func (api *API) GetSignerPubKey(ctx context.Context, chainID uint64, contractAddress string) (string, error) { + callOpts := &bind.CallOpts{Context: ctx, Pending: false} + contractInst, err := api.NewOwnerTokenInstance(chainID, contractAddress) + if err != nil { + return "", err + } + signerPubKey, err := contractInst.SignerPublicKey(callOpts) + if err != nil { + return "", err + } + return common.Bytes2Hex(signerPubKey), nil +} + +// Gets signer public key directly from deployer contract +func (api *API) SafeGetSignerPubKey(ctx context.Context, chainID uint64, communityID string) (string, error) { + // 1. Get Owner Token contract address from deployer contract - SafeGetOwnerTokenAddress() + ownerTokenAddr, err := api.SafeGetOwnerTokenAddress(ctx, chainID, communityID) + if err != nil { + return "", err + } + // 2. Get Signer from owner token contract - GetSignerPubKey() + return api.GetSignerPubKey(ctx, chainID, ownerTokenAddr) +} + +// Gets owner token contract address from deployer contract +func (api *API) SafeGetOwnerTokenAddress(ctx context.Context, chainID uint64, communityID string) (string, error) { + callOpts := &bind.CallOpts{Context: ctx, Pending: false} + deployerContractInst, err := api.NewCommunityTokenDeployerInstance(chainID) + if err != nil { + return "", err + } + registryAddr, err := deployerContractInst.DeploymentRegistry(callOpts) + if err != nil { + return "", err + } + registryContractInst, err := api.NewCommunityOwnerTokenRegistryInstance(chainID, registryAddr.Hex()) + if err != nil { + return "", err + } + communityEthAddress, err := convert33BytesPubKeyToEthAddress(communityID) + if err != nil { + return "", err + } + ownerTokenAddress, err := registryContractInst.GetEntry(callOpts, communityEthAddress) + + return ownerTokenAddress.Hex(), err +} + +func (api *API) SetSignerPubKey(ctx context.Context, chainID uint64, contractAddress string, txArgs transactions.SendTxArgs, password string, newSignerPubKey string) (string, error) { + if len(newSignerPubKey) <= 0 { + return "", fmt.Errorf("signerPubKey is empty") + } + + transactOpts := txArgs.ToTransactOpts(utils.GetSigner(chainID, api.s.accountsManager, api.s.config.KeyStoreDir, txArgs.From, password)) + + contractInst, err := api.NewOwnerTokenInstance(chainID, contractAddress) + if err != nil { + return "", err + } + + tx, err := contractInst.SetSignerPublicKey(transactOpts, common.FromHex(newSignerPubKey)) + if err != nil { + return "", err + } + + err = api.s.pendingTracker.TrackPendingTransaction( + wcommon.ChainID(chainID), + tx.Hash(), + common.Address(txArgs.From), + transactions.SetSignerPublicKey, + transactions.AutoDelete, + ) + if err != nil { + log.Error("TrackPendingTransaction error", "error", err) + return "", err + } + + return tx.Hash().Hex(), nil +} + +func (api *API) EstimateSetSignerPubKey(ctx context.Context, chainID uint64, contractAddress string, fromAddress string, newSignerPubKey string) (uint64, error) { + if len(newSignerPubKey) <= 0 { + return 0, fmt.Errorf("signerPubKey is empty") + } + return api.estimateMethod(ctx, chainID, contractAddress, fromAddress, "setSignerPublicKey", newSignerPubKey) +} diff --git a/services/communitytokens/api_test.go b/services/communitytokens/api_test.go index abc51db6c..b60a4a4ba 100644 --- a/services/communitytokens/api_test.go +++ b/services/communitytokens/api_test.go @@ -6,6 +6,8 @@ import ( "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" + "github.com/status-im/status-go/services/wallet/bigint" ) @@ -70,3 +72,25 @@ func TestDeploymentParameters(t *testing.T) { requiredSupply = infiniteSupplyParams.GetInfiniteSupply() require.Equal(t, infiniteSupplyParams.GetSupply(), requiredSupply) } + +func TestTypedDataHash(t *testing.T) { + sigHash := common.Hex2Bytes("dd91c30357aafeb2792b5f0facbd83995943c1ea113a906ebbeb58bfeb27dfc2") + domainSep := common.Hex2Bytes("4a672b5a08e88d37f7239165a0c9e03a01196587d52c638c0c99cbee5ba527c8") + contractAddr := "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + signer := "0x54e3922e97e334905fb489be7c5df1f83cb1ce58" + deployer := "0x7c8999dC9a822c1f0Df42023113EDB4FDd543266" + goodHashResult := "0xccbb375343347491706cf4b43796f7b96ccc89c9e191a8b78679daeba1684ec7" + + typedHash, err := typedStructuredDataHash(domainSep, signer, deployer, contractAddr, 420) + require.NoError(t, err, "creating typed structured data hash") + require.Equal(t, goodHashResult, typedHash.String()) + + customTypedHash := customTypedStructuredDataHash(domainSep, sigHash, signer, deployer) + require.Equal(t, goodHashResult, customTypedHash.String()) +} + +func TestCompressedKeyToEthAddress(t *testing.T) { + ethAddr, err := convert33BytesPubKeyToEthAddress("0x02bcbe39785b55a22383f82ac631ea7500e204627369c4ea01d9296af0ea573f57") + require.NoError(t, err, "converting pub key to address") + require.Equal(t, "0x0A1ec0002dDB927B03049F1aD8D589aBEA4Ba4b3", ethAddr.Hex()) +} diff --git a/services/communitytokens/manager.go b/services/communitytokens/manager.go index b1ea795f7..eee24e871 100644 --- a/services/communitytokens/manager.go +++ b/services/communitytokens/manager.go @@ -2,11 +2,17 @@ package communitytokens import ( "context" + "fmt" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/signer/core/apitypes" "github.com/status-im/status-go/contracts/community-tokens/assets" "github.com/status-im/status-go/contracts/community-tokens/collectibles" + communitytokendeployer "github.com/status-im/status-go/contracts/community-tokens/deployer" + "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/eth-node/types" "github.com/status-im/status-go/rpc" "github.com/status-im/status-go/services/wallet/bigint" ) @@ -29,6 +35,18 @@ func (m *Manager) NewCollectiblesInstance(chainID uint64, contractAddress string return collectibles.NewCollectibles(common.HexToAddress(contractAddress), backend) } +func (m *Manager) NewCommunityTokenDeployerInstance(chainID uint64) (*communitytokendeployer.CommunityTokenDeployer, error) { + backend, err := m.rpcClient.EthClient(chainID) + if err != nil { + return nil, err + } + deployerAddr, err := communitytokendeployer.ContractAddress(chainID) + if err != nil { + return nil, err + } + return communitytokendeployer.NewCommunityTokenDeployer(deployerAddr, backend) +} + func (m *Manager) GetCollectiblesContractInstance(chainID uint64, contractAddress string) (*collectibles.Collectibles, error) { contractInst, err := m.NewCollectiblesInstance(chainID, contractAddress) if err != nil { @@ -97,3 +115,94 @@ func (m *Manager) GetAssetContractData(chainID uint64, contractAddress string) ( InfiniteSupply: GetInfiniteSupply().Cmp(totalSupply) == 0, }, nil } + +func convert33BytesPubKeyToEthAddress(pubKey string) (common.Address, error) { + decoded, err := types.DecodeHex(pubKey) + if err != nil { + return common.Address{}, err + } + communityPubKey, err := crypto.DecompressPubkey(decoded) + if err != nil { + return common.Address{}, err + } + return common.Address(crypto.PubkeyToAddress(*communityPubKey)), nil +} + +// Simpler version of hashing typed structured data alternative to typedStructuredDataHash. Keeping this for reference. +func customTypedStructuredDataHash(domainSeparator []byte, signatureTypedHash []byte, signer string, deployer string) types.Hash { + // every field should be 32 bytes, eth address is 20 bytes so padding should be added + emptyOffset := [12]byte{} + hashedEncoded := crypto.Keccak256Hash(signatureTypedHash, emptyOffset[:], common.HexToAddress(signer).Bytes(), + emptyOffset[:], common.HexToAddress(deployer).Bytes()) + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", domainSeparator, hashedEncoded.Bytes())) + return crypto.Keccak256Hash(rawData) +} + +// Returns a typed structured hash according to https://eips.ethereum.org/EIPS/eip-712 +// Domain separator from smart contract is used. +func typedStructuredDataHash(domainSeparator []byte, signer string, addressFrom string, deployerContractAddress string, chainID uint64) (types.Hash, error) { + myTypedData := apitypes.TypedData{ + Types: apitypes.Types{ + "Deploy": []apitypes.Type{ + {Name: "signer", Type: "address"}, + {Name: "deployer", Type: "address"}, + }, + "EIP712Domain": []apitypes.Type{ + {Name: "name", Type: "string"}, + {Name: "version", Type: "string"}, + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + }, + PrimaryType: "Deploy", + // Domain field should be here to keep correct structure but + // domainSeparator from smart contract is used. + Domain: apitypes.TypedDataDomain{ + Name: "CommunityTokenDeployer", // name from Deployer smart contract + Version: "1", // version from Deployer smart contract + ChainId: math.NewHexOrDecimal256(int64(chainID)), + VerifyingContract: deployerContractAddress, + }, + Message: apitypes.TypedDataMessage{ + "signer": signer, + "deployer": addressFrom, + }, + } + + typedDataHash, err := myTypedData.HashStruct(myTypedData.PrimaryType, myTypedData.Message) + if err != nil { + return types.Hash{}, err + } + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", domainSeparator, string(typedDataHash))) + return crypto.Keccak256Hash(rawData), nil +} + +// Creates +func (m *Manager) DeploymentSignatureDigest(chainID uint64, addressFrom string, communityID string) ([]byte, error) { + callOpts := &bind.CallOpts{Pending: false} + communityEthAddr, err := convert33BytesPubKeyToEthAddress(communityID) + if err != nil { + return nil, err + } + + deployerAddr, err := communitytokendeployer.ContractAddress(chainID) + if err != nil { + return nil, err + } + deployerContractInst, err := m.NewCommunityTokenDeployerInstance(chainID) + if err != nil { + return nil, err + } + + domainSeparator, err := deployerContractInst.DOMAINSEPARATOR(callOpts) + if err != nil { + return nil, err + } + + structedHash, err := typedStructuredDataHash(domainSeparator[:], communityEthAddr.Hex(), addressFrom, deployerAddr.Hex(), chainID) + if err != nil { + return nil, err + } + + return structedHash.Bytes(), nil +} diff --git a/services/communitytokens/service.go b/services/communitytokens/service.go index 02decd1c1..f5d67dee8 100644 --- a/services/communitytokens/service.go +++ b/services/communitytokens/service.go @@ -14,6 +14,7 @@ import ( type ServiceInterface interface { GetCollectibleContractData(chainID uint64, contractAddress string) (*CollectibleContractData, error) GetAssetContractData(chainID uint64, contractAddress string) (*AssetContractData, error) + DeploymentSignatureDigest(chainID uint64, addressFrom string, communityID string) ([]byte, error) } // Collectibles service @@ -70,3 +71,7 @@ func (s *Service) GetCollectibleContractData(chainID uint64, contractAddress str func (s *Service) GetAssetContractData(chainID uint64, contractAddress string) (*AssetContractData, error) { return s.manager.GetAssetContractData(chainID, contractAddress) } + +func (s *Service) DeploymentSignatureDigest(chainID uint64, addressFrom string, communityID string) ([]byte, error) { + return s.manager.DeploymentSignatureDigest(chainID, addressFrom, communityID) +} diff --git a/services/communitytokens/token_instances.go b/services/communitytokens/token_instances.go index 4d3201ad1..bc6d2fe43 100644 --- a/services/communitytokens/token_instances.go +++ b/services/communitytokens/token_instances.go @@ -12,6 +12,7 @@ import ( "github.com/status-im/status-go/contracts/community-tokens/assets" "github.com/status-im/status-go/contracts/community-tokens/collectibles" "github.com/status-im/status-go/contracts/community-tokens/mastertoken" + "github.com/status-im/status-go/contracts/community-tokens/ownertoken" "github.com/status-im/status-go/protocol/communities/token" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/services/wallet/bigint" @@ -24,6 +25,32 @@ type TokenInstance interface { PackMethod(ctx context.Context, methodName string, args ...interface{}) ([]byte, error) } +// Owner Token +type OwnerTokenInstance struct { + TokenInstance + instance *ownertoken.OwnerToken +} + +func (t OwnerTokenInstance) RemoteBurn(transactOpts *bind.TransactOpts, tokenIds []*big.Int) (*types.Transaction, error) { + return nil, fmt.Errorf("remote destruction for owner token not implemented") +} + +func (t OwnerTokenInstance) Mint(transactOpts *bind.TransactOpts, walletAddresses []string, amount *bigint.BigInt) (*types.Transaction, error) { + return nil, fmt.Errorf("minting for owner token not implemented") +} + +func (t OwnerTokenInstance) SetMaxSupply(transactOpts *bind.TransactOpts, maxSupply *big.Int) (*types.Transaction, error) { + return nil, fmt.Errorf("setting max supply for owner token not implemented") +} + +func (t OwnerTokenInstance) PackMethod(ctx context.Context, methodName string, args ...interface{}) ([]byte, error) { + ownerTokenABI, err := abi.JSON(strings.NewReader(ownertoken.OwnerTokenABI)) + if err != nil { + return []byte{}, err + } + return ownerTokenABI.Pack(methodName, args...) +} + // Master Token type MasterTokenInstance struct { TokenInstance @@ -88,7 +115,7 @@ type AssetInstance struct { } func (t AssetInstance) RemoteBurn(transactOpts *bind.TransactOpts, tokenIds []*big.Int) (*types.Transaction, error) { - return nil, fmt.Errorf("remote burn not implemented") + return nil, fmt.Errorf("remote destruction for assets not implemented") } // The amount should be in smallest denomination of the asset (like wei) with decimal = 18, eg. @@ -122,6 +149,12 @@ func NewTokenInstance(api *API, chainID uint64, contractAddress string) (TokenIn return nil, err } switch { + case privLevel == token.OwnerLevel: + contractInst, err := api.NewOwnerTokenInstance(chainID, contractAddress) + if err != nil { + return nil, err + } + return &OwnerTokenInstance{instance: contractInst}, nil case privLevel == token.MasterLevel: contractInst, err := api.NewMasterTokenInstance(chainID, contractAddress) if err != nil { diff --git a/services/ext/api.go b/services/ext/api.go index 60bcd5d2c..bf40d9376 100644 --- a/services/ext/api.go +++ b/services/ext/api.go @@ -994,6 +994,10 @@ func (api *PublicAPI) SignMessageWithChatKey(ctx context.Context, message string return api.service.messenger.SignMessage(message) } +func (api *PublicAPI) CreateCommunityTokenDeploymentSignature(ctx context.Context, chainID uint64, addressFrom string, communityID string) (types.HexBytes, error) { + return api.service.messenger.CreateCommunityTokenDeploymentSignature(ctx, chainID, addressFrom, communityID) +} + // wallet connect session apis func (api *PublicAPI) AddWalletConnectSession(ctx context.Context, request *requests.AddWalletConnectSession) error { return api.service.messenger.AddWalletConnectSession(request) diff --git a/transactions/pendingtxtracker.go b/transactions/pendingtxtracker.go index bde7b279a..1aae84d05 100644 --- a/transactions/pendingtxtracker.go +++ b/transactions/pendingtxtracker.go @@ -358,6 +358,7 @@ const ( RemoteDestructCollectible PendingTrxType = "RemoteDestructCollectible" BurnCommunityToken PendingTrxType = "BurnCommunityToken" DeployOwnerToken PendingTrxType = "DeployOwnerToken" + SetSignerPublicKey PendingTrxType = "SetSignerPublicKey" ) type PendingTransaction struct {