Source Code
Latest 25 from a total of 127 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Catch Monster | 7102291 | 2597 days ago | IN | 0 ETH | 0.00148187 | ||||
| Catch Monster | 7102178 | 2597 days ago | IN | 0 ETH | 0.0026044 | ||||
| Catch Monster | 7052713 | 2606 days ago | IN | 0 ETH | 0.00309357 | ||||
| Catch Monster | 7052684 | 2606 days ago | IN | 0 ETH | 0.000619 | ||||
| Catch Monster | 7011816 | 2613 days ago | IN | 0 ETH | 0.01498768 | ||||
| Catch Monster | 6817303 | 2646 days ago | IN | 0 ETH | 0.01576038 | ||||
| Catch Monster | 6768735 | 2654 days ago | IN | 0 ETH | 0.00252727 | ||||
| Catch Monster | 6768716 | 2654 days ago | IN | 0 ETH | 0.00250603 | ||||
| Catch Monster | 6575015 | 2686 days ago | IN | 0 ETH | 0.0099908 | ||||
| Catch Monster | 6555416 | 2689 days ago | IN | 0 ETH | 0.00289914 | ||||
| Catch Monster | 6478663 | 2702 days ago | IN | 0 ETH | 0.00706081 | ||||
| Catch Monster | 6465602 | 2704 days ago | IN | 0 ETH | 0.00291501 | ||||
| Catch Monster | 6465014 | 2704 days ago | IN | 0 ETH | 0.0024427 | ||||
| Catch Monster | 6463237 | 2704 days ago | IN | 0 ETH | 0.00801285 | ||||
| Catch Monster | 6463174 | 2704 days ago | IN | 0 ETH | 0.01138776 | ||||
| Catch Monster | 6463118 | 2704 days ago | IN | 0 ETH | 0.01450026 | ||||
| Catch Monster | 6463107 | 2704 days ago | IN | 0 ETH | 0.01418528 | ||||
| Catch Monster | 6456964 | 2705 days ago | IN | 0 ETH | 0.01847582 | ||||
| Catch Monster | 6456963 | 2705 days ago | IN | 0 ETH | 0.00289539 | ||||
| Catch Monster | 6456895 | 2705 days ago | IN | 0 ETH | 0.01883222 | ||||
| Catch Monster | 6456868 | 2705 days ago | IN | 0 ETH | 0.01843402 | ||||
| Catch Monster | 6456858 | 2705 days ago | IN | 0 ETH | 0.01840967 | ||||
| Catch Monster | 6456851 | 2705 days ago | IN | 0 ETH | 0.00334005 | ||||
| Catch Monster | 6456851 | 2705 days ago | IN | 0 ETH | 0.01839215 | ||||
| Catch Monster | 6456840 | 2705 days ago | IN | 0 ETH | 0.02024003 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 7102291 | 2597 days ago | 0.03174 ETH | ||||
| - | 7102178 | 2597 days ago | 0.03174 ETH | ||||
| - | 7052713 | 2606 days ago | 0.03345 ETH | ||||
| - | 7052684 | 2606 days ago | 0.03345 ETH | ||||
| - | 7011816 | 2613 days ago | 0.03144 ETH | ||||
| - | 7011816 | 2613 days ago | 0.03144 ETH | ||||
| Transfer | 6575015 | 2686 days ago | 0.0312 ETH | ||||
| Transfer | 6575015 | 2686 days ago | 0.0312 ETH | ||||
| Transfer | 6555416 | 2689 days ago | 0.03144 ETH | ||||
| Transfer | 6555416 | 2689 days ago | 0.03144 ETH | ||||
| Transfer | 6478663 | 2702 days ago | 0.03111 ETH | ||||
| Transfer | 6478663 | 2702 days ago | 0.03111 ETH | ||||
| Transfer | 6465602 | 2704 days ago | 0.3369 ETH | ||||
| Transfer | 6465602 | 2704 days ago | 0.3369 ETH | ||||
| Transfer | 6465014 | 2704 days ago | 0.3363 ETH | ||||
| Transfer | 6465014 | 2704 days ago | 0.3363 ETH | ||||
| Transfer | 6463237 | 2704 days ago | 0.03237 ETH | ||||
| Transfer | 6463237 | 2704 days ago | 0.03237 ETH | ||||
| Transfer | 6463174 | 2704 days ago | 0.336 ETH | ||||
| Transfer | 6463174 | 2704 days ago | 0.336 ETH | ||||
| Transfer | 6463118 | 2704 days ago | 0.3357 ETH | ||||
| Transfer | 6463118 | 2704 days ago | 0.3357 ETH | ||||
| Transfer | 6463107 | 2704 days ago | 0.3354 ETH | ||||
| Transfer | 6463107 | 2704 days ago | 0.3354 ETH | ||||
| Transfer | 6456964 | 2705 days ago | 0.3324 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
WrapEtheremon
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-09-16
*/
pragma solidity ^0.4.24;
contract BasicAccessControl {
address public owner;
// address[] public moderators;
uint16 public totalModerators = 0;
mapping (address => bool) public moderators;
bool public isMaintaining = false;
constructor() public {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
modifier onlyModerators() {
require(msg.sender == owner || moderators[msg.sender] == true);
_;
}
modifier isActive {
require(!isMaintaining);
_;
}
function ChangeOwner(address _newOwner) public onlyOwner {
if (_newOwner != address(0)) {
owner = _newOwner;
}
}
function AddModerator(address _newModerator) public onlyOwner {
if (moderators[_newModerator] == false) {
moderators[_newModerator] = true;
totalModerators += 1;
}
}
function RemoveModerator(address _oldModerator) public onlyOwner {
if (moderators[_oldModerator] == true) {
moderators[_oldModerator] = false;
totalModerators -= 1;
}
}
function UpdateMaintaining(bool _isMaintaining) public onlyOwner {
isMaintaining = _isMaintaining;
}
}
interface ERC20 {
function totalSupply() public view returns (uint supply);
function balanceOf(address _owner) public view returns (uint balance);
function transfer(address _to, uint _value) public returns (bool success);
function transferFrom(address _from, address _to, uint _value) public returns (bool success);
function approve(address _spender, uint _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint remaining);
function decimals() public view returns(uint digits);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
contract EtheremonDataBase {
uint64 public totalMonster;
uint32 public totalClass;
// write
function addElementToArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint8 _value) external returns(uint);
function addMonsterObj(uint32 _classId, address _trainer, string _name) external returns(uint64);
function removeMonsterIdMapping(address _trainer, uint64 _monsterId) external;
// read
function getElementInArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index) external constant returns(uint8);
function getMonsterClass(uint32 _classId) external constant returns(uint32 classId, uint256 price, uint256 returnPrice, uint32 total, bool catchable);
function getMonsterObj(uint64 _objId) external constant returns(uint64 objId, uint32 classId, address trainer, uint32 exp, uint32 createIndex, uint32 lastClaimIndex, uint createTime);
}
contract EtheremonEnum {
enum ResultCode {
SUCCESS,
ERROR_CLASS_NOT_FOUND,
ERROR_LOW_BALANCE,
ERROR_SEND_FAIL,
ERROR_NOT_TRAINER,
ERROR_NOT_ENOUGH_MONEY,
ERROR_INVALID_AMOUNT
}
enum ArrayType {
CLASS_TYPE,
STAT_STEP,
STAT_START,
STAT_BASE,
OBJ_SKILL
}
enum PropertyType {
ANCESTOR,
XFACTOR
}
}
interface EtheremonMonsterNFTInterface {
function triggerTransferEvent(address _from, address _to, uint _tokenId) external;
function getMonsterCP(uint64 _monsterId) constant external returns(uint cp);
}
contract EtheremonWorldNFT is BasicAccessControl {
uint8 constant public STAT_COUNT = 6;
uint8 constant public STAT_MAX = 32;
struct MonsterClassAcc {
uint32 classId;
uint256 price;
uint256 returnPrice;
uint32 total;
bool catchable;
}
struct MonsterObjAcc {
uint64 monsterId;
uint32 classId;
address trainer;
string name;
uint32 exp;
uint32 createIndex;
uint32 lastClaimIndex;
uint createTime;
}
address public dataContract;
address public monsterNFT;
mapping(uint32 => bool) public classWhitelist;
mapping(address => bool) public addressWhitelist;
uint public gapFactor = 5;
uint public priceIncreasingRatio = 1000;
function setContract(address _dataContract, address _monsterNFT) external onlyModerators {
dataContract = _dataContract;
monsterNFT = _monsterNFT;
}
function setConfig(uint _gapFactor, uint _priceIncreasingRatio) external onlyModerators {
gapFactor = _gapFactor;
priceIncreasingRatio = _priceIncreasingRatio;
}
function setClassWhitelist(uint32 _classId, bool _status) external onlyModerators {
classWhitelist[_classId] = _status;
}
function setAddressWhitelist(address _smartcontract, bool _status) external onlyModerators {
addressWhitelist[_smartcontract] = _status;
}
function mintMonster(uint32 _classId, address _trainer, string _name) external onlyModerators returns(uint) {
EtheremonDataBase data = EtheremonDataBase(dataContract);
// add monster
uint64 objId = data.addMonsterObj(_classId, _trainer, _name);
uint8 value;
uint seed = getRandom(_trainer, block.number-1, objId);
// generate base stat for the previous one
for (uint i=0; i < STAT_COUNT; i += 1) {
seed /= 100;
value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
}
EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), _trainer, objId);
return objId;
}
function burnMonster(uint64 _tokenId) external onlyModerators {
// need to check condition before calling this function
EtheremonDataBase data = EtheremonDataBase(dataContract);
MonsterObjAcc memory obj;
(obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_tokenId);
require(obj.trainer != address(0));
data.removeMonsterIdMapping(obj.trainer, _tokenId);
EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(obj.trainer, address(0), _tokenId);
}
function catchMonsterNFT(uint32 _classId, string _name) external isActive payable {
EtheremonDataBase data = EtheremonDataBase(dataContract);
MonsterClassAcc memory class;
(class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
if (class.classId == 0 || class.catchable == false) {
revert();
}
uint price = class.price;
if (class.total > 0)
price += class.price*(class.total-1)/priceIncreasingRatio;
if (msg.value < price) {
revert();
}
// add new monster
uint64 objId = data.addMonsterObj(_classId, msg.sender, _name);
uint8 value;
uint seed = getRandom(msg.sender, block.number-1, objId);
// generate base stat for the previous one
for (uint i=0; i < STAT_COUNT; i += 1) {
seed /= 100;
value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
}
EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), msg.sender, objId);
// refund extra
if (msg.value > price) {
msg.sender.transfer((msg.value - price));
}
}
// for whitelist contracts, no refund extra
function catchMonster(address _player, uint32 _classId, string _name) external isActive payable returns(uint tokenId) {
if (addressWhitelist[msg.sender] == false) {
revert();
}
EtheremonDataBase data = EtheremonDataBase(dataContract);
MonsterClassAcc memory class;
(class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
if (class.classId == 0) {
revert();
}
if (class.catchable == false && classWhitelist[_classId] == false) {
revert();
}
uint price = class.price;
if (class.total > gapFactor) {
price += class.price*(class.total - gapFactor)/priceIncreasingRatio;
}
if (msg.value < price) {
revert();
}
// add new monster
uint64 objId = data.addMonsterObj(_classId, _player, _name);
uint8 value;
uint seed = getRandom(_player, block.number-1, objId);
// generate base stat for the previous one
for (uint i=0; i < STAT_COUNT; i += 1) {
seed /= 100;
value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
}
EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), _player, objId);
return objId;
}
function getMonsterClassBasic(uint32 _classId) external constant returns(uint256, uint256, uint256, bool) {
EtheremonDataBase data = EtheremonDataBase(dataContract);
MonsterClassAcc memory class;
(class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
return (class.price, class.returnPrice, class.total, class.catchable);
}
function getPrice(uint32 _classId) external constant returns(bool catchable, uint price) {
EtheremonDataBase data = EtheremonDataBase(dataContract);
MonsterClassAcc memory class;
(class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
price = class.price;
if (class.total > 0)
price += class.price*(class.total-1)/priceIncreasingRatio;
if (class.catchable == false) {
return (classWhitelist[_classId], price);
} else {
return (true, price);
}
}
// public api
function getRandom(address _player, uint _block, uint _count) public view returns(uint) {
return uint(keccak256(abi.encodePacked(blockhash(_block), _player, _count)));
}
function withdrawEther(address _sendTo, uint _amount) public onlyOwner {
if (_amount > address(this).balance) {
revert();
}
_sendTo.transfer(_amount);
}
}
interface KyberNetworkProxyInterface {
function maxGasPrice() public view returns(uint);
function getUserCapInWei(address user) public view returns(uint);
function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint);
function enabled() public view returns(bool);
function info(bytes32 id) public view returns(uint);
function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) public view
returns (uint expectedRate, uint slippageRate);
function tradeWithHint(ERC20 src, uint srcAmount, ERC20 dest, address destAddress, uint maxDestAmount,
uint minConversionRate, address walletId, bytes hint) public payable returns(uint);
}
contract Utils {
ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
uint constant internal PRECISION = (10**18);
uint constant internal MAX_QTY = (10**28); // 10B tokens
uint constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH
uint constant internal MAX_DECIMALS = 18;
uint constant internal ETH_DECIMALS = 18;
mapping(address=>uint) internal decimals;
function setDecimals(ERC20 token) internal {
if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
else decimals[token] = token.decimals();
}
function getDecimals(ERC20 token) internal view returns(uint) {
if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
uint tokenDecimals = decimals[token];
// technically, there might be token with decimals 0
// moreover, very possible that old tokens have decimals 0
// these tokens will just have higher gas fees.
if(tokenDecimals == 0) return token.decimals();
return tokenDecimals;
}
function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(srcQty <= MAX_QTY);
require(rate <= MAX_RATE);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
}
}
function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(dstQty <= MAX_QTY);
require(rate <= MAX_RATE);
//source quantity is rounded up. to avoid dest quantity being too low.
uint numerator;
uint denominator;
if (srcDecimals >= dstDecimals) {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
denominator = rate;
} else {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty);
denominator = (rate * (10**(dstDecimals - srcDecimals)));
}
return (numerator + denominator - 1) / denominator; //avoid rounding down errors
}
}
contract Utils2 is Utils {
/// @dev get the balance of a user.
/// @param token The token type
/// @return The balance
function getBalance(ERC20 token, address user) public view returns(uint) {
if (token == ETH_TOKEN_ADDRESS)
return user.balance;
else
return token.balanceOf(user);
}
function getDecimalsSafe(ERC20 token) internal returns(uint) {
if (decimals[token] == 0) {
setDecimals(token);
}
return decimals[token];
}
function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) {
return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
}
function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) {
return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
}
function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
internal pure returns(uint)
{
require(srcAmount <= MAX_QTY);
require(destAmount <= MAX_QTY);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
}
}
}
interface WrapEtheremonInterface {
/// @notice Can only be called by operators
/// @dev Sets the KyberNetwork address
/// @param _KyberNetwork KyberNetwork contract address
function setKyberNetwork(address _KyberNetwork) public;
/// @dev Get the ETH price of the Etheremon monster and if it is catchable
/// @param _etheremon EtheremonWorldNFT address
/// @param _classId Class ID of monster
/// @param _payPrice Price of monster passed from Etheremon server
/// @return catchable, monsterInETH
function getMonsterPriceInETH(
EtheremonWorldNFT _etheremon,
uint32 _classId,
uint _payPrice
)
public
view
returns (
bool catchable,
uint monsterInETH
);
/// @dev Get the rates of the Etheremon monster
/// @param _kyberProxy KyberNetworkProxyInterface address
/// @param token ERC20 token address
/// @param monsterInETH Price of the monster in ETH
/// @return expectedRate, slippageRate
function getMonsterRates(
KyberNetworkProxyInterface _kyberProxy,
ERC20 token,
uint monsterInETH
)
public
view
returns (
uint expectedRate,
uint slippageRate
);
/// @dev Get the token price and rates of the Etheremon monster
/// @param token ERC20 token address
/// @param expectedRate Expected rate of ETH to token
/// @param monsterInETH Price of the monster in ETH
/// @return monsterInTokens
function getMonsterPriceInTokens(
ERC20 token,
uint expectedRate,
uint monsterInETH
)
public
view
returns (uint monsterInTokens);
/// @dev Acquires the monster from Etheremon using tokens
/// @param _kyberProxy KyberNetworkProxyInterface address
/// @param _etheremon EtheremonWorldNFT address
/// @param _classId Class ID of monster
/// @param _name Name of the monster
/// @param token ERC20 token address
/// @param tokenQty Amount of tokens to be transferred by user
/// @param maxDestQty Actual amount of ETH needed to purchase the monster
/// @param minRate The minimum rate or slippage rate.
/// @param walletId Wallet ID where Kyber referral fees will be sent to
/// @return monsterId
function catchMonster(
KyberNetworkProxyInterface _kyberProxy,
EtheremonWorldNFT _etheremon,
uint32 _classId,
string _name,
ERC20 token,
uint tokenQty,
uint maxDestQty,
uint minRate,
address walletId
)
public
returns (uint monsterId);
}
contract WrapEtheremonPermissions {
event TransferAdmin(address newAdmin);
event OperatorAdded(address newOperator, bool isAdd);
address public admin;
address[] public operatorsGroup;
mapping(address=>bool) internal operators;
uint constant internal MAX_GROUP_SIZE = 50;
constructor () public {
admin = msg.sender;
}
modifier onlyAdmin() {
require(msg.sender == admin);
_;
}
modifier onlyOperator() {
require(operators[msg.sender]);
_;
}
function transferAdmin(address newAdmin) public onlyAdmin {
require(newAdmin != address(0));
emit TransferAdmin(newAdmin);
admin = newAdmin;
}
function addOperator(address newOperator) public onlyAdmin {
require(!operators[newOperator]);
require(operatorsGroup.length < MAX_GROUP_SIZE);
emit OperatorAdded(newOperator, true);
operators[newOperator] = true;
operatorsGroup.push(newOperator);
}
function removeOperator (address operator) public onlyAdmin {
require(operators[operator]);
operators[operator] = false;
for (uint i = 0; i < operatorsGroup.length; ++i) {
if (operatorsGroup[i] == operator) {
operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
operatorsGroup.length -= 1;
emit OperatorAdded(operator, false);
break;
}
}
}
}
contract WrapEtheremon is WrapEtheremonInterface, WrapEtheremonPermissions, Utils2 {
event SwapTokenChange(uint startTokenBalance, uint change);
event CaughtWithToken(address indexed sender, uint monsterId, ERC20 token, uint amount);
event ETHReceived(address indexed sender, uint amount);
address public KyberNetwork;
ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
/// @dev Contract contstructor
/// @param _KyberNetwork KyberNetwork main contract address
constructor (address _KyberNetwork) public {
KyberNetwork = _KyberNetwork;
}
/// @dev Return the ETH to user that was taken back by the network
function() public payable {
// Only receive ETH from KyberNetwork main contract
require(msg.sender == KyberNetwork);
emit ETHReceived(msg.sender, msg.value);
}
/// @notice Can only be called by operators
/// @dev Sets the KyberNetwork address
/// @param _KyberNetwork KyberNetwork contract address
function setKyberNetwork(address _KyberNetwork) public onlyOperator {
KyberNetwork = _KyberNetwork;
}
/// @dev Get the ETH price of the Etheremon monster and if it is catchable
/// @param _etheremon EtheremonWorldNFT address
/// @param _classId Class ID of monster
/// @param _payPrice Price of monster passed from Etheremon server
/// @return catchable, monsterInETH
function getMonsterPriceInETH(
EtheremonWorldNFT _etheremon,
uint32 _classId,
uint _payPrice
)
public
view
returns (
bool catchable,
uint monsterInETH
)
{
// Get monster details from Etheremon contract
(catchable, monsterInETH) = _etheremon.getPrice(_classId);
// Get the highest price from contract pricing or offchain pricing
monsterInETH = max(monsterInETH, _payPrice);
return (catchable, monsterInETH);
}
/// @dev Get the rates of the Etheremon monster
/// @param _kyberProxy KyberNetworkProxyInterface address
/// @param token ERC20 token address
/// @param monsterInETH Price of the monster in ETH
/// @return expectedRate, slippageRate
function getMonsterRates(
KyberNetworkProxyInterface _kyberProxy,
ERC20 token,
uint monsterInETH
)
public
view
returns (
uint expectedRate,
uint slippageRate
)
{
// Get the expected and slippage rates of the token to ETH
(expectedRate, slippageRate) = _kyberProxy.getExpectedRate(token, ETH_TOKEN_ADDRESS, monsterInETH);
return (expectedRate, slippageRate);
}
/// @dev Get the token price and rates of the Etheremon monster
/// @param token ERC20 token address
/// @param expectedRate Expected rate of ETH to token
/// @param monsterInETH Price of the monster in ETH
/// @return monsterInTokens
function getMonsterPriceInTokens(
ERC20 token,
uint expectedRate,
uint monsterInETH
)
public
view
returns (uint monsterInTokens)
{
// If expectedRate is 0, return 0 for monster price in tokens
if (expectedRate == 0) {
return 0;
}
// Calculate monster price in tokens
monsterInTokens = calcSrcAmount(ETH_TOKEN_ADDRESS, token, monsterInETH, expectedRate);
return monsterInTokens;
}
/// @dev Acquires the monster from Etheremon using tokens
/// @param _kyberProxy KyberNetworkProxyInterface address
/// @param _etheremon EtheremonWorldNFT address
/// @param _classId Class ID of monster
/// @param _name Name of the monster
/// @param token ERC20 token address
/// @param tokenQty Amount of tokens to be transferred by user
/// @param maxDestQty Actual amount of ETH needed to purchase the monster
/// @param minRate The minimum rate or slippage rate.
/// @param walletId Wallet ID where Kyber referral fees will be sent to
/// @return monsterId
function catchMonster(
KyberNetworkProxyInterface _kyberProxy,
EtheremonWorldNFT _etheremon,
uint32 _classId,
string _name,
ERC20 token,
uint tokenQty,
uint maxDestQty,
uint minRate,
address walletId
)
public
returns (uint monsterId)
{
// Check that the player has transferred the token to this contract
require(token.transferFrom(msg.sender, this, tokenQty));
// Get the starting token balance of the player's wallet
uint startTokenBalance = token.balanceOf(this);
// Mitigate ERC20 Approve front-running attack, by initially setting
// allowance to 0
require(token.approve(_kyberProxy, 0));
// Verify that the token balance has not decreased from front-running
require(token.balanceOf(this) == startTokenBalance);
// Once verified, set the token allowance to tokenQty
require(token.approve(_kyberProxy, tokenQty));
// Swap player's token to ETH to send to Etheremon payments contract
uint userETH = _kyberProxy.tradeWithHint(
token,
tokenQty,
ETH_TOKEN_ADDRESS,
address(this),
maxDestQty,
minRate,
walletId,
""
);
// Acquire the monster and send to player
monsterId = _etheremon.catchMonster.value(userETH)(msg.sender, _classId, _name);
// Log event that monster was caught using tokens
emit CaughtWithToken(msg.sender, monsterId, token, tokenQty);
// Return change to player if any
calcPlayerChange(token, startTokenBalance);
return monsterId;
}
/// @dev Calculates token change and returns to player
/// @param token ERC20 token address
/// @param startTokenBalance Starting token balance of the player's wallet
function calcPlayerChange(ERC20 token, uint startTokenBalance) private {
// Calculate change of player
uint change = token.balanceOf(this);
// Send back change if change is > 0
if (change > 0) {
// Log the exchange event
emit SwapTokenChange(startTokenBalance, change);
// Transfer change back to player
token.transfer(msg.sender, change);
}
}
/// @dev Gets the max between two uint params
/// @param a Param A
/// @param b Param B
/// @return result
function max(uint a, uint b) private pure returns (uint result) {
return a > b ? a : b;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"_kyberProxy","type":"address"},{"name":"token","type":"address"},{"name":"monsterInETH","type":"uint256"}],"name":"getMonsterRates","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_KyberNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"expectedRate","type":"uint256"},{"name":"monsterInETH","type":"uint256"}],"name":"getMonsterPriceInTokens","outputs":[{"name":"monsterInTokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_etheremon","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_payPrice","type":"uint256"}],"name":"getMonsterPriceInETH","outputs":[{"name":"catchable","type":"bool"},{"name":"monsterInETH","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KyberNetwork","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_kyberProxy","type":"address"},{"name":"_etheremon","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_name","type":"string"},{"name":"token","type":"address"},{"name":"tokenQty","type":"uint256"},{"name":"maxDestQty","type":"uint256"},{"name":"minRate","type":"uint256"},{"name":"walletId","type":"address"}],"name":"catchMonster","outputs":[{"name":"monsterId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"operatorsGroup","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_KyberNetwork","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"startTokenBalance","type":"uint256"},{"indexed":false,"name":"change","type":"uint256"}],"name":"SwapTokenChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"monsterId","type":"uint256"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CaughtWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"}],"name":"TransferAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]Contract Creation Code
608060405234801561001057600080fd5b506040516020806112c1833981016040525160008054600160a060020a0319908116331790915560048054600160a060020a03909316929091169190911790556112628061005f6000396000f3006080604052600436106100a05763ffffffff60e060020a6000350416634c9c786c81146100ef57806354a325a61461013257806366e18bc21461015557806375829def1461018e57806376a4b76a146101af5780639870d7fe146101f75780639c7399ea14610218578063ac8a584a14610249578063b05d6e801461026a578063d4fac45d14610303578063f851a4401461032a578063fc5bf0f21461033f575b600454600160a060020a031633146100b757600080fd5b60408051348152905133917fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a919081900360200190a2005b3480156100fb57600080fd5b50610119600160a060020a0360043581169060243516604435610357565b6040805192835260208301919091528051918290030190f35b34801561013e57600080fd5b50610153600160a060020a036004351661041b565b005b34801561016157600080fd5b5061017c600160a060020a0360043516602435604435610468565b60408051918252519081900360200190f35b34801561019a57600080fd5b50610153600160a060020a03600435166104a3565b3480156101bb57600080fd5b506101dc600160a060020a036004351663ffffffff6024351660443561053a565b60408051921515835260208301919091528051918290030190f35b34801561020357600080fd5b50610153600160a060020a03600435166105dd565b34801561022457600080fd5b5061022d6106dd565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b50610153600160a060020a03600435166106ec565b34801561027657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261017c94600160a060020a038135811695602480359092169563ffffffff604435169536956084940191819084018382808284375094975050600160a060020a038535811696506020860135956040810135955060608101359450608001351691506108629050565b34801561030f57600080fd5b5061017c600160a060020a0360043581169060243516610dd6565b34801561033657600080fd5b5061022d610e9e565b34801561034b57600080fd5b5061022d600435610ead565b604080517f809a9e55000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602483015260448201849052825160009384939288169263809a9e55926064808301939282900301818787803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050506040513d604081101561040657600080fd5b50805160209091015190969095509350505050565b3360009081526002602052604090205460ff16151561043957600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008215156104795750600061049c565b61049973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858486610ed5565b90505b9392505050565b600054600160a060020a031633146104ba57600080fd5b600160a060020a03811615156104cf57600080fd5b60408051600160a060020a038316815290517fda7b0a7bc965abdec8a1a995575a891838264c2968e14bd456c5391827b7aa309181900360200190a16000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008084600160a060020a031663da26663a856040518263ffffffff1660e060020a028152600401808263ffffffff1663ffffffff1681526020019150506040805180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d60408110156105bb57600080fd5b50805160209091015190925090506105d38184610efc565b9050935093915050565b600054600160a060020a031633146105f457600080fd5b600160a060020a03811660009081526002602052604090205460ff161561061a57600080fd5b60015460321161062957600080fd5b60408051600160a060020a03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1600160a060020a03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b600454600160a060020a031681565b60008054600160a060020a0316331461070457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561072b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b60015481101561085e5781600160a060020a031660018281548110151561077057fe5b600091825260209091200154600160a060020a031614156108565760018054600019810190811061079d57fe5b60009182526020909120015460018054600160a060020a0390921691839081106107c357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560018054600019019061080c90826111f6565b5060408051600160a060020a03841681526000602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a161085e565b60010161074d565b5050565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052905160009182918291600160a060020a038a16916323b872dd9160648082019260209290919082900301818787803b1580156108d757600080fd5b505af11580156108eb573d6000803e3d6000fd5b505050506040513d602081101561090157600080fd5b5051151561090e57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038a16916370a082319160248083019260209291908290030181600087803b15801561096f57600080fd5b505af1158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260006024830181905292519395508b169263095ea7b392604480840193602093929083900390910190829087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b50511515610a4357600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506040513d6020811015610ad157600080fd5b505114610add57600080fd5b87600160a060020a031663095ea7b38d896040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506040513d6020811015610b6a57600080fd5b50511515610b7757600080fd5b604080517f29589f61000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a905273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60448301523060648301526084820189905260a4820188905286811660c483015261010060e4830152600061010483018190529251908f16926329589f619261014480820193602093909283900390910190829087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b810190808051906020019092919050505090508a600160a060020a031663c0845e8a82338d8d6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf6578181015183820152602001610cde565b50505050905090810190601f168015610d235780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b50505050506040513d6020811015610d6e57600080fd5b505160408051828152600160a060020a038b1660208201528082018a9052905191945033917f292c998861a6c93f87fd689ba3b6efaf15ed97454f96924beba6835d3cb22e239181900360600190a2610dc78883610f12565b50509998505050505050505050565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e0e5750600160a060020a03811631610e98565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b505050506040513d6020811015610e9357600080fd5b505190505b92915050565b600054600160a060020a031681565b6001805482908110610ebb57fe5b600091825260209091200154600160a060020a0316905081565b6000610ef383610ee487611082565b610eed87611082565b8561114f565b95945050505050565b6000818311610f0b578161049c565b5090919050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038516916370a082319160248082019260209290919082900301818787803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50519050600081111561107d57604080518381526020810183905281517f728dff6f9ccda5c4b34aef50e8476d414ed0873362ca60c9bd2e85b7d7140e26929181900390910190a1604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561105057600080fd5b505af1158015611064573d6000803e3d6000fd5b505050506040513d602081101561107a57600080fd5b50505b505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110b35760129150611149565b50600160a060020a0382166000908152600360205260409020548015156111455782600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050506040513d602081101561113c57600080fd5b50519150611149565b8091505b50919050565b600080806b204fce5e3e2502611000000087111561116c57600080fd5b69d3c21bcecceda100000084111561118357600080fd5b8486106111b4576012858703111561119a57600080fd5b5050828403600a0a8502670de0b6b3a764000002826111da565b601286860311156111c457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b806001828401038115156111ea57fe5b04979650505050505050565b81548183558181111561107d5760008381526020902061107d91810190830161123391905b8082111561122f576000815560010161121b565b5090565b905600a165627a7a72305820a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb00029
Deployed Bytecode
0x6080604052600436106100a05763ffffffff60e060020a6000350416634c9c786c81146100ef57806354a325a61461013257806366e18bc21461015557806375829def1461018e57806376a4b76a146101af5780639870d7fe146101f75780639c7399ea14610218578063ac8a584a14610249578063b05d6e801461026a578063d4fac45d14610303578063f851a4401461032a578063fc5bf0f21461033f575b600454600160a060020a031633146100b757600080fd5b60408051348152905133917fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a919081900360200190a2005b3480156100fb57600080fd5b50610119600160a060020a0360043581169060243516604435610357565b6040805192835260208301919091528051918290030190f35b34801561013e57600080fd5b50610153600160a060020a036004351661041b565b005b34801561016157600080fd5b5061017c600160a060020a0360043516602435604435610468565b60408051918252519081900360200190f35b34801561019a57600080fd5b50610153600160a060020a03600435166104a3565b3480156101bb57600080fd5b506101dc600160a060020a036004351663ffffffff6024351660443561053a565b60408051921515835260208301919091528051918290030190f35b34801561020357600080fd5b50610153600160a060020a03600435166105dd565b34801561022457600080fd5b5061022d6106dd565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b50610153600160a060020a03600435166106ec565b34801561027657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261017c94600160a060020a038135811695602480359092169563ffffffff604435169536956084940191819084018382808284375094975050600160a060020a038535811696506020860135956040810135955060608101359450608001351691506108629050565b34801561030f57600080fd5b5061017c600160a060020a0360043581169060243516610dd6565b34801561033657600080fd5b5061022d610e9e565b34801561034b57600080fd5b5061022d600435610ead565b604080517f809a9e55000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602483015260448201849052825160009384939288169263809a9e55926064808301939282900301818787803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050506040513d604081101561040657600080fd5b50805160209091015190969095509350505050565b3360009081526002602052604090205460ff16151561043957600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008215156104795750600061049c565b61049973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858486610ed5565b90505b9392505050565b600054600160a060020a031633146104ba57600080fd5b600160a060020a03811615156104cf57600080fd5b60408051600160a060020a038316815290517fda7b0a7bc965abdec8a1a995575a891838264c2968e14bd456c5391827b7aa309181900360200190a16000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008084600160a060020a031663da26663a856040518263ffffffff1660e060020a028152600401808263ffffffff1663ffffffff1681526020019150506040805180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d60408110156105bb57600080fd5b50805160209091015190925090506105d38184610efc565b9050935093915050565b600054600160a060020a031633146105f457600080fd5b600160a060020a03811660009081526002602052604090205460ff161561061a57600080fd5b60015460321161062957600080fd5b60408051600160a060020a03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1600160a060020a03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b600454600160a060020a031681565b60008054600160a060020a0316331461070457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561072b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b60015481101561085e5781600160a060020a031660018281548110151561077057fe5b600091825260209091200154600160a060020a031614156108565760018054600019810190811061079d57fe5b60009182526020909120015460018054600160a060020a0390921691839081106107c357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560018054600019019061080c90826111f6565b5060408051600160a060020a03841681526000602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a161085e565b60010161074d565b5050565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052905160009182918291600160a060020a038a16916323b872dd9160648082019260209290919082900301818787803b1580156108d757600080fd5b505af11580156108eb573d6000803e3d6000fd5b505050506040513d602081101561090157600080fd5b5051151561090e57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038a16916370a082319160248083019260209291908290030181600087803b15801561096f57600080fd5b505af1158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260006024830181905292519395508b169263095ea7b392604480840193602093929083900390910190829087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b50511515610a4357600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506040513d6020811015610ad157600080fd5b505114610add57600080fd5b87600160a060020a031663095ea7b38d896040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506040513d6020811015610b6a57600080fd5b50511515610b7757600080fd5b604080517f29589f61000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a905273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60448301523060648301526084820189905260a4820188905286811660c483015261010060e4830152600061010483018190529251908f16926329589f619261014480820193602093909283900390910190829087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b810190808051906020019092919050505090508a600160a060020a031663c0845e8a82338d8d6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf6578181015183820152602001610cde565b50505050905090810190601f168015610d235780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b50505050506040513d6020811015610d6e57600080fd5b505160408051828152600160a060020a038b1660208201528082018a9052905191945033917f292c998861a6c93f87fd689ba3b6efaf15ed97454f96924beba6835d3cb22e239181900360600190a2610dc78883610f12565b50509998505050505050505050565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e0e5750600160a060020a03811631610e98565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b505050506040513d6020811015610e9357600080fd5b505190505b92915050565b600054600160a060020a031681565b6001805482908110610ebb57fe5b600091825260209091200154600160a060020a0316905081565b6000610ef383610ee487611082565b610eed87611082565b8561114f565b95945050505050565b6000818311610f0b578161049c565b5090919050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038516916370a082319160248082019260209290919082900301818787803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50519050600081111561107d57604080518381526020810183905281517f728dff6f9ccda5c4b34aef50e8476d414ed0873362ca60c9bd2e85b7d7140e26929181900390910190a1604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561105057600080fd5b505af1158015611064573d6000803e3d6000fd5b505050506040513d602081101561107a57600080fd5b50505b505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110b35760129150611149565b50600160a060020a0382166000908152600360205260409020548015156111455782600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050506040513d602081101561113c57600080fd5b50519150611149565b8091505b50919050565b600080806b204fce5e3e2502611000000087111561116c57600080fd5b69d3c21bcecceda100000084111561118357600080fd5b8486106111b4576012858703111561119a57600080fd5b5050828403600a0a8502670de0b6b3a764000002826111da565b601286860311156111c457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b806001828401038115156111ea57fe5b04979650505050505050565b81548183558181111561107d5760008381526020902061107d91810190830161123391905b8082111561122f576000815560010161121b565b5090565b905600a165627a7a72305820a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb00029
Swarm Source
bzzr://a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb0
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.