Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DharmaDaiPrototype0
Compiler Version
v0.5.11+commit.c082d0b4
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-01-13 */ pragma solidity 0.5.11; // optimization runs: 200, evm version: petersburg interface DTokenInterface { event Mint(address minter, uint256 mintAmount, uint256 mintTokens); event Redeem(address redeemer, uint256 redeemAmount, uint256 redeemTokens); function mint(uint256 underlyingToSupply) external returns (uint256 dTokensMinted); function redeem(uint256 dTokenToBurn) external returns (uint256 underlyingReceived); function redeemUnderlying(uint256 underelyingToReceive) external returns (uint256 dTokensBurned); function pullSurplus() external returns (uint256 cTokenSurplus); function accrueInterest() external; function balanceOfUnderlying(address account) external returns (uint256 underlyingBalance); function getSurplus() external returns (uint256 cDaiSurplus); function exchangeRateCurrent() external returns (uint256 dTokenExchangeRate); function supplyRatePerBlock() external view returns (uint256 dTokenInterestRate); function getSpreadPerBlock() external view returns (uint256 rateSpread); function getVersion() external pure returns (uint256 version); } interface CTokenInterface { function mint(uint256 mintAmount) external returns (uint256 err); function redeem(uint256 redeemAmount) external returns (uint256 err); function redeemUnderlying(uint256 redeemAmount) external returns (uint256 err); function balanceOf(address account) external returns (uint256 balance); function balanceOfUnderlying(address account) external returns (uint256 balance); function exchangeRateCurrent() external returns (uint256 exchangeRate); function transfer(address recipient, uint256 value) external returns (bool); function supplyRatePerBlock() external view returns (uint256 rate); } interface ERC20Interface { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @title DharmaDaiPrototype0 * @author 0age (dToken mechanics derived from Compound cTokens, ERC20 methods * derived from Open Zeppelin's ERC20 contract) * @notice Initial prototype for a cDai wrapper token. This version is not * upgradeable, and serves as an initial test of the eventual dDai mechanics. * The dDai exchange rate will grow at an approximate APR of 5% or at the cDai * exchange rate, whichever is greater. */ contract DharmaDaiPrototype0 is ERC20Interface, DTokenInterface { using SafeMath for uint256; uint256 internal constant _DHARMA_DAI_VERSION = 0; // Note: this is a constant for the proof-of-concept but will be configurable. // 5% APR interest assuming 15 second block time & 2,102,400 blocks per year uint256 internal constant _RATE_PER_BLOCK = 1000000023782344094; string internal constant _NAME = "Dharma Dai (Prototype 0)"; string internal constant _SYMBOL = "dDai-p0"; uint8 internal constant _DECIMALS = 8; // to match cDai uint256 internal constant _SCALING_FACTOR = 1e18; uint256 internal constant _HALF_OF_SCALING_FACTOR = 5e17; uint256 internal constant _COMPOUND_SUCCESS = 0; CTokenInterface internal constant _CDAI = CTokenInterface( 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643 // mainnet ); ERC20Interface internal constant _DAI = ERC20Interface( 0x6B175474E89094C44Da98b954EedeAC495271d0F // mainnet ); // Note: this is just an EOA for the initial prototype. address internal constant _VAULT = 0x7e4A8391C728fEd9069B2962699AB416628B19Fa; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; // TODO: pack these more tightly in storage uint256 private _blockLastUpdated; uint256 private _dDaiExchangeRate; uint256 private _cDaiExchangeRate; constructor() public { // Approve cDai to transfer Dai on behalf of this contract in order to mint. require(_DAI.approve(address(_CDAI), uint256(-1))); _blockLastUpdated = block.number; _dDaiExchangeRate = 1e8; // 1 Dai == 1 dDai to start _cDaiExchangeRate = _CDAI.exchangeRateCurrent(); } /** * @notice Transfer `amount` Dai from `msg.sender` to this contract, use them * to mint cDAI, and mint dTokens with `msg.sender` as the beneficiary. Ensure * that this contract has been approved to transfer the Dai on behalf of the * caller. * @param daiToSupply uint256 The amount of dai to provide as part of minting. * @return The amount of dDai received in return for the supplied Dai. */ function mint( uint256 daiToSupply ) external accrues returns (uint256 dDaiMinted) { // Determine the dDai to mint using the exchange rate dDaiMinted = daiToSupply.mul(_SCALING_FACTOR).div(_dDaiExchangeRate); // Pull in Dai (requires that this contract has sufficient allowance) require( _DAI.transferFrom(msg.sender, address(this), daiToSupply), "Dai transfer failed." ); // Use the Dai to mint cDai (TODO: include error code in revert reason) require(_CDAI.mint(daiToSupply) == _COMPOUND_SUCCESS, "cDai mint failed."); // Mint dDai to the caller _mint(msg.sender, daiToSupply, dDaiMinted); } /** * @notice Redeem `dDaiToBurn` dDai from `msg.sender`, use the corresponding * cDai to redeem Dai, and transfer the Dai to `msg.sender`. * @param dDaiToBurn uint256 The amount of dDai to provide for Dai. * @return The amount of dai received in return for the provided cDai. */ function redeem( uint256 dDaiToBurn ) external accrues returns (uint256 daiReceived) { // Determine the underlying Dai value of the dDai to be burned daiReceived = dDaiToBurn.mul(_dDaiExchangeRate) / _SCALING_FACTOR; // Burn the dDai _burn(msg.sender, daiReceived, dDaiToBurn); // Use the cDai to redeem Dai (TODO: include error code in revert reason) require( _CDAI.redeemUnderlying(daiReceived) == _COMPOUND_SUCCESS, "cDai redeem failed." ); // Send the Dai to the redeemer require(_DAI.transfer(msg.sender, daiReceived), "Dai transfer failed."); } /** * @notice Redeem the dDai equivalent value of Dai amount `daiToReceive` from * `msg.sender`, use the corresponding cDai to redeem Dai, and transfer the * Dai to `msg.sender`. * @param daiToReceive uint256 The amount, denominated in Dai, of the cDai to * provide for Dai. * @return The amount of Dai received in return for the provided cDai. */ function redeemUnderlying( uint256 daiToReceive ) external accrues returns (uint256 dDaiBurned) { // Determine the dDai to redeem using the exchange rate dDaiBurned = daiToReceive.mul(_SCALING_FACTOR).div(_dDaiExchangeRate); // Burn the dDai _burn(msg.sender, daiToReceive, dDaiBurned); // Use the cDai to redeem Dai (TODO: include error code in revert reason) require( _CDAI.redeemUnderlying(daiToReceive) == _COMPOUND_SUCCESS, "cDai redeem failed." ); // Send the Dai to the redeemer require(_DAI.transfer(msg.sender, daiToReceive), "Dai transfer failed."); } /** * @notice Transfer cDai in excess of the total dDai balance to a dedicated * "vault" account. * @return The amount of cDai transferred to the vault account. */ function pullSurplus() external accrues returns (uint256 cDaiSurplus) { // Determine the cDai surplus (difference between total dDai and total cDai) cDaiSurplus = _getSurplus(); // Send the cDai surplus to the vault require(_CDAI.transfer(_VAULT, cDaiSurplus), "cDai transfer failed."); } /** * @notice Manually advance the dDai exchange rate and update the cDai * exchange rate to that of the current block. */ function accrueInterest() external accrues { // The `accrues()` modifier contains all function logic. } /** * @notice Transfer `amount` tokens from `msg.sender` to `recipient`. * @param recipient address The account to transfer tokens to. * @param amount uint256 The amount of tokens to transfer. * @return A boolean indicating whether the transfer was successful. */ function transfer(address recipient, uint256 amount) external returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @notice Approve `spender` to transfer up to `value` tokens on behalf of * `msg.sender`. * @param spender address The account to grant the allowance. * @param value uint256 The size of the allowance to grant. * @return A boolean indicating whether the approval was successful. */ function approve(address spender, uint256 value) external returns (bool) { _approve(msg.sender, spender, value); return true; } /** * @notice Transfer `amount` tokens from `sender` to `recipient` as long as * `msg.sender` has sufficient allowance. * @param sender address The account to transfer tokens from. * @param recipient address The account to transfer tokens to. * @param amount uint256 The amount of tokens to transfer. * @return A boolean indicating whether the transfer was successful. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool) { _transfer(sender, recipient, amount); uint256 allowance = _allowances[sender][msg.sender]; if (allowance != uint256(-1)) { _approve(sender, msg.sender, allowance.sub(amount)); } return true; } /** * @notice Increase the current allowance of `spender` by `value` tokens. * @param spender address The account to grant the additional allowance. * @param addedValue uint256 The amount to increase the allowance by. * @return A boolean indicating whether the modification was successful. */ function increaseAllowance( address spender, uint256 addedValue ) external returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].add(addedValue) ); return true; } /** * @notice Decrease the current allowance of `spender` by `value` tokens. * @param spender address The account to decrease the allowance for. * @param subtractedValue uint256 The amount to subtract from the allowance. * @return A boolean indicating whether the modification was successful. */ function decreaseAllowance( address spender, uint256 subtractedValue ) external returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue) ); return true; } /** * @notice View function to get the dDai balance of an account, denominated in * its Dai equivalent value. * @param account address The account to check the balance for. * @return The total Dai-equivalent cDai balance. */ function balanceOfUnderlying( address account ) external returns (uint256 daiBalance) { // Get most recent dDai exchange rate by determining accrued interest (uint256 dDaiExchangeRate,,) = _getAccruedInterest(); // Convert account balance to Dai equivalent using the exchange rate daiBalance = _balances[account].mul(dDaiExchangeRate) / _SCALING_FACTOR; } /** * @notice View function to get the total surplus, or cDai balance that * exceeds the total dDai balance. * @return The total surplus. */ function getSurplus() external accrues returns (uint256 cDaiSurplus) { // Determine the cDai surplus (difference between total dDai and total cDai) cDaiSurplus = _getSurplus(); } /** * @notice View function to get the current dDai exchange rate (multiplied by * 10^18). * @return The current exchange rate. */ function exchangeRateCurrent() external returns (uint256 dDaiExchangeRate) { // Get most recent dDai exchange rate by determining accrued interest (dDaiExchangeRate,,) = _getAccruedInterest(); } /** * @notice View function to get the current dDai interest earned per block * (multiplied by 10^18). * @return The current interest rate. */ function supplyRatePerBlock() external view returns (uint256 dDaiInterestRate) { (dDaiInterestRate,) = _getRatePerBlock(); } /** * @notice View function to get the current cDai interest spread over dDai per * block (multiplied by 10^18). * @return The current interest rate spread. */ function getSpreadPerBlock() external view returns (uint256 rateSpread) { (uint256 dDaiInterestRate, uint256 cDaiInterestRate) = _getRatePerBlock(); rateSpread = cDaiInterestRate - dDaiInterestRate; } /** * @notice View function to get the total dDai supply. * @return The total supply. */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * @notice View function to get the total dDai balance of an account. * @param account address The account to check the dDai balance for. * @return The balance of the given account. */ function balanceOf(address account) external view returns (uint256 dDai) { dDai = _balances[account]; } /** * @notice View function to get the total allowance that `spender` has to * transfer funds from the `owner` account using `transferFrom`. * @param owner address The account that is granting the allowance. * @param spender address The account that has been granted the allowance. * @return The allowance of the given spender for the given owner. */ function allowance(address owner, address spender) external view returns (uint256) { return _allowances[owner][spender]; } /** * @notice Pure function to get the name of the token. * @return The name of the token. */ function name() external pure returns (string memory) { return _NAME; } /** * @notice Pure function to get the symbol of the token. * @return The symbol of the token. */ function symbol() external pure returns (string memory) { return _SYMBOL; } /** * @notice Pure function to get the number of decimals of the token. * @return The number of decimals of the token. */ function decimals() external pure returns (uint8) { return _DECIMALS; } /** * @notice Pure function for getting the current Dharma Dai version. * @return The current Dharma Dai version. */ function getVersion() external pure returns (uint256 version) { version = _DHARMA_DAI_VERSION; } /** * @notice Internal function to mint `amount` tokens by exchanging `exchanged` * tokens to `account` and emit corresponding `Mint` & `Transfer` events. * @param account address The account to mint tokens to. * @param exchanged uint256 The amount of underlying tokens used to mint. * @param amount uint256 The amount of tokens to mint. */ function _mint(address account, uint256 exchanged, uint256 amount) internal { _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Mint(account, exchanged, amount); emit Transfer(address(0), account, amount); } /** * @notice Internal function to burn `amount` tokens by exchanging `exchanged` * tokens from `account` and emit corresponding `Redeeem` & `Transfer` events. * @param account address The account to burn tokens from. * @param exchanged uint256 The amount of underlying tokens given for burning. * @param amount uint256 The amount of tokens to burn. */ function _burn(address account, uint256 exchanged, uint256 amount) internal { uint256 balancePriorToBurn = _balances[account]; require( balancePriorToBurn >= amount, "Supplied amount exceeds account balance." ); _totalSupply = _totalSupply.sub(amount); _balances[account] = balancePriorToBurn - amount; // overflow checked above emit Transfer(account, address(0), amount); emit Redeem(account, exchanged, amount); } /** * @notice Internal function to move `amount` tokens from `sender` to * `recipient` and emit a corresponding `Transfer` event. * @param sender address The account to transfer tokens from. * @param recipient address The account to transfer tokens to. * @param amount uint256 The amount of tokens to transfer. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** * @notice Internal function to set the allowance for `spender` to transfer up * to `value` tokens on behalf of `owner`. * @param owner address The account that has granted the allowance. * @param spender address The account to grant the allowance. * @param value uint256 The size of the allowance to grant. */ function _approve(address owner, address spender, uint256 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @notice Internal, view-esque function to get the latest dDai and cDai * exchange rates for Dai and update the record of each in the event that they * have not already been updated in the given block. * @return The dDai and cDai exchange rate, as well as a boolean indicating if * interest accrual has been processed already or needs to be calculated and * placed in storage. */ function _getAccruedInterest() internal /* view */ returns ( uint256 dDaiExchangeRate, uint256 cDaiExchangeRate, bool fullyAccrued ) { // Get the number of blocks since the last time interest was accrued uint256 blocksToAccrueInterest = block.number - _blockLastUpdated; fullyAccrued = (blocksToAccrueInterest == 0); // Skip calculation and read from storage if interest was accrued this block if (fullyAccrued) { dDaiExchangeRate = _dDaiExchangeRate; cDaiExchangeRate = _cDaiExchangeRate; } else { // Calculate the accrued interest over the period uint256 defaultInterest = _pow(_RATE_PER_BLOCK, blocksToAccrueInterest); // Retrieve the latest exchange rate for cDai cDaiExchangeRate = _CDAI.exchangeRateCurrent(); // Calculate the accrued interest for Compound over the period uint256 cDaiInterest = ( cDaiExchangeRate.mul(_SCALING_FACTOR).div(_cDaiExchangeRate) ); // Take the lesser of the two and use it to adjust the dDai exchange rate dDaiExchangeRate = _dDaiExchangeRate.mul( defaultInterest > cDaiInterest ? cDaiInterest : defaultInterest ) / _SCALING_FACTOR; } } /** * @notice Internal, view-esque function to get the total surplus, or cDai * balance that exceeds the total dDai balance. * @return The total surplus. */ function _getSurplus() internal /* view */ returns (uint256 cDaiSurplus) { // Determine the total value of all issued dDai in Dai, rounded up uint256 dDaiUnderlying = ( _totalSupply.mul(_dDaiExchangeRate) / _SCALING_FACTOR ).add(1); // Compare to total underlying Dai value of all cDai held by this contract uint256 daiSurplus = ( _CDAI.balanceOfUnderlying(address(this)).sub(dDaiUnderlying) ); // Determine the cDai equivalent of this surplus amount cDaiSurplus = daiSurplus.mul(_SCALING_FACTOR).div(_cDaiExchangeRate); } /** * @notice View function to get the current dDai and cDai interest supply rate * per block (multiplied by 10^18). * @return The current dDai and cDai interest rates. */ function _getRatePerBlock() internal view returns ( uint256 dDaiSupplyRate, uint256 cDaiSupplyRate ) { uint256 defaultSupplyRate = _RATE_PER_BLOCK.sub(_SCALING_FACTOR); cDaiSupplyRate = _CDAI.supplyRatePerBlock(); // NOTE: accrue on Compound first? dDaiSupplyRate = ( defaultSupplyRate < cDaiSupplyRate ? defaultSupplyRate : cDaiSupplyRate ); } /** * @notice Internal function to take `floatIn` (i.e. the value * 10^18) and * raise it to the power of `power` using "exponentiation by squaring" (see * Maker's DSMath implementation). * @param floatIn uint256 The value. * @param power address The power to raise the value by. * @return The specified value raised to the specified power. */ function _pow(uint256 floatIn, uint256 power) internal pure returns (uint256 floatOut) { floatOut = power % 2 != 0 ? floatIn : _SCALING_FACTOR; for (power /= 2; power != 0; power /= 2) { floatIn = (floatIn.mul(floatIn)).add(_HALF_OF_SCALING_FACTOR) / _SCALING_FACTOR; if (power % 2 != 0) { floatOut = (floatIn.mul(floatOut)).add(_HALF_OF_SCALING_FACTOR) / _SCALING_FACTOR; } } } /** * @notice Modifier to determine the latest dDai and cDai exchange rates, and * to update the respective storage values if they have not already been * updated at some point in the current block, before proceeding to execution * of the rest of the decorated function. */ modifier accrues() { ( uint256 dDaiExchangeRate, uint256 cDaiExchangeRate, bool fullyAccrued ) = _getAccruedInterest(); if (!fullyAccrued) { // Update storage with dDai + cDai exchange rates as of the current block _blockLastUpdated = block.number; _dDaiExchangeRate = dDaiExchangeRate; _cDaiExchangeRate = cDaiExchangeRate; } _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pullSurplus","outputs":[{"internalType":"uint256","name":"cDaiSurplus","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getSurplus","outputs":[{"internalType":"uint256","name":"cDaiSurplus","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"daiBalance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSpreadPerBlock","outputs":[{"internalType":"uint256","name":"rateSpread","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"dDai","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiToReceive","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"dDaiBurned","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiToSupply","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"dDaiMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"accrueInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"dDaiInterestRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"dDaiExchangeRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"dDaiToBurn","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"daiReceived","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152735d3a536e4d6dbd6114cc1ead35777bab948e3643600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f9163095ea7b39160448083019260209291908290030181600087803b15801561009957600080fd5b505af11580156100ad573d6000803e3d6000fd5b505050506040513d60208110156100c357600080fd5b50516100ce57600080fd5b436003556305f5e1006004908155604080517fbd6d894d0000000000000000000000000000000000000000000000000000000081529051735d3a536e4d6dbd6114cc1ead35777bab948e36439263bd6d894d928082019260209290918290030181600087803b15801561014057600080fd5b505af1158015610154573d6000803e3d6000fd5b505050506040513d602081101561016a57600080fd5b505160055561175b8061017e6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c61057f565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b7565b610274610616565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061b565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610657565b61020c6106a9565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106be565b61020c6004803603602081101561032057600080fd5b50356106d9565b61014f6108df565b61020c6004803603602081101561034557600080fd5b5035610900565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610af8565b610380610b34565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b60565b61020c610b6d565b61020c610b7d565b61020c600480360360208110156103d457600080fd5b5035610b8f565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d14565b60408051808201909152601881527f446861726d6120446169202850726f746f747970652030290000000000000000602082015290565b600061044d338484610d3f565b5060015b92915050565b600090565b60025490565b600080600080610470610e2b565b9250925092508061048a5743600355600483905560058290555b610492610f42565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa6004820152602481018390529051919550735d3a536e4d6dbd6114cc1ead35777bab948e36439163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b5051610579576040805162461bcd60e51b815260206004820152601560248201527431a230b4903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b50505090565b60008060008061058d610e2b565b925092509250806105a75743600355600483905560058290555b6105af610f42565b935050505090565b60006105c484848461103d565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060b5761060b8533610606848763ffffffff61117f16565b610d3f565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff6111dc16565b600080610662610e2b565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069a908363ffffffff61123d16565b816106a157fe5b049392505050565b60008060006106b6611296565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e7610e2b565b925092509250806107015743600355600483905560058290555b60045461072c9061072087670de0b6b3a764000063ffffffff61123d16565b9063ffffffff61134d16565b93506107393386866113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506040513d60208110156107bf57600080fd5b505114610809576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018790529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b505050506040513d602081101561088d57600080fd5b50516108d7576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b505050919050565b6040805180820190915260078152660644461692d70360cc1b602082015290565b60008060008061090e610e2b565b925092509250806109285743600355600483905560058290555b6004546109479061072087670de0b6b3a764000063ffffffff61123d16565b604080516323b872dd60e01b8152336004820152306024820152604481018890529051919550736b175474e89094c44da98b954eedeac495271d0f916323b872dd916064808201926020929091908290030181600087803b1580156109ab57600080fd5b505af11580156109bf573d6000803e3d6000fd5b505050506040513d60208110156109d557600080fd5b5051610a1f576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b505114610aed576040805162461bcd60e51b815260206004820152601160248201527031a230b49036b4b73a103330b4b632b21760791b604482015290519081900360640190fd5b6108d73386866114c7565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff61117f16565b6000806000610b41610e2b565b92509250925080610b5b5743600355600483905560058290555b505050565b600061044d33848461103d565b6000610b77611296565b50919050565b6000610b87610e2b565b509092915050565b600080600080610b9d610e2b565b92509250925080610bb75743600355600483905560058290555b670de0b6b3a7640000610bd56004548761123d90919063ffffffff16565b81610bdc57fe5b049350610bea3385876113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b505050506040513d6020811015610c7057600080fd5b505114610cba576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018690529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d845760405162461bcd60e51b81526004018080602001828103825260248152602001806116db6024913960400191505060405180910390fd5b6001600160a01b038216610dc95760405162461bcd60e51b81526004018080602001828103825260228152602001806116736022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e4d5760045493506005549250610f3c565b6000610e61670de0b6b930edc59e836115a7565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb257600080fd5b505af1158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051600554909450600090610f039061072087670de0b6b3a764000063ffffffff61123d16565b9050670de0b6b3a7640000610f2f828411610f1e5783610f20565b825b6004549063ffffffff61123d16565b81610f3657fe5b04955050505b50909192565b600080610f7e6001670de0b6b3a7640000610f6a60045460025461123d90919063ffffffff16565b81610f7157fe5b049063ffffffff6111dc16565b60408051633af9e66960e01b81523060048201529051919250600091611014918491735d3a536e4d6dbd6114cc1ead35777bab948e364391633af9e66991602480830192602092919082900301818987803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b50519063ffffffff61117f16565b6005549091506110369061072083670de0b6b3a764000063ffffffff61123d16565b9250505090565b6001600160a01b0383166110825760405162461bcd60e51b81526004018080602001828103825260258152602001806116b66025913960400191505060405180910390fd5b6001600160a01b0382166110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806116506023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f0908263ffffffff61117f16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611125908263ffffffff6111dc16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611236576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261124c57506000610451565b8282028284828161125957fe5b04146112365760405162461bcd60e51b81526004018080602001828103825260218152602001806116956021913960400191505060405180910390fd5b600080806112ba670de0b6b930edc59e670de0b6b3a764000063ffffffff61117f16565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b505191508181106113445781611346565b805b9250509091565b60008082116113a3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113ae57fe5b04949350505050565b6001600160a01b0383166000908152602081905260409020548181101561140f5760405162461bcd60e51b81526004018080602001828103825260288152602001806116ff6028913960400191505060405180910390fd5b600254611422908363ffffffff61117f16565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114da908263ffffffff6111dc16565b6002556001600160a01b038316600090815260208190526040902054611506908263ffffffff6111dc16565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115bf57670de0b6b3a76400006115c1565b825b90506002820491505b811561045157670de0b6b3a76400006116016706f05b59d3b200006115f5868063ffffffff61123d16565b9063ffffffff6111dc16565b8161160857fe5b049250600282061561164457670de0b6b3a76400006116396706f05b59d3b200006115f5868563ffffffff61123d16565b8161164057fe5b0490505b6002820491506115ca56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a72315820a693ae3b529a052d32bcd89b86d91e4f2f7c5db0cf1ea953394ecd8d21e50d9464736f6c634300050b0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c61057f565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b7565b610274610616565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061b565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610657565b61020c6106a9565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106be565b61020c6004803603602081101561032057600080fd5b50356106d9565b61014f6108df565b61020c6004803603602081101561034557600080fd5b5035610900565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610af8565b610380610b34565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b60565b61020c610b6d565b61020c610b7d565b61020c600480360360208110156103d457600080fd5b5035610b8f565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d14565b60408051808201909152601881527f446861726d6120446169202850726f746f747970652030290000000000000000602082015290565b600061044d338484610d3f565b5060015b92915050565b600090565b60025490565b600080600080610470610e2b565b9250925092508061048a5743600355600483905560058290555b610492610f42565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa6004820152602481018390529051919550735d3a536e4d6dbd6114cc1ead35777bab948e36439163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b5051610579576040805162461bcd60e51b815260206004820152601560248201527431a230b4903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b50505090565b60008060008061058d610e2b565b925092509250806105a75743600355600483905560058290555b6105af610f42565b935050505090565b60006105c484848461103d565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060b5761060b8533610606848763ffffffff61117f16565b610d3f565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff6111dc16565b600080610662610e2b565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069a908363ffffffff61123d16565b816106a157fe5b049392505050565b60008060006106b6611296565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e7610e2b565b925092509250806107015743600355600483905560058290555b60045461072c9061072087670de0b6b3a764000063ffffffff61123d16565b9063ffffffff61134d16565b93506107393386866113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506040513d60208110156107bf57600080fd5b505114610809576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018790529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b505050506040513d602081101561088d57600080fd5b50516108d7576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b505050919050565b6040805180820190915260078152660644461692d70360cc1b602082015290565b60008060008061090e610e2b565b925092509250806109285743600355600483905560058290555b6004546109479061072087670de0b6b3a764000063ffffffff61123d16565b604080516323b872dd60e01b8152336004820152306024820152604481018890529051919550736b175474e89094c44da98b954eedeac495271d0f916323b872dd916064808201926020929091908290030181600087803b1580156109ab57600080fd5b505af11580156109bf573d6000803e3d6000fd5b505050506040513d60208110156109d557600080fd5b5051610a1f576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b505114610aed576040805162461bcd60e51b815260206004820152601160248201527031a230b49036b4b73a103330b4b632b21760791b604482015290519081900360640190fd5b6108d73386866114c7565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff61117f16565b6000806000610b41610e2b565b92509250925080610b5b5743600355600483905560058290555b505050565b600061044d33848461103d565b6000610b77611296565b50919050565b6000610b87610e2b565b509092915050565b600080600080610b9d610e2b565b92509250925080610bb75743600355600483905560058290555b670de0b6b3a7640000610bd56004548761123d90919063ffffffff16565b81610bdc57fe5b049350610bea3385876113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b505050506040513d6020811015610c7057600080fd5b505114610cba576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018690529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d845760405162461bcd60e51b81526004018080602001828103825260248152602001806116db6024913960400191505060405180910390fd5b6001600160a01b038216610dc95760405162461bcd60e51b81526004018080602001828103825260228152602001806116736022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e4d5760045493506005549250610f3c565b6000610e61670de0b6b930edc59e836115a7565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb257600080fd5b505af1158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051600554909450600090610f039061072087670de0b6b3a764000063ffffffff61123d16565b9050670de0b6b3a7640000610f2f828411610f1e5783610f20565b825b6004549063ffffffff61123d16565b81610f3657fe5b04955050505b50909192565b600080610f7e6001670de0b6b3a7640000610f6a60045460025461123d90919063ffffffff16565b81610f7157fe5b049063ffffffff6111dc16565b60408051633af9e66960e01b81523060048201529051919250600091611014918491735d3a536e4d6dbd6114cc1ead35777bab948e364391633af9e66991602480830192602092919082900301818987803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b50519063ffffffff61117f16565b6005549091506110369061072083670de0b6b3a764000063ffffffff61123d16565b9250505090565b6001600160a01b0383166110825760405162461bcd60e51b81526004018080602001828103825260258152602001806116b66025913960400191505060405180910390fd5b6001600160a01b0382166110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806116506023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f0908263ffffffff61117f16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611125908263ffffffff6111dc16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611236576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261124c57506000610451565b8282028284828161125957fe5b04146112365760405162461bcd60e51b81526004018080602001828103825260218152602001806116956021913960400191505060405180910390fd5b600080806112ba670de0b6b930edc59e670de0b6b3a764000063ffffffff61117f16565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b505191508181106113445781611346565b805b9250509091565b60008082116113a3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113ae57fe5b04949350505050565b6001600160a01b0383166000908152602081905260409020548181101561140f5760405162461bcd60e51b81526004018080602001828103825260288152602001806116ff6028913960400191505060405180910390fd5b600254611422908363ffffffff61117f16565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114da908263ffffffff6111dc16565b6002556001600160a01b038316600090815260208190526040902054611506908263ffffffff6111dc16565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115bf57670de0b6b3a76400006115c1565b825b90506002820491505b811561045157670de0b6b3a76400006116016706f05b59d3b200006115f5868063ffffffff61123d16565b9063ffffffff6111dc16565b8161160857fe5b049250600282061561164457670de0b6b3a76400006116396706f05b59d3b200006115f5868563ffffffff61123d16565b8161164057fe5b0490505b6002820491506115ca56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a72315820a693ae3b529a052d32bcd89b86d91e4f2f7c5db0cf1ea953394ecd8d21e50d9464736f6c634300050b0032
Deployed Bytecode Sourcemap
3854:19725:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3854:19725:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15403:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15403:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10207:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10207:140:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16044:104;;;:::i;:::-;;;;;;;;;;;;;;;;14363:87;;;:::i;8880:313::-;;;:::i;13001:191::-;;;:::i;10756:336::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10756:336:0;;;;;;;;;;;;;;;;;:::i;15827:79::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11414:222;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11414:222:0;;;;;;;;:::i;12447:388::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12447:388:0;-1:-1:-1;;;;;12447:388:0;;:::i;14040:213::-;;;:::i;14663:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14663:111:0;-1:-1:-1;;;;;14663:111:0;;:::i;8053:638::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8053:638:0;;:::i;15601:83::-;;;:::i;6063:669::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6063:669:0;;:::i;11961:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11961:232:0;;;;;;;;:::i;9337:111::-;;;:::i;:::-;;9741:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9741:148:0;;;;;;;;:::i;13723:132::-;;;:::i;13348:207::-;;;:::i;7041:627::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7041:627:0;;:::i;15158:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15158:130:0;;;;;;;;;;:::i;15403:79::-;15471:5;;;;;;;;;;;;;;;;;15403:79;:::o;10207:140::-;10274:4;10287:36;10296:10;10308:7;10317:5;10287:8;:36::i;:::-;-1:-1:-1;10337:4:0;10207:140;;;;;:::o;16044:104::-;16089:15;;16044:104::o;14363:87::-;14432:12;;14363:87;:::o;8880:313::-;8929:19;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;9053:13;:11;:13::i;:::-;9126:35;;;-1:-1:-1;;;9126:35:0;;4935:42;9126:35;;;;;;;;;;;;9039:27;;-1:-1:-1;4650:42:0;;9126:14;;:35;;;;;;;;;;;;;;;-1:-1:-1;4650:42:0;9126:35;;;5:2:-1;;;;30:1;27;20:12;5:2;9126:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9126:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9126:35:0;9118:69;;;;;-1:-1:-1;;;9118:69:0;;;;;;;;;;;;-1:-1:-1;;;9118:69:0;;;;;;;;;;;;;;;8880:313;;;;:::o;13001:191::-;13049:19;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;13173:13;:11;:13::i;:::-;13159:27;;13001:191;;;;:::o;10756:336::-;10857:4;10870:36;10880:6;10888:9;10899:6;10870:9;:36::i;:::-;-1:-1:-1;;;;;10933:19:0;;10913:17;10933:19;;;:11;:19;;;;;;;;10953:10;10933:31;;;;;;;;-1:-1:-1;;10975:24:0;;10971:98;;11010:51;11019:6;11027:10;11039:21;:9;11053:6;11039:21;:13;:21;:::i;:::-;11010:8;:51::i;:::-;-1:-1:-1;11082:4:0;;10756:336;-1:-1:-1;;;;10756:336:0:o;15827:79::-;4393:1;15827:79;:::o;11414:222::-;11536:10;11506:4;11557:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11557:32:0;;;;;;;;;;11506:4;;11519:93;;11548:7;;11557:48;;11594:10;11557:48;:36;:48;:::i;12447:388::-;12521:18;12624:24;12654:21;:19;:21::i;:::-;-1:-1:-1;;;;;;;12771:18:0;;:9;:18;;;;;;;;;;;12623:52;;-1:-1:-1;4462:4:0;;12771:40;;12623:52;12771:40;:22;:40;:::i;:::-;:58;;;;;;;12447:388;-1:-1:-1;;;12447:388:0:o;14040:213::-;14092:18;14120:24;14146;14174:18;:16;:18::i;:::-;14212:35;;14040:213;-1:-1:-1;;;14040:213:0:o;14663:111::-;-1:-1:-1;;;;;14750:18:0;14722:12;14750:18;;;;;;;;;;;;14663:111::o;8053:638::-;8137:18;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;8276:17;;8238:56;;:33;:12;4462:4;8238:33;:16;:33;:::i;:::-;:37;:56;:37;:56;:::i;:::-;8225:69;;8325:43;8331:10;8343:12;8357:10;8325:5;:43::i;:::-;4578:1;4650:42;-1:-1:-1;;;;;8473:22:0;;8496:12;8473:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8473:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8473:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8473:36:0;:57;8457:110;;;;;-1:-1:-1;;;8457:110:0;;;;;;;;;;;;-1:-1:-1;;;8457:110:0;;;;;;;;;;;;;;;8621:39;;;-1:-1:-1;;;8621:39:0;;8635:10;8621:39;;;;;;;;;;;;4776:42;;8621:13;;:39;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;8621:39;;;5:2:-1;;;;30:1;27;20:12;5:2;8621:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8621:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8621:39:0;8613:72;;;;;-1:-1:-1;;;8613:72:0;;;;;;;;;;;;-1:-1:-1;;;8613:72:0;;;;;;;;;;;;;;;8053:638;;;;;;:::o;15601:83::-;15671:7;;;;;;;;;;;;-1:-1:-1;;;15671:7:0;;;;15601:83;:::o;6063:669::-;6134:18;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;6270:17;;6233:55;;:32;:11;4462:4;6233:32;:15;:32;:::i;:55::-;6388:57;;;-1:-1:-1;;;6388:57:0;;6406:10;6388:57;;;;6426:4;6388:57;;;;;;;;;;;;6220:68;;-1:-1:-1;4776:42:0;;6388:17;;:57;;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;6388:57;;;5:2:-1;;;;30:1;27;20:12;5:2;6388:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6388:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6388:57:0;6372:111;;;;;-1:-1:-1;;;6372:111:0;;;;;;;;;;;;-1:-1:-1;;;6372:111:0;;;;;;;;;;;;;;;4578:1;4650:42;-1:-1:-1;;;;;6577:10:0;;6588:11;6577:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6577:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6577:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6577:23:0;:44;6569:74;;;;;-1:-1:-1;;;6569:74:0;;;;;;;;;;;;-1:-1:-1;;;6569:74:0;;;;;;;;;;;;;;;6684:42;6690:10;6702:11;6715:10;6684:5;:42::i;11961:232::-;12088:10;12058:4;12109:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12109:32:0;;;;;;;;;;12058:4;;12071:98;;12100:7;;12109:53;;12146:15;12109:53;:36;:53;:::i;9337:111::-;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;9337:111;;;:::o;9741:148::-;9812:4;9825:40;9835:10;9847:9;9858:6;9825:9;:40::i;13723:132::-;13776:24;13831:18;:16;:18::i;:::-;-1:-1:-1;13809:40:0;13723:132;-1:-1:-1;13723:132:0:o;13348:207::-;13397:24;13528:21;:19;:21::i;:::-;-1:-1:-1;13505:44:0;;13348:207;-1:-1:-1;;13348:207:0:o;7041:627::-;7113:19;23213:24;23239;23265:17;23292:21;:19;:21::i;:::-;23204:109;;;;;;23327:12;23322:239;;23451:12;23431:17;:32;23472:17;:36;;;23517:17;:36;;;23322:239;4462:4;7223:33;7238:17;;7223:10;:14;;:33;;;;:::i;:::-;:51;;;;;;7209:65;;7305:42;7311:10;7323:11;7336:10;7305:5;:42::i;:::-;4578:1;4650:42;-1:-1:-1;;;;;7452:22:0;;7475:11;7452:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7452:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7452:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7452:35:0;:56;7436:109;;;;;-1:-1:-1;;;7436:109:0;;;;;;;;;;;;-1:-1:-1;;;7436:109:0;;;;;;;;;;;;;;;7599:38;;;-1:-1:-1;;;7599:38:0;;7613:10;7599:38;;;;;;;;;;;;4776:42;;7599:13;;:38;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;7599:38;;;5:2:-1;;;;30:1;27;20:12;15158:130:0;-1:-1:-1;;;;;15255:18:0;;;15232:7;15255:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15158:130::o;18754:317::-;-1:-1:-1;;;;;18843:19:0;;18835:68;;;;-1:-1:-1;;;18835:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18918:21:0;;18910:68;;;;-1:-1:-1;;;18910:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18987:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19034:31;;;;;;;;;;;;;;;;;18754:317;;;:::o;19492:1228::-;19762:17;;19558:24;;;;19747:12;:32;19802:27;;;19921:794;;;;19967:17;;19948:36;;20012:17;;19993:36;;19921:794;;;20109:23;20135:45;4218:19;20157:22;20135:4;:45::i;:::-;20109:71;;4650:42;-1:-1:-1;;;;;20263:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20263:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20263:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20263:27:0;20447:17;;20263:27;;-1:-1:-1;20371:20:0;;20405:60;;:37;20263:27;4462:4;20405:37;:20;:37;:::i;:60::-;20371:103;;4462:4;20585:104;20635:12;20617:15;:30;:63;;20665:15;20617:63;;;20650:12;20617:63;20585:17;;;:104;:21;:104;:::i;:::-;:122;;;;;;20566:141;;19921:794;;;19492:1228;;;;:::o;20902:583::-;20954:19;21054:22;21079:76;21153:1;4462:4;21088:35;21105:17;;21088:12;;:16;;:35;;;;:::i;:::-;:53;;;;;;;21079:76;:73;:76;:::i;:::-;21274:40;;;-1:-1:-1;;;21274:40:0;;21308:4;21274:40;;;;;;21054:101;;-1:-1:-1;21244:18:0;;21274:60;;21054:101;;4650:42;;21274:25;;:40;;;;;;;;;;;;;;21244:18;4650:42;21274:40;;;5:2:-1;;;;30:1;27;20:12;5:2;21274:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21274:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21274:40:0;;:60;:44;:60;:::i;:::-;21461:17;;21244:97;;-1:-1:-1;21425:54:0;;:31;21244:97;4462:4;21425:31;:14;:31;:::i;:54::-;21411:68;;20902:583;;;:::o;18000:407::-;-1:-1:-1;;;;;18094:20:0;;18086:70;;;;-1:-1:-1;;;18086:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18171:23:0;;18163:71;;;;-1:-1:-1;;;18163:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18263:17:0;;:9;:17;;;;;;;;;;;:29;;18285:6;18263:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18243:17:0;;;:9;:17;;;;;;;;;;;:49;;;;18322:20;;;;;;;:32;;18347:6;18322:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18299:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18366:35;;;;;;;18299:20;;18366:35;;;;;;;;;;;;;18000:407;;;:::o;2682:170::-;2740:7;2769:1;2764;:6;;2756:49;;;;;-1:-1:-1;;;2756:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2824:5:0;;;2682:170::o;2509:167::-;2567:7;2595:5;;;2615:6;;;;2607:46;;;;;-1:-1:-1;;;2607:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2669:1;2509:167;-1:-1:-1;;;2509:167:0:o;2858:222::-;2916:7;2936:6;2932:37;;-1:-1:-1;2960:1:0;2953:8;;2932:37;2989:5;;;2993:1;2989;:5;:1;3009:5;;;;;:10;3001:56;;;;-1:-1:-1;;;3001:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21682:382;21739:22;;;21826:36;4218:19;4462:4;21826:36;:19;:36;:::i;:::-;21798:64;;4650:42;-1:-1:-1;;;;;21886:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21886:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21886:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21886:26:0;;-1:-1:-1;21980:34:0;;;:71;;22037:14;21980:71;;;22017:17;21980:71;21954:104;;21682:382;;;:::o;3086:165::-;3144:7;3172:1;3168;:5;3160:44;;;;;-1:-1:-1;;;3160:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3211:9;3227:1;3223;:5;;;;;;;3086:165;-1:-1:-1;;;;3086:165:0:o;17189:464::-;-1:-1:-1;;;;;17301:18:0;;17272:26;17301:18;;;;;;;;;;;17342:28;;;;17326:95;;;;-1:-1:-1;;;17326:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17445:12;;:24;;17462:6;17445:24;:16;:24;:::i;:::-;17430:12;:39;-1:-1:-1;;;;;17476:18:0;;:9;:18;;;;;;;;;;;17497:27;;;17476:48;;17564:37;;;;;;;17476:9;;:18;17564:37;;;;;;;;;;;17613:34;;;-1:-1:-1;;;;;17613:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17189:464;;;;:::o;16522:281::-;16620:12;;:24;;16637:6;16620:24;:16;:24;:::i;:::-;16605:12;:39;-1:-1:-1;;;;;16672:18:0;;:9;:18;;;;;;;;;;;:30;;16695:6;16672:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;16651:18:0;;:9;:18;;;;;;;;;;;;:51;;;;16716:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;16760:37;;;;;;;;-1:-1:-1;;;;;16760:37:0;;;16777:1;;16760:37;;;;;;;;;16522:281;;;:::o;22445:430::-;22514:16;22558:1;22550:5;:9;:42;;4462:4;22550:42;;;22567:7;22550:42;22539:53;-1:-1:-1;22615:1:0;22606:10;;;;22601:269;22618:10;;22601:269;;4462:4;22661:51;4523:4;22662:20;22674:7;;22662:20;:11;:20;:::i;:::-;22661:26;:51;:26;:51;:::i;:::-;:69;;;;;;;-1:-1:-1;22753:1:0;22745:5;:9;:14;22741:122;;4462:4;22783:52;4523:4;22784:21;:7;22796:8;22784:21;:11;:21;:::i;22783:52::-;:70;;;;;;22772:81;;22741:122;22639:1;22630:10;;;;22601:269;
Swarm Source
bzzr://a693ae3b529a052d32bcd89b86d91e4f2f7c5db0cf1ea953394ecd8d21e50d94
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.