Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Hakka
- Optimization enabled
- true
- Compiler version
- v0.5.16+commit.9c3226ce
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-03-10T19:51:04.267618Z
Constructor Arguments
454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374290000000000000000000000000000000000000000000000000000000000000001
Arg [0] (uint256) : 31339120015659993862160253144463915315563489969021235592778649851284316645152
Hakka.sol
pragma solidity 0.5.16;
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "permission denied");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0), "invalid address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
contract ApproveAndCallFallBack {
function receiveApproval(address from, uint256 value, address token, bytes calldata data) external;
}
contract Hakka is Ownable {
// --- ERC20 Data ---
string public constant name = "Hakka Finance";
string public constant symbol = "HAKKA";
string public constant version = "1";
uint8 public constant decimals = 18;
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
mapping (address => uint256) public nonces;
event Approval(address indexed holder, address indexed spender, uint256 amount);
event Transfer(address indexed from, address indexed to, uint256 amount);
// --- Math ---
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x);
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x);
}
// --- EIP712 niceties ---
bytes32 public DOMAIN_SEPARATOR;
// bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)");
bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;
constructor(uint256 chainId_) public {
DOMAIN_SEPARATOR = keccak256(abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256(bytes(version)),
chainId_,
address(this)
));
}
// --- Token ---
function transfer(address to, uint256 amount) external returns (bool) {
return transferFrom(msg.sender, to, amount);
}
function transferFrom(address from, address to, uint256 amount) public returns (bool) {
if (from != msg.sender && allowance[from][msg.sender] != uint256(-1))
allowance[from][msg.sender] = sub(allowance[from][msg.sender], amount);
require(balanceOf[from] >= amount, "insufficient-balance");
balanceOf[from] = sub(balanceOf[from], amount);
balanceOf[to] = add(balanceOf[to], amount);
emit Transfer(from, to, amount);
return true;
}
function mint(address to, uint256 amount) external onlyOwner {
balanceOf[to] = add(balanceOf[to], amount);
totalSupply = add(totalSupply, amount);
emit Transfer(address(0), to, amount);
}
function burn(address from, uint256 amount) external {
if (from != msg.sender && allowance[from][msg.sender] != uint256(-1))
allowance[from][msg.sender] = sub(allowance[from][msg.sender], amount);
require(balanceOf[from] >= amount, "insufficient-balance");
balanceOf[from] = sub(balanceOf[from], amount);
totalSupply = sub(totalSupply, amount);
emit Transfer(from, address(0), amount);
}
function approve(address spender, uint256 amount) external returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
// --- Approve and call contract ---
function approveAndCall(address spender, uint256 amount, bytes calldata data) external returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
ApproveAndCallFallBack(spender).receiveApproval(msg.sender, amount, address(this), data);
return true;
}
// --- Approve by signature ---
function permit(address holder, address spender, uint256 nonce, uint256 expiry,
bool allowed, uint8 v, bytes32 r, bytes32 s) external
{
bytes32 digest =
keccak256(abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH,
holder,
spender,
nonce,
expiry,
allowed))
));
require(holder != address(0), "invalid-address-0");
require(holder == ecrecover(digest, v, r, s), "invalid-permit");
require(expiry == 0 || now <= expiry, "permit-expired");
require(nonce == nonces[holder]++, "invalid-nonce");
uint256 amount = allowed ? uint256(-1) : 0;
allowance[holder][spender] = amount;
emit Approval(holder, spender, amount);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"Hakka.sol":"Hakka"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"uint256","name":"chainId_","internalType":"uint256"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"PERMIT_TYPEHASH","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveAndCall","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"burn","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"permit","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"expiry","internalType":"uint256"},{"type":"bool","name":"allowed","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"version","inputs":[],"constant":true}]
Contract Creation Code
0x608060405234801561001057600080fd5b506040516110de3803806110de8339818101604052602081101561003357600080fd5b5051600080546001600160a01b0319163317905560405180605261108c8239604080519182900360520182208282018252600d83526c48616b6b612046696e616e636560981b6020938401528151808301835260018152603160f81b908401528151808401919091527f05bb016de582ee20238e29c52124e74574148e3d29f920ece50f1b59415ffb53818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060055550610f67806101256000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad5780639dc29fac116100715780639dc29fac14610369578063a9059cbb14610395578063cae9ca51146103c1578063dd62ed3e14610446578063f2fde38b1461047457610121565b806370a08231146102975780637ecebe00146102bd5780638da5cb5b146102e35780638fcbaf0c1461030757806395d89b411461036157610121565b806330adf81f116100f457806330adf81f14610233578063313ce5671461023b5780633644e5151461025957806340c10f191461026157806354fd4d501461028f57610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e61049a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b0381351690602001356104c3565b604080519115158252519081900360200190f35b6101eb61052a565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b03813581169160208101359091169060400135610530565b6101eb6106df565b610243610703565b6040805160ff9092168252519081900360200190f35b6101eb610708565b61028d6004803603604081101561027757600080fd5b506001600160a01b03813516906020013561070e565b005b61012e6107f2565b6101eb600480360360208110156102ad57600080fd5b50356001600160a01b031661080f565b6101eb600480360360208110156102d357600080fd5b50356001600160a01b0316610821565b6102eb610833565b604080516001600160a01b039092168252519081900360200190f35b61028d600480360361010081101561031e57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608081013515159060ff60a0820135169060c08101359060e00135610842565b61012e610b29565b61028d6004803603604081101561037f57600080fd5b506001600160a01b038135169060200135610b4a565b6101cf600480360360408110156103ab57600080fd5b506001600160a01b038135169060200135610cd5565b6101cf600480360360608110156103d757600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561040757600080fd5b82018360208201111561041957600080fd5b8035906020019184600183028401116401000000008311171561043b57600080fd5b509092509050610ce9565b6101eb6004803603604081101561045c57600080fd5b506001600160a01b0381358116916020013516610dfa565b61028d6004803603602081101561048a57600080fd5b50356001600160a01b0316610e17565b6040518060400160405280600d81526020016c48616b6b612046696e616e636560981b81525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60015481565b60006001600160a01b038416331480159061057057506001600160a01b038416600090815260036020908152604080832033845290915290205460001914155b156105c8576001600160a01b03841660009081526003602090815260408083203384529091529020546105a39083610f12565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b6001600160a01b03841660009081526002602052604090205482111561062c576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742d62616c616e636560601b604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205461064f9083610f12565b6001600160a01b03808616600090815260026020526040808220939093559085168152205461067e9083610f22565b6001600160a01b0380851660008181526002602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b7fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb81565b601281565b60055481565b6000546001600160a01b03163314610761576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600260205260409020546107849082610f22565b6001600160a01b0383166000908152600260205260409020556001546107aa9082610f22565b6001556040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604051806040016040528060018152602001603160f81b81525081565b60026020526000908152604090205481565b60046020526000908152604090205481565b6000546001600160a01b031681565b600554604080517fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb6020808301919091526001600160a01b03808d16838501819052908c166060840152608083018b905260a083018a905288151560c0808501919091528451808503909101815260e08401855280519083012061190160f01b6101008501526101028401959095526101228084019590955283518084039095018552610142909201909252825192909101919091209061093e576040805162461bcd60e51b81526020600482015260116024820152700696e76616c69642d616464726573732d3607c1b604482015290519081900360640190fd5b6040805160008152602080820180845284905260ff8716828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015610995573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316146109f5576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a590b5c195c9b5a5d60921b604482015290519081900360640190fd5b851580610a025750854211155b610a44576040805162461bcd60e51b815260206004820152600e60248201526d1c195c9b5a5d0b595e1c1a5c995960921b604482015290519081900360640190fd5b6001600160a01b03891660009081526004602052604090208054600181019091558714610aa8576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642d6e6f6e636560981b604482015290519081900360640190fd5b600085610ab6576000610aba565b6000195b6001600160a01b03808c166000818152600360209081526040808320948f168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a350505050505050505050565b6040518060400160405280600581526020016448414b4b4160d81b81525081565b6001600160a01b0382163314801590610b8857506001600160a01b038216600090815260036020908152604080832033845290915290205460001914155b15610be0576001600160a01b0382166000908152600360209081526040808320338452909152902054610bbb9082610f12565b6001600160a01b03831660009081526003602090815260408083203384529091529020555b6001600160a01b038216600090815260026020526040902054811115610c44576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742d62616c616e636560601b604482015290519081900360640190fd5b6001600160a01b038216600090815260026020526040902054610c679082610f12565b6001600160a01b038316600090815260026020526040902055600154610c8d9082610f12565b6001556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610ce2338484610530565b9392505050565b3360008181526003602090815260408083206001600160a01b038916808552908352818420889055815188815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3604051638f4ffcb160e01b81523360048201818152602483018790523060448401819052608060648501908152608485018790526001600160a01b038a1694638f4ffcb194938a93928a928a92919060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b50600198975050505050505050565b600360209081526000928352604080842090915290825290205481565b6000546001600160a01b03163314610e6a576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038116610eb7576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b8082038281111561052457600080fd5b8082018281101561052457600080fdfea265627a7a723158203c906be090347bbc5e2d73a0f763fbf0c9ad80d5e2536a75c2c2073c461defe064736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374290000000000000000000000000000000000000000000000000000000000000001
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad5780639dc29fac116100715780639dc29fac14610369578063a9059cbb14610395578063cae9ca51146103c1578063dd62ed3e14610446578063f2fde38b1461047457610121565b806370a08231146102975780637ecebe00146102bd5780638da5cb5b146102e35780638fcbaf0c1461030757806395d89b411461036157610121565b806330adf81f116100f457806330adf81f14610233578063313ce5671461023b5780633644e5151461025957806340c10f191461026157806354fd4d501461028f57610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e61049a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b0381351690602001356104c3565b604080519115158252519081900360200190f35b6101eb61052a565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b03813581169160208101359091169060400135610530565b6101eb6106df565b610243610703565b6040805160ff9092168252519081900360200190f35b6101eb610708565b61028d6004803603604081101561027757600080fd5b506001600160a01b03813516906020013561070e565b005b61012e6107f2565b6101eb600480360360208110156102ad57600080fd5b50356001600160a01b031661080f565b6101eb600480360360208110156102d357600080fd5b50356001600160a01b0316610821565b6102eb610833565b604080516001600160a01b039092168252519081900360200190f35b61028d600480360361010081101561031e57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608081013515159060ff60a0820135169060c08101359060e00135610842565b61012e610b29565b61028d6004803603604081101561037f57600080fd5b506001600160a01b038135169060200135610b4a565b6101cf600480360360408110156103ab57600080fd5b506001600160a01b038135169060200135610cd5565b6101cf600480360360608110156103d757600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561040757600080fd5b82018360208201111561041957600080fd5b8035906020019184600183028401116401000000008311171561043b57600080fd5b509092509050610ce9565b6101eb6004803603604081101561045c57600080fd5b506001600160a01b0381358116916020013516610dfa565b61028d6004803603602081101561048a57600080fd5b50356001600160a01b0316610e17565b6040518060400160405280600d81526020016c48616b6b612046696e616e636560981b81525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b60015481565b60006001600160a01b038416331480159061057057506001600160a01b038416600090815260036020908152604080832033845290915290205460001914155b156105c8576001600160a01b03841660009081526003602090815260408083203384529091529020546105a39083610f12565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b6001600160a01b03841660009081526002602052604090205482111561062c576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742d62616c616e636560601b604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205461064f9083610f12565b6001600160a01b03808616600090815260026020526040808220939093559085168152205461067e9083610f22565b6001600160a01b0380851660008181526002602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b7fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb81565b601281565b60055481565b6000546001600160a01b03163314610761576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600260205260409020546107849082610f22565b6001600160a01b0383166000908152600260205260409020556001546107aa9082610f22565b6001556040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b604051806040016040528060018152602001603160f81b81525081565b60026020526000908152604090205481565b60046020526000908152604090205481565b6000546001600160a01b031681565b600554604080517fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb6020808301919091526001600160a01b03808d16838501819052908c166060840152608083018b905260a083018a905288151560c0808501919091528451808503909101815260e08401855280519083012061190160f01b6101008501526101028401959095526101228084019590955283518084039095018552610142909201909252825192909101919091209061093e576040805162461bcd60e51b81526020600482015260116024820152700696e76616c69642d616464726573732d3607c1b604482015290519081900360640190fd5b6040805160008152602080820180845284905260ff8716828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa158015610995573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316146109f5576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a590b5c195c9b5a5d60921b604482015290519081900360640190fd5b851580610a025750854211155b610a44576040805162461bcd60e51b815260206004820152600e60248201526d1c195c9b5a5d0b595e1c1a5c995960921b604482015290519081900360640190fd5b6001600160a01b03891660009081526004602052604090208054600181019091558714610aa8576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642d6e6f6e636560981b604482015290519081900360640190fd5b600085610ab6576000610aba565b6000195b6001600160a01b03808c166000818152600360209081526040808320948f168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a350505050505050505050565b6040518060400160405280600581526020016448414b4b4160d81b81525081565b6001600160a01b0382163314801590610b8857506001600160a01b038216600090815260036020908152604080832033845290915290205460001914155b15610be0576001600160a01b0382166000908152600360209081526040808320338452909152902054610bbb9082610f12565b6001600160a01b03831660009081526003602090815260408083203384529091529020555b6001600160a01b038216600090815260026020526040902054811115610c44576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742d62616c616e636560601b604482015290519081900360640190fd5b6001600160a01b038216600090815260026020526040902054610c679082610f12565b6001600160a01b038316600090815260026020526040902055600154610c8d9082610f12565b6001556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610ce2338484610530565b9392505050565b3360008181526003602090815260408083206001600160a01b038916808552908352818420889055815188815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3604051638f4ffcb160e01b81523360048201818152602483018790523060448401819052608060648501908152608485018790526001600160a01b038a1694638f4ffcb194938a93928a928a92919060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b50600198975050505050505050565b600360209081526000928352604080842090915290825290205481565b6000546001600160a01b03163314610e6a576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038116610eb7576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b8082038281111561052457600080fd5b8082018281101561052457600080fdfea265627a7a723158203c906be090347bbc5e2d73a0f763fbf0c9ad80d5e2536a75c2c2073c461defe064736f6c63430005100032