Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x075854b315F2cd7eC490853Bc5589B09E546449f
Balance 0 ETH
Nonce 1
Code Size 14335 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14335 bytes
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063b88d4fde116100b8578063e2d979341161007c578063e2d9793414610591578063e985e9c5146105a4578063f2fde38b146105d2578063f487c602146105e5578063f7ea7a3d146105f857600080fd5b8063b88d4fde14610525578063b979b1a314610538578063c16ac06f1461054b578063c87b56dd1461055e578063cca3e8321461057157600080fd5b806395d89b41116100ff57806395d89b41146104b6578063978fbc3c146104be578063a22cb465146104ec578063a5eb6ff2146104ff578063b4f035a41461051257600080fd5b806370a0823114610457578063751149791461046a5780637ca510a41461047d5780637cb81fe5146104905780638da5cb5b146104a357600080fd5b80633b500607116101c957806357b3aa761161018d57806357b3aa76146103e85780635a1389111461040b5780636352211e1461041e578063639807d0146104315780636509e7761461044457600080fd5b80633b5006071461036c57806342842e0e1461037f578063438b6300146103925780634724e546146103b25780634be99cd6146103d557600080fd5b806323b872dd1161021057806323b872dd146102f75780632463a55a1461030a578063383505411461031d5780633a3473b6146103465780633ae23cc41461035957600080fd5b806301ffc9a71461024d57806306fdde0314610275578063081812fc1461028a578063095ea7b3146102cb57806318160ddd146102e0575b600080fd5b61026061025b3660046131bf565b61060b565b60405190151581526020015b60405180910390f35b61027d610642565b60405161026c9190613541565b6102b361029836600461333f565b6008602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161026c565b6102de6102d9366004612fea565b6106d0565b005b6102e960045481565b60405190815260200161026c565b6102de610305366004612f15565b610824565b6102de610318366004612daa565b61083a565b6102b361032b36600461333f565b6005602052600090815260409020546001600160a01b031681565b6102de610354366004612e8d565b6108d4565b600a546102b3906001600160a01b031681565b6102de61037a366004613081565b61091e565b6102de61038d366004612f15565b610a22565b6103a56103a0366004612d30565b610a3d565b60405161026c91906134fd565b6102606103c0366004612d30565b60076020526000908152604090205460ff1681565b6102de6103e3366004612d30565b610b65565b6102606103f63660046133fc565b60116020526000908152604090205460ff1681565b600f546102b3906001600160a01b031681565b6102b361042c36600461333f565b610bb1565b600e546102b3906001600160a01b031681565b600b546102b3906001600160a01b031681565b6102e9610465366004612d30565b610c7c565b6102de6104783660046130fe565b610d36565b6102de61048b366004613016565b610ea8565b6102de61049e366004613371565b610fca565b6000546102b3906001600160a01b031681565b61027d61140b565b6102606104cc366004612fea565b601060209081526000928352604080842090915290825290205460ff1681565b6102de6104fa366004612fb5565b611418565b600d546102b3906001600160a01b031681565b6102de610520366004613436565b611427565b6102de610533366004612f56565b611476565b6102de6105463660046133aa565b61148d565b6001546102b3906001600160a01b031681565b61027d61056c36600461333f565b611a6e565b6102e961057f366004612d30565b60066020526000908152604090205481565b600c546102b3906001600160a01b031681565b6102606105b2366004612d71565b600960209081526000928352604080842090915290825290205460ff1681565b6102de6105e0366004612d30565b611b45565b6102de6105f3366004612e2c565b611b91565b6102de61060636600461333f565b611bd3565b60006380ac58cd60e01b6001600160e01b03198316148061063c5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6002805461064f906136d2565b80601f016020809104026020016040519081016040528092919081815260200182805461067b906136d2565b80156106c85780601f1061069d576101008083540402835291602001916106c8565b820191906000526020600020905b8154815290600101906020018083116106ab57829003601f168201915b505050505081565b60006106db82610bb1565b9050806001600160a01b0316836001600160a01b0316141561075d5760405162461bcd60e51b815260206004820152603060248201527f455243373231494d69677261746f723a20617070726f766528292063616e6e6f60448201526f7420617070726f7665206f776e65722160801b60648201526084015b60405180910390fd5b336001600160a01b038216148061079757506001600160a01b038116600090815260096020908152604080832033845290915290205460ff165b6108155760405162461bcd60e51b815260206004820152604360248201527f455243373231494d69677261746f723a20617070726f766528292043616c6c6560448201527f72206973206e6f74206f776e6572206f66206973417070726f766564466f72416064820152626c6c2160e81b608482015260a401610754565b61081f8383611c02565b505050565b61082f838383611c91565b61081f838383611f48565b6000546001600160a01b031633146108645760405162461bcd60e51b815260040161075490613554565b600a80546001600160a01b03199081166001600160a01b0396871617909155600b8054821696861696909617909555600c8054861693851693909317909255600d8054851695841695909517909455600e8054841694831694909417909355600f80549092169216919091179055565b60005b82518110156109175761090585858584815181106108f7576108f7613760565b602002602001015185611476565b8061090f8161370d565b9150506108d7565b5050505050565b81518351146109605760405162461bcd60e51b815260206004820152600e60248201526d4d697373696e672070616972732160901b6044820152606401610754565b80518351146109a85760405162461bcd60e51b81526020600482015260146024820152734d697373696e672072656e64657220747970652160601b6044820152606401610754565b60005b8351811015610a1c57610a0a8482815181106109c9576109c9613760565b60200260200101518483815181106109e3576109e3613760565b60200260200101518484815181106109fd576109fd613760565b6020026020010151610fca565b80610a148161370d565b9150506109ab565b50505050565b61081f83838360405180602001604052806000815250611476565b60606000610a4a83610c7c565b90506000816001600160401b03811115610a6657610a66613776565b604051908082528060200260200182016040528015610a8f578160200160208202803683370190505b50600454909150600090815b81811015610b5a576000610aae82610bb1565b6001600160a01b0316148015610ae7575083610acb600187613678565b81518110610adb57610adb613760565b60200260200101516000145b15610afa5781610af68161370d565b9250505b866001600160a01b0316610b0d82610bb1565b6001600160a01b03161415610b485780848481518110610b2f57610b2f613760565b602090810291909101015282610b448161370d565b9350505b80610b528161370d565b915050610a9b565b509195945050505050565b6000546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161075490613554565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610cbb8211158015610bda57506000828152600560205260409020546001600160a01b0316155b15610c5b576001546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190612d54565b506000908152600560205260409020546001600160a01b031690565b919050565b6001600160a01b03811660009081526007602052604081205460ff1615610cb957506001600160a01b031660009081526006602052604090205490565b6001546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015610cfe57600080fd5b505afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190613358565b8351855114610d785760405162461bcd60e51b815260206004820152600e60248201526d4d697373696e672070616972732160901b6044820152606401610754565b8251855114610dc05760405162461bcd60e51b81526020600482015260146024820152734d697373696e672072656e64657220747970652160601b6044820152606401610754565b8051855114610e115760405162461bcd60e51b815260206004820152601d60248201527f55706c6f616420494473206d69736d617463686564206c656e677468210000006044820152606401610754565b60005b8551811015610ea057610e8e868281518110610e3257610e32613760565b6020026020010151868381518110610e4c57610e4c613760565b6020026020010151868481518110610e6657610e66613760565b602002602001015186868681518110610e8157610e81613760565b602002602001015161148d565b80610e988161370d565b915050610e14565b505050505050565b6000546001600160a01b03163314610ed25760405162461bcd60e51b815260040161075490613554565b828114610f2d5760405162461bcd60e51b8152602060048201526024808201527f696e697469616c697a6528293a206172726179206c656e677468206d69736d616044820152637463682160e01b6064820152608401610754565b60005b8381101561091757848482818110610f4a57610f4a613760565b90506020020135838383818110610f6357610f63613760565b9050602002016020810190610f789190612d30565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480610fc28161370d565b915050610f30565b600e546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110469190612d54565b6001600160a01b0316336001600160a01b03161480156110f25750600f546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156110a557600080fd5b505afa1580156110b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dd9190612d54565b6001600160a01b0316336001600160a01b0316145b61112e5760405162461bcd60e51b815260206004820152600d60248201526c556e6f776e656420706169722160981b6044820152606401610754565b60ff8082166000908152601160205260409020541661118f5760405162461bcd60e51b815260206004820181905260248201527f546869732072656e6465722074797065206973206e6f7420616c6c6f776564216044820152606401610754565b600e546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906111c39033903090889060040161349c565b600060405180830381600087803b1580156111dd57600080fd5b505af11580156111f1573d6000803e3d6000fd5b5050600f546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd91506112299033903090879060040161349c565b600060405180830381600087803b15801561124357600080fd5b505af1158015611257573d6000803e3d6000fd5b50506040516bffffffffffffffffffffffff193360601b166020820152426034820152446054820152607481018690526094810185905260009250600a915060b4016040516020818303038152906040528051906020012060001c6112bc9190613728565b6112c7906001613660565b600b5460405163813fd7fd60e01b815261ffff861660048201529192506000916001600160a01b039091169063813fd7fd9060240160206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190613324565b6040805160e08101825260ff80861682528616602082015261ffff80891682840152878116606083015260006080830181905260a0830152831660c0820152600a5460048054935163e8629cd960e01b815294955091936001600160a01b039091169263e8629cd9926113c192869101613579565b600060405180830381600087803b1580156113db57600080fd5b505af11580156113ef573d6000803e3d6000fd5b505050506113ff33600454611fcf565b610ea0336004546121b6565b6003805461064f906136d2565b611423338383612454565b5050565b6000546001600160a01b031633146114515760405162461bcd60e51b815260040161075490613554565b60ff919091166000908152601160205260409020805460ff1916911515919091179055565b611481848484611c91565b610a1c84848484612557565b600e546040516331a9108f60e11b8152600481018790526001600160a01b0390911690636352211e9060240160206040518083038186803b1580156114d157600080fd5b505afa1580156114e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115099190612d54565b6001600160a01b0316336001600160a01b03161480156115b55750600f546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561156857600080fd5b505afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190612d54565b6001600160a01b0316336001600160a01b0316145b6115f15760405162461bcd60e51b815260206004820152600d60248201526c556e6f776e656420706169722160981b6044820152606401610754565b6040516331a9108f60e11b8152600481018290526001600160a01b03831690636352211e9060240160206040518083038186803b15801561163157600080fd5b505afa158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190612d54565b6001600160a01b0316336001600160a01b0316146116c95760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f6e2774206f776e207468697320636861726163746572210000006044820152606401610754565b6001600160a01b038216600090815260106020908152604080832084845290915290205460ff161561174f5760405162461bcd60e51b815260206004820152602960248201527f54686973206368617261637465722068617320616c7265616479206265656e2060448201526875706c6f616465642160b81b6064820152608401610754565b60ff808416600090815260116020526040902054166117b05760405162461bcd60e51b815260206004820181905260248201527f546869732072656e6465722074797065206973206e6f7420616c6c6f776564216044820152606401610754565b600e546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906117e490339030908a9060040161349c565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b5050600f546040516323b872dd60e01b81526001600160a01b0390911692506323b872dd915061184a9033903090899060040161349c565b600060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506001600160a01b038281166000818152601060209081526040808320868452909152808220805460ff19166001179055600a549051630da46c0f60e01b8152600481019390935290921690630da46c0f9060240160206040518083038186803b1580156118e857600080fd5b505afa1580156118fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119209190613419565b600b5460405163813fd7fd60e01b815261ffff881660048201529192506000916001600160a01b039091169063813fd7fd9060240160206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a59190613324565b6040805160e08101825260ff80861682528816602082015261ffff808b1682840152898116606083015260006080830181905260a0830152831660c0820152600a5460048054935163e8629cd960e01b815294955091936001600160a01b039091169263e8629cd992611a1a92869101613579565b600060405180830381600087803b158015611a3457600080fd5b505af1158015611a48573d6000803e3d6000fd5b50505050611a5833600454611fcf565b611a64336004546121b6565b5050505050505050565b6060611a79826126b5565b611ac55760405162461bcd60e51b815260206004820152601960248201527f43686172616374657220646f6573206e6f7420657869737421000000000000006044820152606401610754565b600d54604051630eaa6a0560e31b8152600481018490526001600160a01b039091169063755350289060240160006040518083038186803b158015611b0957600080fd5b505afa158015611b1d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261063c91908101906131f9565b6000546001600160a01b03163314611b6f5760405162461bcd60e51b815260040161075490613554565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005b8151811015610a1c57611bc18484848481518110611bb457611bb4613760565b6020026020010151610824565b80611bcb8161370d565b915050611b94565b6000546001600160a01b03163314611bfd5760405162461bcd60e51b815260040161075490613554565b600455565b6000818152600860205260409020546001600160a01b0383811691161461142357600081815260086020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c5882610bb1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c5460405163632447c960e01b81526001600160a01b0385811660048301529091169063632447c990602401600060405180830381600087803b158015611cd857600080fd5b505af1158015611cec573d6000803e3d6000fd5b5050600c5460405163632447c960e01b81526001600160a01b038681166004830152909116925063632447c99150602401600060405180830381600087803b158015611d3757600080fd5b505af1158015611d4b573d6000803e3d6000fd5b5050600a54604051634810bc5960e01b815260048101859052600093506001600160a01b039091169150634810bc599060240160e06040518083038186803b158015611d9657600080fd5b505afa158015611daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dce919061326f565b600b54608082015160a083015160c0840151604051633616171160e01b815260ff909316600484015261ffff91821660248401521660448201529192506000916001600160a01b039091169063361617119060640160206040518083038186803b158015611e3b57600080fd5b505afa158015611e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e739190613358565b600c54604051631fa86bd160e31b81526001600160a01b0388811660048301526024820184905292935091169063fd435e8890604401600060405180830381600087803b158015611ec357600080fd5b505af1158015611ed7573d6000803e3d6000fd5b5050600c5460405163b5862c2560e01b81526001600160a01b03888116600483015260248201869052909116925063b5862c259150604401600060405180830381600087803b158015611f2957600080fd5b505af1158015611f3d573d6000803e3d6000fd5b505050505050505050565b611f5233826126e6565b611fc45760405162461bcd60e51b815260206004820152603b60248201527f455243373231494d69677261746f723a207472616e7366657246726f6d28292060448201527f5f6973417070726f7665644f724f776e6572203d2066616c73652100000000006064820152608401610754565b61081f8383836127e1565b600c5460405163632447c960e01b81526001600160a01b0384811660048301529091169063632447c990602401600060405180830381600087803b15801561201657600080fd5b505af115801561202a573d6000803e3d6000fd5b5050600a54604051634810bc5960e01b815260048101859052600093506001600160a01b039091169150634810bc599060240160e06040518083038186803b15801561207557600080fd5b505afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad919061326f565b600b54608082015160a083015160c0840151604051633616171160e01b815260ff909316600484015261ffff91821660248401521660448201529192506000916001600160a01b039091169063361617119060640160206040518083038186803b15801561211a57600080fd5b505afa15801561212e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121529190613358565b600c5460405163b5862c2560e01b81526001600160a01b0387811660048301526024820184905292935091169063b5862c2590604401600060405180830381600087803b1580156121a257600080fd5b505af1158015611a64573d6000803e3d6000fd5b6001600160a01b0382166122235760405162461bcd60e51b815260206004820152602e60248201527f455243373231494d69677261746f723a205f6d696e742829204d696e7420746f60448201526d205a65726f20416464726573732160901b6064820152608401610754565b600061222e82610bb1565b6001600160a01b03161461229b5760405162461bcd60e51b815260206004820152602e60248201527f455243373231494d69677261746f723a205f6d696e74282920546f6b656e206160448201526d6c7265616479204578697374732160901b6064820152608401610754565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600790915290205460ff1615612308576001600160a01b03821660009081526006602052604081208054916122fe8361370d565b91905055506123c0565b6001546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b15801561234d57600080fd5b505afa158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190613358565b612390906001613660565b6001600160a01b0383166000908152600660209081526040808320939093556007905220805460ff191660011790555b600480549060006123d08361370d565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161244891815260200190565b60405180910390a25050565b816001600160a01b0316836001600160a01b031614156124ea5760405162461bcd60e51b815260206004820152604560248201527f455243373231494d69677261746f723a205f736574417070726f76616c466f7260448201527f416c6c2829204f776e6572206d757374206e6f7420626520746865204f70657260648201526461746f722160d81b608482015260a401610754565b6001600160a01b03838116600081815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612562848484610824565b6001600160a01b0383163b15610a1c576000836001600160a01b031663150b7a023387868660405160240161259a94939291906134c0565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516125d39190613480565b600060405180830381855afa9150503d806000811461260e576040519150601f19603f3d011682016040523d82523d6000602084013e612613565b606091505b5091505060008180602001905181019061262d91906131dc565b9050630a85bd0160e11b6001600160e01b0319821614610ea05760405162461bcd60e51b815260206004820152603d60248201527f455243373231494d69677261746f723a20736166655472616e7366657246726f60448201527f6d282920746f5f206e6f742045524337323152656365697661626c65210000006064820152608401610754565b6000610cbb82116126c857506001919050565b506000908152600560205260409020546001600160a01b0316151590565b6000806126f283610bb1565b90506001600160a01b0381166127705760405162461bcd60e51b815260206004820152603c60248201527f455243373231494d69677261746f723a205f6973417070726f7665644f724f7760448201527f6e65722829204f776e6572206973205a65726f204164647265737321000000006064820152608401610754565b806001600160a01b0316846001600160a01b031614806127a957506000838152600860205260409020546001600160a01b038581169116145b806127d957506001600160a01b0380821660009081526009602090815260408083209388168352929052205460ff165b949350505050565b6127ea81610bb1565b6001600160a01b0316836001600160a01b031614612872576040805162461bcd60e51b81526020600482015260248101919091527f455243373231494d69677261746f723a205f7472616e7366657228292054726160448201527f6e736665722066726f6d5f20213d206f776e65724f6628746f6b656e49645f296064820152608401610754565b6001600160a01b0382166128e75760405162461bcd60e51b815260206004820152603660248201527f455243373231494d69677261746f723a205f7472616e736665722829205472616044820152756e7366657220746f205a65726f20416464726573732160501b6064820152608401610754565b6000818152600860205260409020546001600160a01b03161561292157600081815260086020526040902080546001600160a01b03191690555b600081815260056020908152604080832080546001600160a01b0319166001600160a01b038781169190911790915586168352600790915290205460ff1615612992576001600160a01b0383166000908152600660205260408120805491612988836136bb565b9190505550612a4a565b600180546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b1580156129d857600080fd5b505afa1580156129ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a109190613358565b612a1a9190613678565b6001600160a01b0384166000908152600660209081526040808320939093556007905220805460ff191660011790555b6001600160a01b03821660009081526007602052604090205460ff1615612a99576001600160a01b0382166000908152600660205260408120805491612a8f8361370d565b9190505550612b51565b6001546040516370a0823160e01b81526001600160a01b038481166004830152909116906370a082319060240160206040518083038186803b158015612ade57600080fd5b505afa158015612af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b169190613358565b612b21906001613660565b6001600160a01b0383166000908152600660209081526040808320939093556007905220805460ff191660011790555b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008083601f840112612ba957600080fd5b5081356001600160401b03811115612bc057600080fd5b6020830191508360208260051b8501011115612bdb57600080fd5b9250929050565b600082601f830112612bf357600080fd5b81356020612c08612c0383613616565b6135e6565b80838252828201915082860187848660051b8901011115612c2857600080fd5b60005b85811015612c4757813584529284019290840190600101612c2b565b5090979650505050505050565b600082601f830112612c6557600080fd5b81356020612c75612c0383613616565b80838252828201915082860187848660051b8901011115612c9557600080fd5b60005b85811015612c47578135612cab816137ba565b84529284019290840190600101612c98565b80358015158114610c7757600080fd5b600082601f830112612cde57600080fd5b8135612cec612c0382613639565b818152846020838601011115612d0157600080fd5b816020850160208301376000918101602001919091529392505050565b805161ffff81168114610c7757600080fd5b600060208284031215612d4257600080fd5b8135612d4d8161378c565b9392505050565b600060208284031215612d6657600080fd5b8151612d4d8161378c565b60008060408385031215612d8457600080fd5b8235612d8f8161378c565b91506020830135612d9f8161378c565b809150509250929050565b60008060008060008060c08789031215612dc357600080fd5b8635612dce8161378c565b95506020870135612dde8161378c565b94506040870135612dee8161378c565b93506060870135612dfe8161378c565b92506080870135612e0e8161378c565b915060a0870135612e1e8161378c565b809150509295509295509295565b600080600060608486031215612e4157600080fd5b8335612e4c8161378c565b92506020840135612e5c8161378c565b915060408401356001600160401b03811115612e7757600080fd5b612e8386828701612be2565b9150509250925092565b60008060008060808587031215612ea357600080fd5b8435612eae8161378c565b93506020850135612ebe8161378c565b925060408501356001600160401b0380821115612eda57600080fd5b612ee688838901612be2565b93506060870135915080821115612efc57600080fd5b50612f0987828801612ccd565b91505092959194509250565b600080600060608486031215612f2a57600080fd5b8335612f358161378c565b92506020840135612f458161378c565b929592945050506040919091013590565b60008060008060808587031215612f6c57600080fd5b8435612f778161378c565b93506020850135612f878161378c565b92506040850135915060608501356001600160401b03811115612fa957600080fd5b612f0987828801612ccd565b60008060408385031215612fc857600080fd5b8235612fd38161378c565b9150612fe160208401612cbd565b90509250929050565b60008060408385031215612ffd57600080fd5b82356130088161378c565b946020939093013593505050565b6000806000806040858703121561302c57600080fd5b84356001600160401b038082111561304357600080fd5b61304f88838901612b97565b9096509450602087013591508082111561306857600080fd5b5061307587828801612b97565b95989497509550505050565b60008060006060848603121561309657600080fd5b83356001600160401b03808211156130ad57600080fd5b6130b987838801612be2565b945060208601359150808211156130cf57600080fd5b6130db87838801612be2565b935060408601359150808211156130f157600080fd5b50612e8386828701612c54565b600080600080600060a0868803121561311657600080fd5b85356001600160401b038082111561312d57600080fd5b61313989838a01612be2565b9650602088013591508082111561314f57600080fd5b61315b89838a01612be2565b9550604088013591508082111561317157600080fd5b61317d89838a01612c54565b94506060880135915061318f8261378c565b909250608087013590808211156131a557600080fd5b506131b288828901612be2565b9150509295509295909350565b6000602082840312156131d157600080fd5b8135612d4d816137a4565b6000602082840312156131ee57600080fd5b8151612d4d816137a4565b60006020828403121561320b57600080fd5b81516001600160401b0381111561322157600080fd5b8201601f8101841361323257600080fd5b8051613240612c0382613639565b81815285602083850101111561325557600080fd5b61326682602083016020860161368f565b95945050505050565b600060e0828403121561328157600080fd5b60405160e081018181106001600160401b03821117156132a3576132a3613776565b60405282516132b1816137ba565b815260208301516132c1816137ba565b60208201526132d260408401612d1e565b60408201526132e360608401612d1e565b606082015260808301516132f6816137ba565b608082015261330760a08401612d1e565b60a082015261331860c08401612d1e565b60c08201529392505050565b60006020828403121561333657600080fd5b612d4d82612d1e565b60006020828403121561335157600080fd5b5035919050565b60006020828403121561336a57600080fd5b5051919050565b60008060006060848603121561338657600080fd5b8335925060208401359150604084013561339f816137ba565b809150509250925092565b600080600080600060a086880312156133c257600080fd5b853594506020860135935060408601356133db816137ba565b925060608601356133eb8161378c565b949793965091946080013592915050565b60006020828403121561340e57600080fd5b8135612d4d816137ba565b60006020828403121561342b57600080fd5b8151612d4d816137ba565b6000806040838503121561344957600080fd5b8235612fd3816137ba565b6000815180845261346c81602086016020860161368f565b601f01601f19169290920160200192915050565b6000825161349281846020870161368f565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134f390830184613454565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561353557835183529284019291840191600101613519565b50909695505050505050565b602081526000612d4d6020830184613454565b6020808252600b908201526a4f776e61626c653a204e4f60a81b604082015260600190565b60006101008201905083825260ff835116602083015260ff6020840151166040830152604083015161ffff808216606085015280606086015116608085015260ff60808601511660a08501528060a08601511660c08501528060c08601511660e085015250509392505050565b604051601f8201601f191681016001600160401b038111828210171561360e5761360e613776565b604052919050565b60006001600160401b0382111561362f5761362f613776565b5060051b60200190565b60006001600160401b0382111561365257613652613776565b50601f01601f191660200190565b600082198211156136735761367361374a565b500190565b60008282101561368a5761368a61374a565b500390565b60005b838110156136aa578181015183820152602001613692565b83811115610a1c5750506000910152565b6000816136ca576136ca61374a565b506000190190565b600181811c908216806136e657607f821691505b6020821081141561370757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137215761372161374a565b5060010190565b60008261374557634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146137a157600080fd5b50565b6001600160e01b0319811681146137a157600080fd5b60ff811681146137a157600080fdfea2646970667358221220323cfbb290e1c0b14ace1c62038d9b505209f2fa97089a21d233bf611a9d3fe764736f6c63430008070033

Verified Source Code Partial Match

Compiler: v0.8.7+commit.e28d00a7 EVM: london Optimization: Yes (200 runs)
MTMCharacters.sol 507 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// This is a special "passive" migration contract of MTM. 
// Every single method is modified and has custom "passive" migration proxy logic.

abstract contract Ownable {
    address public owner;
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Ownable: NO"); _; }
    function transferOwnership(address newOwner_) public virtual onlyOwner {
        owner = newOwner_; 
    }
}

interface iCM {
    // Views
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function totalSupply() external view returns (uint256);
    function ownerOf(uint256 tokenId_) external view returns (address);
    function balanceOf(address address_) external view returns (uint256);
    function getApproved(uint256 tokenId_) external view returns (address);
    function isApprovedForAll(address owner_, address operator_) external view returns (bool);
}

// ERC721I Functions, but we modified it for passive migration method
// ERC721IMigrator uses local state storage for gas savings.
// It is like ERC721IStorage and ERC721IOperator combined into one.
contract ERC721IMigrator is Ownable {

    // Interface the MTM Characters Main V1
    iCM public CM;
    function setCM(address address_) external onlyOwner {
        CM = iCM(address_);
    }

    // Name and Symbol Stuff
    string public name; string public symbol;
    constructor(string memory name_, string memory symbol_) {
        name = name_; symbol = symbol_;
    }

    // We turned these to _ prefix so we can use a override function
    // To display custom proxy and passive migration logic
    uint256 public totalSupply;
    mapping(uint256 => address) public _ownerOf;
    mapping(address => uint256) public _balanceOf;

    // Here we have to keep track of a initialized balanceOf to prevent any view issues
    mapping(address => bool) public _balanceOfInitialized;

    
    // We disregard the previous contract's approvals
    mapping(uint256 => address) public getApproved;
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    // // TotalSupply Setter
    // Here, we set the totalSupply to equal the previous
    function setTotalSupply(uint256 totalSupply_) external onlyOwner {
        totalSupply = totalSupply_; 
    }

    // // Initializer
    // This is a custom Transfer emitter for the initialize of this contract only
    function initialize(uint256[] calldata tokenIds_, address[] calldata owners_) external onlyOwner {
        require(tokenIds_.length == owners_.length,
            "initialize(): array length mismatch!");
        
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            emit Transfer(address(0x0), owners_[i], tokenIds_[i]);
        }
    }

    // OwnerOf (Proxy View)
    function ownerOf(uint256 tokenId_) public view returns (address) {
        // Find out of the _ownerOf slot has been initialized.
        // We hardcode the tokenId_ to save gas.
        if (tokenId_ <= 3259 && _ownerOf[tokenId_] == address(0x0)) {
            // _ownerOf[tokenId_] is not initialized yet, so return the CM V1 value.
            return CM.ownerOf(tokenId_);
        } else {
            // If it is already initialized, or is higher than migration Id
            // return local state storage instead.
            return _ownerOf[tokenId_];
        }
    }

    // BalanceOf (Proxy View)
    function balanceOf(address address_) public view returns (uint256) {
        // Proxy the balance function
        // We have a tracker of initialization of _balanceOf to track the differences
        // If initialized, we use the state storage. Otherwise, we use CM V1 storage.
        if (_balanceOfInitialized[address_]) {
            return _balanceOf[address_]; 
        } else {
            return CM.balanceOf(address_);
        }
    }

    // Events! L[o_o]⅃ 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Mint(address indexed to, uint256 tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    // Functions
    function _mint(address to_, uint256 tokenId_) internal virtual {
        require(to_ != address(0x0), "ERC721IMigrator: _mint() Mint to Zero Address!");
        require(ownerOf(tokenId_) == address(0x0), "ERC721IMigrator: _mint() Token already Exists!");

        // // ERC721I Logic

        // We set _ownerOf in a normal way
        _ownerOf[tokenId_] = to_;

        // We rebalance the _balanceOf on initialization, otherwise follow normal ERC721I logic
        if (_balanceOfInitialized[to_]) {
            // If we are already initialized
            _balanceOf[to_]++;
        } else {
            _balanceOf[to_] = (CM.balanceOf(to_) + 1);
            _balanceOfInitialized[to_] = true;
        }

        // Increment TotalSupply as normal
        totalSupply++;

        // // ERC721I Logic End

        // Emit Events
        emit Transfer(address(0x0), to_, tokenId_);
        emit Mint(to_, tokenId_);
    }

    function _transfer(address from_, address to_, uint256 tokenId_) internal virtual {
        require(from_ == ownerOf(tokenId_), "ERC721IMigrator: _transfer() Transfer from_ != ownerOf(tokenId_)");
        require(to_ != address(0x0), "ERC721IMigrator: _transfer() Transfer to Zero Address!");

        // // ERC721I Transfer Logic

        // If token has an approval
        if (getApproved[tokenId_] != address(0x0)) {
            // Remove the outstanding approval
            getApproved[tokenId_] = address(0x0);
        }

        // Set the _ownerOf to the receiver
        _ownerOf[tokenId_] = to_;

        // // Initialize and Rebalance _balanceOf 
        if (_balanceOfInitialized[from_]) {
            // If from_ is initialized, do normal balance change
            _balanceOf[from_]--;
        } else {
            // If from_ is NOT initialized, follow rebalance flow
            _balanceOf[from_] = (CM.balanceOf(from_) - 1);
            // Set from_ as initialized
            _balanceOfInitialized[from_] = true;
        }

        if (_balanceOfInitialized[to_]) {
            // If to_ is initialized, do normal balance change
            _balanceOf[to_]++;
        } else {
            // If to_ is NOT initialized, follow rebalance flow
            _balanceOf[to_] = (CM.balanceOf(to_) + 1);
            // Set to_ as initialized;
            _balanceOfInitialized[to_] = true;
        }

        // // ERC721I Transfer Logic End

        emit Transfer(from_, to_, tokenId_);
    }

    // Approvals
    function _approve(address to_, uint256 tokenId_) internal virtual {
        if (getApproved[tokenId_] != to_) {
            getApproved[tokenId_] = to_;
            emit Approval(ownerOf(tokenId_), to_, tokenId_);
        }
    }
    function _setApprovalForAll(address owner_, address operator_, bool approved_) internal virtual {
        require(owner_ != operator_, "ERC721IMigrator: _setApprovalForAll() Owner must not be the Operator!");
        isApprovedForAll[owner_][operator_] = approved_;
        emit ApprovalForAll(owner_, operator_, approved_);
    }

    // // Functional Internal Views
    function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal view returns (bool) {
        address _owner = ownerOf(tokenId_);
        require(_owner != address(0x0), "ERC721IMigrator: _isApprovedOrOwner() Owner is Zero Address!");
        return (spender_ == _owner // is the owner OR
            || spender_ == getApproved[tokenId_] // is approved for token OR
            || isApprovedForAll[_owner][spender_] // isApprovedForAll spender 
        );
    }

    // Exists
    function _exists(uint256 tokenId_) internal view virtual returns (bool) {
        // We hardcode tokenId_ for gas savings
        if (tokenId_ <= 3259) { return true; }
        return _ownerOf[tokenId_] != address(0x0);
    }

    // Public Write Functions 
    function approve(address to_, uint256 tokenId_) public virtual {
        address _owner = ownerOf(tokenId_);
        require(to_ != _owner, "ERC721IMigrator: approve() cannot approve owner!");
        require(msg.sender == _owner // sender is the owner of the token
            || isApprovedForAll[_owner][msg.sender], // or isApprovedForAll for the owner
            "ERC721IMigrator: approve() Caller is not owner of isApprovedForAll!");
        _approve(to_, tokenId_);
    }
    // SetApprovalForAll - the msg.sender is always the subject of approval
    function setApprovalForAll(address operator_, bool approved_) public virtual {
        _setApprovalForAll(msg.sender, operator_, approved_);
    }

    // Transfers
    function transferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId_), 
            "ERC721IMigrator: transferFrom() _isApprovedOrOwner = false!");
        _transfer(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public virtual {
        transferFrom(from_, to_, tokenId_);
        if (to_.code.length != 0) {
            (, bytes memory _returned) = to_.staticcall(abi.encodeWithSelector(0x150b7a02, msg.sender, from_, tokenId_, data_));
            bytes4 _selector = abi.decode(_returned, (bytes4));
            require(_selector == 0x150b7a02, "ERC721IMigrator: safeTransferFrom() to_ not ERC721Receivable!");
        }
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        safeTransferFrom(from_, to_, tokenId_, "");
    }

    // Native Multi-Transfers by 0xInuarashi
    function multiTransferFrom(address from_, address to_, uint256[] memory tokenIds_) public virtual {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            transferFrom(from_, to_, tokenIds_[i]);
        }
    }
    function multiSafeTransferFrom(address from_, address to_, uint256[] memory tokenIds_, bytes memory data_) public virtual {
        for (uint256 i = 0; i < tokenIds_.length; i++ ){
            safeTransferFrom(from_, to_, tokenIds_[i], data_);
        }
    }

    // OZ Standard Stuff
    function supportsInterface(bytes4 interfaceId_) public pure returns (bool) {
        return (interfaceId_ == 0x80ac58cd || interfaceId_ == 0x5b5e139f);
    }

    // High Gas Loop View Functions
    function walletOfOwner(address address_) public virtual view returns (uint256[] memory) {
        uint256 _balance = balanceOf(address_);
        uint256[] memory _tokens = new uint256[](_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply;
        for (uint256 i = 0; i < _loopThrough; i++) {
            // Add another loop through for each 0x0 until array is filled
            if (ownerOf(i) == address(0x0) && _tokens[_balance - 1] == 0) {
                _loopThrough++;
            }
            // Fill the array on each token found
            if (ownerOf(i) == address_) {
                // Record the ID in the index 
                _tokens[_index] = i;
                // Increment the index
                _index++;
            }
        }
        return _tokens;
    }

    // TokenURIs Functions Omitted //

}

interface IERC721 {
    function ownerOf(uint256 tokenId_) external view returns (address);
    function transferFrom(address from_, address to_, uint256 tokenId_) external;
}

interface iCS {
    struct Character {
        uint8  race_;
        uint8  renderType_;
        uint16 transponderId_;
        uint16 spaceCapsuleId_;
        uint8  augments_;
        uint16 basePoints_;
        uint16 totalEquipmentBonus_;
    }
    struct Stats {
        uint8 strength_; 
        uint8 agility_; 
        uint8 constitution_; 
        uint8 intelligence_; 
        uint8 spirit_; 
    }
    struct Equipment {
        uint8 weaponUpgrades_;
        uint8 chestUpgrades_;
        uint8 headUpgrades_;
        uint8 legsUpgrades_;
        uint8 vehicleUpgrades_;
        uint8 armsUpgrades_;
        uint8 artifactUpgrades_;
        uint8 ringUpgrades_;
    }

    // Create Character
    function createCharacter(uint tokenId_, Character memory Character_) external;
    // Characters
    function setName(uint256 tokenId_, string memory name_) external;
    function setRace(uint256 tokenId_, string memory race_) external;
    function setRenderType(uint256 tokenId_, uint8 renderType_) external;
    function setTransponderId(uint256 tokenId_, uint16 transponderId_) external;
    function setSpaceCapsuleId(uint256 tokenId_, uint16 spaceCapsuleId_) external;
    function setAugments(uint256 tokenId_, uint8 augments_) external;
    function setBasePoints(uint256 tokenId_, uint16 basePoints_) external;
    function setBaseEquipmentBonus(uint256 tokenId_, uint16 baseEquipmentBonus_) external;
    function setTotalEquipmentBonus(uint256 tokenId_, uint16 totalEquipmentBonus) external;
    // Stats
    function setStrength(uint256 tokenId_, uint8 strength_) external;
    function setAgility(uint256 tokenId_, uint8 agility_) external;
    function setConstitution(uint256 tokenId_, uint8 constitution_) external;
    function setIntelligence(uint256 tokenId_, uint8 intelligence_) external;
    function setSpirit(uint256 tokenId_, uint8 spirit_) external;
    // Equipment
    function setWeaponUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setChestUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setHeadUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setLegsUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setVehicleUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setArmsUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setArtifactUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    function setRingUpgrades(uint256 tokenId_, uint8 upgrade_) external;
    // Structs and Mappings
    function names(uint256 tokenId_) external view returns (string memory);
    function characters(uint256 tokenId_) external view returns (Character memory);
    function stats(uint256 tokenId_) external view returns (Stats memory);
    function equipments(uint256 tokenId_) external view returns (Equipment memory);
    function contractToRace(address contractAddress_) external view returns (uint8);
}

interface iCC {
    function queryCharacterYieldRate(uint8 augments_, uint16 basePoints_, uint16 totalEquipmentBonus_) external view returns (uint256);
    function getEquipmentBaseBonus(uint16 spaceCapsuleId_) external view returns (uint16); 
}

interface iMES {
    // View Functions
    function balanceOf(address address_) external view returns (uint256);
    function pendingRewards(address address_) external view returns (uint256); 
    // Administration
    function setYieldRate(address address_, uint256 yieldRate_) external;
    function addYieldRate(address address_, uint256 yieldRateAdd_) external;
    function subYieldRate(address address_, uint256 yieldRateSub_) external;
    // Credits System
    function deductCredits(address address_, uint256 amount_) external;
    function addCredits(address address_, uint256 amount_) external;
    // Claiming
    function updateReward(address address_) external;
    function burn(address from, uint256 amount_) external;
}

interface iMetadata {
    function renderMetadata(uint256 tokenId_) external view returns (string memory);
}

contract MTMCharacters is ERC721IMigrator {
    constructor() ERC721IMigrator("MTM Characters", "CHARACTERS") {}

    // Interfaces
    iCS public CS; iCC public CC; iMES public MES; iMetadata public Metadata;
    IERC721 public TP; IERC721 public SC;
    function setContracts(address metadata_, address cc_, address cs_, address mes_, address tp_, address sc_) external onlyOwner {
        CS = iCS(cs_); CC = iCC(cc_); MES = iMES(mes_); Metadata = iMetadata(metadata_);
        TP = IERC721(tp_); SC = IERC721(sc_);
    }

    // Mappings
    mapping(address => mapping(uint256 => bool)) public contractAddressToTokenUploaded;

    // Internal Write Functions
    function __yieldMintHook(address to_, uint256 tokenId_) internal {
        // First, we update the reward. 
        MES.updateReward(to_);

        // Then, we query the token yield rate.
        iCS.Character memory _Character = CS.characters(tokenId_);
        uint256 _tokenYieldRate = CC.queryCharacterYieldRate(_Character.augments_, _Character.basePoints_, _Character.totalEquipmentBonus_);

        // Lastly, we adjust the yield rate of the address.
        MES.addYieldRate(to_, _tokenYieldRate);
    }
    function __yieldTransferHook(address from_, address to_, uint256 tokenId_) internal {
        // First, we update the reward. 
        MES.updateReward(from_); MES.updateReward(to_);

        // Then, we query the token yield rate.
        iCS.Character memory _Character = CS.characters(tokenId_);
        uint256 _tokenYieldRate = CC.queryCharacterYieldRate(_Character.augments_, _Character.basePoints_, _Character.totalEquipmentBonus_);

        // Lastly, we adjust the yield rate of the addresses.
        MES.subYieldRate(from_, _tokenYieldRate); MES.addYieldRate(to_, _tokenYieldRate);
    }

    // Public Write Functions
    mapping(uint8 => bool) public renderTypeAllowed;
    function setRenderTypeAllowed(uint8 renderType_, bool bool_) external onlyOwner {
        renderTypeAllowed[renderType_] = bool_;
    }

    function beamCharacter(uint256 transponderId_, uint256 spaceCapsuleId_, uint8 renderType_) public {
        require(msg.sender == TP.ownerOf(transponderId_) && msg.sender == SC.ownerOf(spaceCapsuleId_), "Unowned pair!");
        require(renderTypeAllowed[renderType_], "This render type is not allowed!");

        // Burn the Transponder and Space Capsule.
        TP.transferFrom(msg.sender, address(this), transponderId_);
        SC.transferFrom(msg.sender, address(this), spaceCapsuleId_);

        uint8 _race = uint8( (uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.difficulty, transponderId_, spaceCapsuleId_))) % 10) + 1 ); // RNG (1-10) 
        uint16 _equipmentBonus = CC.getEquipmentBaseBonus((uint16(spaceCapsuleId_)));

        iCS.Character memory _Character = iCS.Character(
            _race,
            renderType_,
            uint16(transponderId_),
            uint16(spaceCapsuleId_),
            0,
            0,
            _equipmentBonus
        );

        CS.createCharacter(totalSupply, _Character);
        
        __yieldMintHook(msg.sender, totalSupply);
        _mint(msg.sender, totalSupply);
    }
    function uploadCharacter(uint256 transponderId_, uint256 spaceCapsuleId_, uint8 renderType_, address contractAddress_, uint256 uploadId_) public {
        require(msg.sender == TP.ownerOf(transponderId_) && msg.sender == SC.ownerOf(spaceCapsuleId_), "Unowned pair!");
        require(msg.sender == IERC721(contractAddress_).ownerOf(uploadId_), "You don't own this character!");
        require(!contractAddressToTokenUploaded[contractAddress_][uploadId_], "This character has already been uploaded!");
        require(renderTypeAllowed[renderType_], "This render type is not allowed!");

        // Burn the Transponder and Space Capsule. Then, set the character as uploaded.
        TP.transferFrom(msg.sender, address(this), transponderId_);
        SC.transferFrom(msg.sender, address(this), spaceCapsuleId_);
        contractAddressToTokenUploaded[contractAddress_][uploadId_] = true;

        uint8 _race = CS.contractToRace(contractAddress_);
        uint16 _equipmentBonus = CC.getEquipmentBaseBonus((uint16(spaceCapsuleId_)));
        
        iCS.Character memory _Character = iCS.Character(
            _race,
            renderType_,
            uint16(transponderId_),
            uint16(spaceCapsuleId_),
            0,
            0,
            _equipmentBonus
        );

        CS.createCharacter(totalSupply, _Character); 

        __yieldMintHook(msg.sender, totalSupply);
        _mint(msg.sender, totalSupply); 
    }

    // Public Write Multi-Functions
    function multiBeamCharacter(uint256[] memory transponderIds_, uint256[] memory spaceCapsuleIds_, uint8[] memory renderTypes_) public {
        require(transponderIds_.length == spaceCapsuleIds_.length, "Missing pairs!");
        require(transponderIds_.length == renderTypes_.length, "Missing render type!");
        for (uint256 i = 0; i < transponderIds_.length; i++) {
            beamCharacter(transponderIds_[i], spaceCapsuleIds_[i], renderTypes_[i]);
        }
    }
    function multiUploadCharacter(uint256[] memory transponderIds_, uint256[] memory spaceCapsuleIds_, uint8[] memory renderTypes_, address contractAddress_, uint256[] memory uploadIds_) public {
        require(transponderIds_.length == spaceCapsuleIds_.length, "Missing pairs!");
        require(transponderIds_.length == renderTypes_.length, "Missing render type!");
        require(transponderIds_.length == uploadIds_.length, "Upload IDs mismatched length!");
        for (uint256 i = 0; i < transponderIds_.length; i++) {
            uploadCharacter(transponderIds_[i], spaceCapsuleIds_[i], renderTypes_[i], contractAddress_, uploadIds_[i]);
        }
    }

    // Transfer Hooks
    function transferFrom(address from_, address to_, uint256 tokenId_) public override {
        __yieldTransferHook(from_, to_, tokenId_);
        ERC721IMigrator.transferFrom(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory bytes_) public override {
        __yieldTransferHook(from_, to_, tokenId_);
        ERC721IMigrator.safeTransferFrom(from_, to_, tokenId_, bytes_);
    }

    // Public View Functions
    function tokenURI(uint256 tokenId_) public view returns (string memory) {
        require(_exists(tokenId_), "Character does not exist!");
        return Metadata.renderMetadata(tokenId_);
    }
}

Read Contract

CC 0x6509e776 → address
CM 0xc16ac06f → address
CS 0x3ae23cc4 → address
MES 0xe2d97934 → address
Metadata 0xa5eb6ff2 → address
SC 0x5a138911 → address
TP 0x639807d0 → address
_balanceOf 0xcca3e832 → uint256
_balanceOfInitialized 0x4724e546 → bool
_ownerOf 0x38350541 → address
balanceOf 0x70a08231 → uint256
contractAddressToTokenUploaded 0x978fbc3c → bool
getApproved 0x081812fc → address
isApprovedForAll 0xe985e9c5 → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
ownerOf 0x6352211e → address
renderTypeAllowed 0x57b3aa76 → bool
supportsInterface 0x01ffc9a7 → bool
symbol 0x95d89b41 → string
tokenURI 0xc87b56dd → string
totalSupply 0x18160ddd → uint256
walletOfOwner 0x438b6300 → uint256[]

Write Contract 17 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address to_
uint256 tokenId_
beamCharacter 0x7cb81fe5
uint256 transponderId_
uint256 spaceCapsuleId_
uint8 renderType_
initialize 0x7ca510a4
uint256[] tokenIds_
address[] owners_
multiBeamCharacter 0x3b500607
uint256[] transponderIds_
uint256[] spaceCapsuleIds_
uint8[] renderTypes_
multiSafeTransferFrom 0x3a3473b6
address from_
address to_
uint256[] tokenIds_
bytes data_
multiTransferFrom 0xf487c602
address from_
address to_
uint256[] tokenIds_
multiUploadCharacter 0x75114979
uint256[] transponderIds_
uint256[] spaceCapsuleIds_
uint8[] renderTypes_
address contractAddress_
uint256[] uploadIds_
safeTransferFrom 0x42842e0e
address from_
address to_
uint256 tokenId_
safeTransferFrom 0xb88d4fde
address from_
address to_
uint256 tokenId_
bytes bytes_
setApprovalForAll 0xa22cb465
address operator_
bool approved_
setCM 0x4be99cd6
address address_
setContracts 0x2463a55a
address metadata_
address cc_
address cs_
address mes_
address tp_
address sc_
setRenderTypeAllowed 0xb4f035a4
uint8 renderType_
bool bool_
setTotalSupply 0xf7ea7a3d
uint256 totalSupply_
transferFrom 0x23b872dd
address from_
address to_
uint256 tokenId_
transferOwnership 0xf2fde38b
address newOwner_
uploadCharacter 0xb979b1a3
uint256 transponderId_
uint256 spaceCapsuleId_
uint8 renderType_
address contractAddress_
uint256 uploadId_

Recent Transactions

No transactions found for this address