More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DharmaUSDCPrototype0
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 DharmaUSDCPrototype0 * @author 0age (dToken mechanics derived from Compound cTokens, ERC20 methods * derived from OpenZeppelin's ERC20 contract) * @notice Initial prototype for a cUSDC wrapper token. This version is not * upgradeable, and serves as an initial test of the eventual dUSDC mechanics. * The dUSDC exchange rate will grow at an approximate APR of 4% or at the cUSDC * exchange rate, whichever is greater. */ contract DharmaUSDCPrototype0 is ERC20Interface, DTokenInterface { using SafeMath for uint256; uint256 internal constant _DHARMA_USDC_VERSION = 0; // Note: this is a constant for the proof-of-concept but will be configurable. // 4% APR interest assuming 15 second block time & 2,102,400 blocks per year uint256 internal constant _RATE_PER_BLOCK = 1000000019025875275; string internal constant _NAME = "Dharma USD Coin (Prototype 0)"; string internal constant _SYMBOL = "dUSDC-p0"; uint8 internal constant _DECIMALS = 8; // to match cUSDC uint256 internal constant _SCALING_FACTOR = 1e18; uint256 internal constant _HALF_OF_SCALING_FACTOR = 5e17; uint256 internal constant _COMPOUND_SUCCESS = 0; CTokenInterface internal constant _CUSDC = CTokenInterface( 0x39AA39c021dfbaE8faC545936693aC917d5E7563 // mainnet ); ERC20Interface internal constant _USDC = ERC20Interface( 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 // 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 _dUSDCExchangeRate; uint256 private _cUSDCExchangeRate; constructor() public { // Approve cUSDC to transfer USDC on behalf of this contract in order to mint. require(_USDC.approve(address(_CUSDC), uint256(-1))); _blockLastUpdated = block.number; _dUSDCExchangeRate = 1e16; // 1 USDC == 1 dUSDC to start _cUSDCExchangeRate = _CUSDC.exchangeRateCurrent(); } /** * @notice Transfer `amount` USDC from `msg.sender` to this contract, use them * to mint cUSDC, and mint dTokens with `msg.sender` as the beneficiary. Ensure * that this contract has been approved to transfer the USDC on behalf of the * caller. * @param usdcToSupply uint256 The amount of usdc to provide as part of minting. * @return The amount of dUSDC received in return for the supplied USDC. */ function mint( uint256 usdcToSupply ) external accrues returns (uint256 dUSDCMinted) { // Determine the dUSDC to mint using the exchange rate dUSDCMinted = usdcToSupply.mul(_SCALING_FACTOR).div(_dUSDCExchangeRate); // Pull in USDC (requires that this contract has sufficient allowance) require( _USDC.transferFrom(msg.sender, address(this), usdcToSupply), "USDC transfer failed." ); // Use the USDC to mint cUSDC (TODO: include error code in revert reason) require(_CUSDC.mint(usdcToSupply) == _COMPOUND_SUCCESS, "cUSDC mint failed."); // Mint dUSDC to the caller _mint(msg.sender, usdcToSupply, dUSDCMinted); } /** * @notice Redeem `dUSDCToBurn` dUSDC from `msg.sender`, use the corresponding * cUSDC to redeem USDC, and transfer the USDC to `msg.sender`. * @param dUSDCToBurn uint256 The amount of dUSDC to provide for USDC. * @return The amount of usdc received in return for the provided cUSDC. */ function redeem( uint256 dUSDCToBurn ) external accrues returns (uint256 usdcReceived) { // Determine the underlying USDC value of the dUSDC to be burned usdcReceived = dUSDCToBurn.mul(_dUSDCExchangeRate) / _SCALING_FACTOR; // Burn the dUSDC _burn(msg.sender, usdcReceived, dUSDCToBurn); // Use the cUSDC to redeem USDC (TODO: include error code in revert reason) require( _CUSDC.redeemUnderlying(usdcReceived) == _COMPOUND_SUCCESS, "cUSDC redeem failed." ); // Send the USDC to the redeemer require(_USDC.transfer(msg.sender, usdcReceived), "USDC transfer failed."); } /** * @notice Redeem the dUSDC equivalent value of USDC amount `usdcToReceive` from * `msg.sender`, use the corresponding cUSDC to redeem USDC, and transfer the * USDC to `msg.sender`. * @param usdcToReceive uint256 The amount, denominated in USDC, of the cUSDC to * provide for USDC. * @return The amount of USDC received in return for the provided cUSDC. */ function redeemUnderlying( uint256 usdcToReceive ) external accrues returns (uint256 dUSDCBurned) { // Determine the dUSDC to redeem using the exchange rate dUSDCBurned = usdcToReceive.mul(_SCALING_FACTOR).div(_dUSDCExchangeRate); // Burn the dUSDC _burn(msg.sender, usdcToReceive, dUSDCBurned); // Use the cUSDC to redeem USDC (TODO: include error code in revert reason) require( _CUSDC.redeemUnderlying(usdcToReceive) == _COMPOUND_SUCCESS, "cUSDC redeem failed." ); // Send the USDC to the redeemer require(_USDC.transfer(msg.sender, usdcToReceive), "USDC transfer failed."); } /** * @notice Transfer cUSDC in excess of the total dUSDC balance to a dedicated * "vault" account. * @return The amount of cUSDC transferred to the vault account. */ function pullSurplus() external accrues returns (uint256 cUSDCSurplus) { // Determine the cUSDC surplus (difference between total dUSDC and total cUSDC) cUSDCSurplus = _getSurplus(); // Send the cUSDC surplus to the vault require(_CUSDC.transfer(_VAULT, cUSDCSurplus), "cUSDC transfer failed."); } /** * @notice Manually advance the dUSDC exchange rate and update the cUSDC * 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 dUSDC balance of an account, denominated in * its USDC equivalent value. * @param account address The account to check the balance for. * @return The total USDC-equivalent cUSDC balance. */ function balanceOfUnderlying( address account ) external returns (uint256 usdcBalance) { // Get most recent dUSDC exchange rate by determining accrued interest (uint256 dUSDCExchangeRate,,) = _getAccruedInterest(); // Convert account balance to USDC equivalent using the exchange rate usdcBalance = _balances[account].mul(dUSDCExchangeRate) / _SCALING_FACTOR; } /** * @notice View function to get the total surplus, or cUSDC balance that * exceeds the total dUSDC balance. * @return The total surplus. */ function getSurplus() external accrues returns (uint256 cUSDCSurplus) { // Determine the cUSDC surplus (difference between total dUSDC and total cUSDC) cUSDCSurplus = _getSurplus(); } /** * @notice View function to get the current dUSDC exchange rate (multiplied by * 10^18). * @return The current exchange rate. */ function exchangeRateCurrent() external returns (uint256 dUSDCExchangeRate) { // Get most recent dUSDC exchange rate by determining accrued interest (dUSDCExchangeRate,,) = _getAccruedInterest(); } /** * @notice View function to get the current dUSDC interest earned per block * (multiplied by 10^18). * @return The current interest rate. */ function supplyRatePerBlock() external view returns (uint256 dUSDCInterestRate) { (dUSDCInterestRate,) = _getRatePerBlock(); } /** * @notice View function to get the current cUSDC interest spread over dUSDC per * block (multiplied by 10^18). * @return The current interest rate spread. */ function getSpreadPerBlock() external view returns (uint256 rateSpread) { (uint256 dUSDCInterestRate, uint256 cUSDCInterestRate) = _getRatePerBlock(); rateSpread = cUSDCInterestRate - dUSDCInterestRate; } /** * @notice View function to get the total dUSDC supply. * @return The total supply. */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * @notice View function to get the total dUSDC balance of an account. * @param account address The account to check the dUSDC balance for. * @return The balance of the given account. */ function balanceOf(address account) external view returns (uint256 dUSDC) { dUSDC = _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 USDC version. * @return The current Dharma USDC version. */ function getVersion() external pure returns (uint256 version) { version = _DHARMA_USDC_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 dUSDC and cUSDC * exchange rates for USDC and update the record of each in the event that they * have not already been updated in the given block. * @return The dUSDC and cUSDC 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 dUSDCExchangeRate, uint256 cUSDCExchangeRate, 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) { dUSDCExchangeRate = _dUSDCExchangeRate; cUSDCExchangeRate = _cUSDCExchangeRate; } else { // Calculate the accrued interest over the period uint256 defaultInterest = _pow(_RATE_PER_BLOCK, blocksToAccrueInterest); // Retrieve the latest exchange rate for cUSDC cUSDCExchangeRate = _CUSDC.exchangeRateCurrent(); // Calculate the accrued interest for Compound over the period uint256 cUSDCInterest = ( cUSDCExchangeRate.mul(_SCALING_FACTOR).div(_cUSDCExchangeRate) ); // Take the lesser of the two and use it to adjust the dUSDC exchange rate dUSDCExchangeRate = _dUSDCExchangeRate.mul( defaultInterest > cUSDCInterest ? cUSDCInterest : defaultInterest ) / _SCALING_FACTOR; } } /** * @notice Internal, view-esque function to get the total surplus, or cUSDC * balance that exceeds the total dUSDC balance. * @return The total surplus. */ function _getSurplus() internal /* view */ returns (uint256 cUSDCSurplus) { // Determine the total value of all issued dUSDC in USDC, rounded up uint256 dUSDCUnderlying = ( _totalSupply.mul(_dUSDCExchangeRate) / _SCALING_FACTOR ).add(1); // Compare to total underlying USDC value of all cUSDC held by this contract uint256 usdcSurplus = ( _CUSDC.balanceOfUnderlying(address(this)).sub(dUSDCUnderlying) ); // Determine the cUSDC equivalent of this surplus amount cUSDCSurplus = usdcSurplus.mul(_SCALING_FACTOR).div(_cUSDCExchangeRate); } /** * @notice View function to get the current dUSDC and cUSDC interest supply rate * per block (multiplied by 10^18). * @return The current dUSDC and cUSDC interest rates. */ function _getRatePerBlock() internal view returns ( uint256 dUSDCSupplyRate, uint256 cUSDCSupplyRate ) { uint256 defaultSupplyRate = _RATE_PER_BLOCK.sub(_SCALING_FACTOR); cUSDCSupplyRate = _CUSDC.supplyRatePerBlock(); // NOTE: accrue on Compound first? dUSDCSupplyRate = ( defaultSupplyRate < cUSDCSupplyRate ? defaultSupplyRate : cUSDCSupplyRate ); } /** * @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 dUSDC and cUSDC 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 dUSDCExchangeRate, uint256 cUSDCExchangeRate, bool fullyAccrued ) = _getAccruedInterest(); if (!fullyAccrued) { // Update storage with dUSDC + cUSDC exchange rates as of the current block _blockLastUpdated = block.number; _dUSDCExchangeRate = dUSDCExchangeRate; _cUSDCExchangeRate = cUSDCExchangeRate; } _; } }
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":"cUSDCSurplus","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getSurplus","outputs":[{"internalType":"uint256","name":"cUSDCSurplus","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":"usdcBalance","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":"dUSDC","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"usdcToReceive","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"dUSDCBurned","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":"usdcToSupply","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"dUSDCMinted","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":"dUSDCInterestRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"dUSDCExchangeRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"dUSDCToBurn","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"usdcReceived","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
608060405234801561001057600080fd5b50604080517f095ea7b30000000000000000000000000000000000000000000000000000000081527339aa39c021dfbae8fac545936693ac917d5e756360048201526000196024820152905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163095ea7b39160448083019260209291908290030181600087803b15801561009957600080fd5b505af11580156100ad573d6000803e3d6000fd5b505050506040513d60208110156100c357600080fd5b50516100ce57600080fd5b43600355662386f26fc100006004908155604080517fbd6d894d00000000000000000000000000000000000000000000000000000000815290517339aa39c021dfbae8fac545936693ac917d5e75639263bd6d894d928082019260209290918290030181600087803b15801561014357600080fd5b505af1158015610157573d6000803e3d6000fd5b505050506040513d602081101561016d57600080fd5b5051600555611762806101816000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c610580565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b8565b610274610617565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061c565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610658565b61020c6106aa565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106bf565b61020c6004803603602081101561032057600080fd5b50356106da565b61014f6108e2565b61020c6004803603602081101561034557600080fd5b5035610904565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610afe565b610380610b3a565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b66565b61020c610b73565b61020c610b83565b61020c600480360360208110156103d457600080fd5b5035610b95565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051808201909152601d81527f446861726d612055534420436f696e202850726f746f74797065203029000000602082015290565b600061044d338484610d46565b5060015b92915050565b600090565b60025490565b600080600080610470610e32565b9250925092508061048a5743600355600483905560058290555b610492610f49565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa60048201526024810183905290519195507339aa39c021dfbae8fac545936693ac917d5e75639163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b505161057a576040805162461bcd60e51b815260206004820152601660248201527531aaa9a221903a3930b739b332b9103330b4b632b21760511b604482015290519081900360640190fd5b50505090565b60008060008061058e610e32565b925092509250806105a85743600355600483905560058290555b6105b0610f49565b935050505090565b60006105c5848484611044565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060c5761060c8533610607848763ffffffff61118616565b610d46565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610607908663ffffffff6111e316565b600080610663610e32565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069b908363ffffffff61124416565b816106a257fe5b049392505050565b60008060006106b761129d565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e8610e32565b925092509250806107025743600355600483905560058290555b60045461072d9061072187670de0b6b3a764000063ffffffff61124416565b9063ffffffff61135416565b935061073a3386866113be565b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505050506040513d60208110156107c057600080fd5b50511461080b576040805162461bcd60e51b815260206004820152601460248201527331aaa9a221903932b232b2b6903330b4b632b21760611b604482015290519081900360640190fd5b6040805163a9059cbb60e01b815233600482015260248101879052905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb9160448083019260209291908290030181600087803b15801561086557600080fd5b505af1158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b50516108da576040805162461bcd60e51b81526020600482015260156024820152742aa9a221903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b505050919050565b604080518082019091526008815267064555344432d70360c41b602082015290565b600080600080610912610e32565b9250925092508061092c5743600355600483905560058290555b60045461094b9061072187670de0b6b3a764000063ffffffff61124416565b604080516323b872dd60e01b815233600482015230602482015260448101889052905191955073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48916323b872dd916064808201926020929091908290030181600087803b1580156109af57600080fd5b505af11580156109c3573d6000803e3d6000fd5b505050506040513d60208110156109d957600080fd5b5051610a24576040805162461bcd60e51b81526020600482015260156024820152742aa9a221903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a8057600080fd5b505af1158015610a94573d6000803e3d6000fd5b505050506040513d6020811015610aaa57600080fd5b505114610af3576040805162461bcd60e51b815260206004820152601260248201527131aaa9a2219036b4b73a103330b4b632b21760711b604482015290519081900360640190fd5b6108da3386866114ce565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610607908663ffffffff61118616565b6000806000610b47610e32565b92509250925080610b615743600355600483905560058290555b505050565b600061044d338484611044565b6000610b7d61129d565b50919050565b6000610b8d610e32565b509092915050565b600080600080610ba3610e32565b92509250925080610bbd5743600355600483905560058290555b670de0b6b3a7640000610bdb6004548761124490919063ffffffff16565b81610be257fe5b049350610bf03385876113be565b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b505050506040513d6020811015610c7657600080fd5b505114610cc1576040805162461bcd60e51b815260206004820152601460248201527331aaa9a221903932b232b2b6903330b4b632b21760611b604482015290519081900360640190fd5b6040805163a9059cbb60e01b815233600482015260248101869052905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb9160448083019260209291908290030181600087803b15801561086557600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d8b5760405162461bcd60e51b81526004018080602001828103825260248152602001806116e26024913960400191505060405180910390fd5b6001600160a01b038216610dd05760405162461bcd60e51b815260040180806020018281038252602281526020018061167a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e545760045493506005549250610f43565b6000610e68670de0b6b8156bd14b836115ae565b90507339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b5051600554909450600090610f0a9061072187670de0b6b3a764000063ffffffff61124416565b9050670de0b6b3a7640000610f36828411610f255783610f27565b825b6004549063ffffffff61124416565b81610f3d57fe5b04955050505b50909192565b600080610f856001670de0b6b3a7640000610f7160045460025461124490919063ffffffff16565b81610f7857fe5b049063ffffffff6111e316565b60408051633af9e66960e01b8152306004820152905191925060009161101b9184917339aa39c021dfbae8fac545936693ac917d5e756391633af9e66991602480830192602092919082900301818987803b158015610fe357600080fd5b505af1158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b50519063ffffffff61118616565b60055490915061103d9061072183670de0b6b3a764000063ffffffff61124416565b9250505090565b6001600160a01b0383166110895760405162461bcd60e51b81526004018080602001828103825260258152602001806116bd6025913960400191505060405180910390fd5b6001600160a01b0382166110ce5760405162461bcd60e51b81526004018080602001828103825260238152602001806116576023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f7908263ffffffff61118616565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461112c908263ffffffff6111e316565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111dd576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561123d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261125357506000610451565b8282028284828161126057fe5b041461123d5760405162461bcd60e51b815260040180806020018281038252602181526020018061169c6021913960400191505060405180910390fd5b600080806112c1670de0b6b8156bd14b670de0b6b3a764000063ffffffff61118616565b90507339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561131057600080fd5b505afa158015611324573d6000803e3d6000fd5b505050506040513d602081101561133a57600080fd5b5051915081811061134b578161134d565b805b9250509091565b60008082116113aa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113b557fe5b04949350505050565b6001600160a01b038316600090815260208190526040902054818110156114165760405162461bcd60e51b81526004018080602001828103825260288152602001806117066028913960400191505060405180910390fd5b600254611429908363ffffffff61118616565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114e1908263ffffffff6111e316565b6002556001600160a01b03831660009081526020819052604090205461150d908263ffffffff6111e316565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115c657670de0b6b3a76400006115c8565b825b90506002820491505b811561045157670de0b6b3a76400006116086706f05b59d3b200006115fc868063ffffffff61124416565b9063ffffffff6111e316565b8161160f57fe5b049250600282061561164b57670de0b6b3a76400006116406706f05b59d3b200006115fc868563ffffffff61124416565b8161164757fe5b0490505b6002820491506115d156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a723158207359847f22a54b7d46cf796bf2b615b0bf8e8444dedc74c054db867b034d705664736f6c634300050b0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c610580565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b8565b610274610617565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061c565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610658565b61020c6106aa565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106bf565b61020c6004803603602081101561032057600080fd5b50356106da565b61014f6108e2565b61020c6004803603602081101561034557600080fd5b5035610904565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610afe565b610380610b3a565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b66565b61020c610b73565b61020c610b83565b61020c600480360360208110156103d457600080fd5b5035610b95565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d1b565b60408051808201909152601d81527f446861726d612055534420436f696e202850726f746f74797065203029000000602082015290565b600061044d338484610d46565b5060015b92915050565b600090565b60025490565b600080600080610470610e32565b9250925092508061048a5743600355600483905560058290555b610492610f49565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa60048201526024810183905290519195507339aa39c021dfbae8fac545936693ac917d5e75639163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b505161057a576040805162461bcd60e51b815260206004820152601660248201527531aaa9a221903a3930b739b332b9103330b4b632b21760511b604482015290519081900360640190fd5b50505090565b60008060008061058e610e32565b925092509250806105a85743600355600483905560058290555b6105b0610f49565b935050505090565b60006105c5848484611044565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060c5761060c8533610607848763ffffffff61118616565b610d46565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610607908663ffffffff6111e316565b600080610663610e32565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069b908363ffffffff61124416565b816106a257fe5b049392505050565b60008060006106b761129d565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e8610e32565b925092509250806107025743600355600483905560058290555b60045461072d9061072187670de0b6b3a764000063ffffffff61124416565b9063ffffffff61135416565b935061073a3386866113be565b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505050506040513d60208110156107c057600080fd5b50511461080b576040805162461bcd60e51b815260206004820152601460248201527331aaa9a221903932b232b2b6903330b4b632b21760611b604482015290519081900360640190fd5b6040805163a9059cbb60e01b815233600482015260248101879052905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb9160448083019260209291908290030181600087803b15801561086557600080fd5b505af1158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b50516108da576040805162461bcd60e51b81526020600482015260156024820152742aa9a221903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b505050919050565b604080518082019091526008815267064555344432d70360c41b602082015290565b600080600080610912610e32565b9250925092508061092c5743600355600483905560058290555b60045461094b9061072187670de0b6b3a764000063ffffffff61124416565b604080516323b872dd60e01b815233600482015230602482015260448101889052905191955073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48916323b872dd916064808201926020929091908290030181600087803b1580156109af57600080fd5b505af11580156109c3573d6000803e3d6000fd5b505050506040513d60208110156109d957600080fd5b5051610a24576040805162461bcd60e51b81526020600482015260156024820152742aa9a221903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a8057600080fd5b505af1158015610a94573d6000803e3d6000fd5b505050506040513d6020811015610aaa57600080fd5b505114610af3576040805162461bcd60e51b815260206004820152601260248201527131aaa9a2219036b4b73a103330b4b632b21760711b604482015290519081900360640190fd5b6108da3386866114ce565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610607908663ffffffff61118616565b6000806000610b47610e32565b92509250925080610b615743600355600483905560058290555b505050565b600061044d338484611044565b6000610b7d61129d565b50919050565b6000610b8d610e32565b509092915050565b600080600080610ba3610e32565b92509250925080610bbd5743600355600483905560058290555b670de0b6b3a7640000610bdb6004548761124490919063ffffffff16565b81610be257fe5b049350610bf03385876113be565b60007339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b505050506040513d6020811015610c7657600080fd5b505114610cc1576040805162461bcd60e51b815260206004820152601460248201527331aaa9a221903932b232b2b6903330b4b632b21760611b604482015290519081900360640190fd5b6040805163a9059cbb60e01b815233600482015260248101869052905173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489163a9059cbb9160448083019260209291908290030181600087803b15801561086557600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d8b5760405162461bcd60e51b81526004018080602001828103825260248152602001806116e26024913960400191505060405180910390fd5b6001600160a01b038216610dd05760405162461bcd60e51b815260040180806020018281038252602281526020018061167a6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e545760045493506005549250610f43565b6000610e68670de0b6b8156bd14b836115ae565b90507339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb957600080fd5b505af1158015610ecd573d6000803e3d6000fd5b505050506040513d6020811015610ee357600080fd5b5051600554909450600090610f0a9061072187670de0b6b3a764000063ffffffff61124416565b9050670de0b6b3a7640000610f36828411610f255783610f27565b825b6004549063ffffffff61124416565b81610f3d57fe5b04955050505b50909192565b600080610f856001670de0b6b3a7640000610f7160045460025461124490919063ffffffff16565b81610f7857fe5b049063ffffffff6111e316565b60408051633af9e66960e01b8152306004820152905191925060009161101b9184917339aa39c021dfbae8fac545936693ac917d5e756391633af9e66991602480830192602092919082900301818987803b158015610fe357600080fd5b505af1158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b50519063ffffffff61118616565b60055490915061103d9061072183670de0b6b3a764000063ffffffff61124416565b9250505090565b6001600160a01b0383166110895760405162461bcd60e51b81526004018080602001828103825260258152602001806116bd6025913960400191505060405180910390fd5b6001600160a01b0382166110ce5760405162461bcd60e51b81526004018080602001828103825260238152602001806116576023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f7908263ffffffff61118616565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461112c908263ffffffff6111e316565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111dd576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561123d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261125357506000610451565b8282028284828161126057fe5b041461123d5760405162461bcd60e51b815260040180806020018281038252602181526020018061169c6021913960400191505060405180910390fd5b600080806112c1670de0b6b8156bd14b670de0b6b3a764000063ffffffff61118616565b90507339aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561131057600080fd5b505afa158015611324573d6000803e3d6000fd5b505050506040513d602081101561133a57600080fd5b5051915081811061134b578161134d565b805b9250509091565b60008082116113aa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113b557fe5b04949350505050565b6001600160a01b038316600090815260208190526040902054818110156114165760405162461bcd60e51b81526004018080602001828103825260288152602001806117066028913960400191505060405180910390fd5b600254611429908363ffffffff61118616565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114e1908263ffffffff6111e316565b6002556001600160a01b03831660009081526020819052604090205461150d908263ffffffff6111e316565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115c657670de0b6b3a76400006115c8565b825b90506002820491505b811561045157670de0b6b3a76400006116086706f05b59d3b200006115fc868063ffffffff61124416565b9063ffffffff6111e316565b8161160f57fe5b049250600282061561164b57670de0b6b3a76400006116406706f05b59d3b200006115fc868563ffffffff61124416565b8161164757fe5b0490505b6002820491506115d156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a723158207359847f22a54b7d46cf796bf2b615b0bf8e8444dedc74c054db867b034d705664736f6c634300050b0032
Deployed Bytecode Sourcemap
3858:19943:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3858:19943:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15563: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;15563:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10332:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10332:140:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16206:105;;;:::i;:::-;;;;;;;;;;;;;;;;14519:87;;;:::i;8994:322::-;;;:::i;13138:196::-;;;:::i;10881:336::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10881:336:0;;;;;;;;;;;;;;;;;:::i;15987:79::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11539:222;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11539:222:0;;;;;;;;:::i;12576:394::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12576:394:0;-1:-1:-1;;;;;12576:394:0;;:::i;14191:217::-;;;:::i;14821:113::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14821:113:0;-1:-1:-1;;;;;14821:113:0;;:::i;8146:656::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8146:656:0;;:::i;15761:83::-;;;:::i;6097:687::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6097:687:0;;:::i;12086:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12086:232:0;;;;;;;;:::i;9462:111::-;;;:::i;:::-;;9866:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9866:148:0;;;;;;;;:::i;13870:134::-;;;:::i;13491:210::-;;;:::i;7103:646::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7103:646:0;;:::i;15318:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15318:130:0;;;;;;;;;;:::i;15563:79::-;15631:5;;;;;;;;;;;;;;;;;15563:79;:::o;10332:140::-;10399:4;10412:36;10421:10;10433:7;10442:5;10412:8;:36::i;:::-;-1:-1:-1;10462:4:0;10332:140;;;;;:::o;16206:105::-;16251:15;;16206:105::o;14519:87::-;14588:12;;14519:87;:::o;8994:322::-;9043:20;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;9172:13;:11;:13::i;:::-;9246:37;;;-1:-1:-1;;;9246:37:0;;4950:42;9246:37;;;;;;;;;;;;9157:28;;-1:-1:-1;4664:42:0;;9246:15;;:37;;;;;;;;;;;;;;;-1:-1:-1;4664:42:0;9246:37;;;5:2:-1;;;;30:1;27;20:12;5:2;9246:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9246:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9246:37:0;9238:72;;;;;-1:-1:-1;;;9238:72:0;;;;;;;;;;;;-1:-1:-1;;;9238:72:0;;;;;;;;;;;;;;;8994:322;;;;:::o;13138:196::-;13186:20;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;13315:13;:11;:13::i;:::-;13300:28;;13138:196;;;;:::o;10881:336::-;10982:4;10995:36;11005:6;11013:9;11024:6;10995:9;:36::i;:::-;-1:-1:-1;;;;;11058:19:0;;11038:17;11058:19;;;:11;:19;;;;;;;;11078:10;11058:31;;;;;;;;-1:-1:-1;;11100:24:0;;11096:98;;11135:51;11144:6;11152:10;11164:21;:9;11178:6;11164:21;:13;:21;:::i;:::-;11135:8;:51::i;:::-;-1:-1:-1;11207:4:0;;10881:336;-1:-1:-1;;;;10881:336:0:o;15987:79::-;4405:1;15987:79;:::o;11539:222::-;11661:10;11631:4;11682:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11682:32:0;;;;;;;;;;11631:4;;11644:93;;11673:7;;11682:48;;11719:10;11682:48;:36;:48;:::i;12576:394::-;12650:19;12755:25;12786:21;:19;:21::i;:::-;-1:-1:-1;;;;;;;12905:18:0;;:9;:18;;;;;;;;;;;12754:53;;-1:-1:-1;4475:4:0;;12905:41;;12754:53;12905:41;:22;:41;:::i;:::-;:59;;;;;;;12576:394;-1:-1:-1;;;12576:394:0:o;14191:217::-;14243:18;14271:25;14298;14327:18;:16;:18::i;:::-;14365:37;;14191:217;-1:-1:-1;;;14191:217:0:o;14821:113::-;-1:-1:-1;;;;;14910:18:0;14880:13;14910:18;;;;;;;;;;;;14821:113::o;8146:656::-;8231:19;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;8374:18;;8335:58;;:34;:13;4475:4;8335:34;:17;:34;:::i;:::-;:38;:58;:38;:58;:::i;:::-;8321:72;;8425:45;8431:10;8443:13;8458:11;8425:5;:45::i;:::-;4591:1;4664:42;-1:-1:-1;;;;;8577:23:0;;8601:13;8577:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8577:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8577:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8577:38:0;:59;8561:113;;;;;-1:-1:-1;;;8561:113:0;;;;;;;;;;;;-1:-1:-1;;;8561:113:0;;;;;;;;;;;;;;;8729:41;;;-1:-1:-1;;;8729:41:0;;8744:10;8729:41;;;;;;;;;;;;4791:42;;8729:14;;:41;;;;;;;;;;;;;;-1:-1:-1;4791:42:0;8729:41;;;5:2:-1;;;;30:1;27;20:12;5:2;8729:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8729:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8729:41:0;8721:75;;;;;-1:-1:-1;;;8721:75:0;;;;;;;;;;;;-1:-1:-1;;;8721:75:0;;;;;;;;;;;;;;;8146:656;;;;;;:::o;15761:83::-;15831:7;;;;;;;;;;;;-1:-1:-1;;;15831:7:0;;;;15761:83;:::o;6097:687::-;6169:19;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;6309:18;;6271:57;;:33;:12;4475:4;6271:33;:16;:33;:::i;:57::-;6429:59;;;-1:-1:-1;;;6429:59:0;;6448:10;6429:59;;;;6468:4;6429:59;;;;;;;;;;;;6257:71;;-1:-1:-1;4791:42:0;;6429:18;;:59;;;;;;;;;;;;;;;-1:-1:-1;4791:42:0;6429:59;;;5:2:-1;;;;30:1;27;20:12;5:2;6429:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6429:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6429:59:0;6413:114;;;;;-1:-1:-1;;;6413:114:0;;;;;;;;;;;;-1:-1:-1;;;6413:114:0;;;;;;;;;;;;;;;4591:1;4664:42;-1:-1:-1;;;;;6623:11:0;;6635:12;6623:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6623:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6623:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6623:25:0;:46;6615:77;;;;;-1:-1:-1;;;6615:77:0;;;;;;;;;;;;-1:-1:-1;;;6615:77:0;;;;;;;;;;;;;;;6734:44;6740:10;6752:12;6766:11;6734:5;:44::i;12086:232::-;12213:10;12183:4;12234:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12234:32:0;;;;;;;;;;12183:4;;12196:98;;12225:7;;12234:53;;12271:15;12234:53;:36;:53;:::i;9462:111::-;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;9462:111;;;:::o;9866:148::-;9937:4;9950:40;9960:10;9972:9;9983:6;9950:9;:40::i;13870:134::-;13923:25;13980:18;:16;:18::i;:::-;-1:-1:-1;13957:41:0;13870:134;-1:-1:-1;13870:134:0:o;13491:210::-;13540:25;13674:21;:19;:21::i;:::-;-1:-1:-1;13650:45:0;;13491:210;-1:-1:-1;;13491:210:0:o;7103:646::-;7176:20;23427:25;23454;23481:17;23508:21;:19;:21::i;:::-;23418:111;;;;;;23543:12;23538:245;;23669:12;23649:17;:32;23690:18;:38;;;23737:18;:38;;;23538:245;4475:4;7290:35;7306:18;;7290:11;:15;;:35;;;;:::i;:::-;:53;;;;;;7275:68;;7375:44;7381:10;7393:12;7407:11;7375:5;:44::i;:::-;4591:1;4664:42;-1:-1:-1;;;;;7526:23:0;;7550:12;7526:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7526:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7526:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7526:37:0;:58;7510:112;;;;;-1:-1:-1;;;7510:112:0;;;;;;;;;;;;-1:-1:-1;;;7510:112:0;;;;;;;;;;;;;;;7677:40;;;-1:-1:-1;;;7677:40:0;;7692:10;7677:40;;;;;;;;;;;;4791:42;;7677:14;;:40;;;;;;;;;;;;;;-1:-1:-1;4791:42:0;7677:40;;;5:2:-1;;;;30:1;27;20:12;15318:130:0;-1:-1:-1;;;;;15415:18:0;;;15392:7;15415:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15318:130::o;18917:317::-;-1:-1:-1;;;;;19006:19:0;;18998:68;;;;-1:-1:-1;;;18998:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19081:21:0;;19073:68;;;;-1:-1:-1;;;19073:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19150:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19197:31;;;;;;;;;;;;;;;;;18917:317;;;:::o;19660:1245::-;19932:17;;19726:25;;;;19917:12;:32;19972:27;;;20091:809;;;;20138:18;;20118:38;;20185:18;;20165:38;;20091:809;;;20283:23;20309:45;4224:19;20331:22;20309:4;:45::i;:::-;20283:71;;4664:42;-1:-1:-1;;;;;20439:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20439:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20439:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20439:28:0;20626:18;;20439:28;;-1:-1:-1;20548:21:0;;20583:62;;:38;20439:28;4475:4;20583:38;:21;:38;:::i;:62::-;20548:106;;4475:4;20767:107;20818:13;20800:15;:31;:65;;20850:15;20800:65;;;20834:13;20800:65;20767:18;;;:107;:22;:107;:::i;:::-;:125;;;;;;20747:145;;20091:809;;;19660:1245;;;;:::o;21089:597::-;21141:20;21244:23;21270:77;21345:1;4475:4;21279:36;21296:18;;21279:12;;:16;;:36;;;;:::i;:::-;:54;;;;;;;21270:77;:74;:77;:::i;:::-;21469:41;;;-1:-1:-1;;;21469:41:0;;21504:4;21469:41;;;;;;21244:103;;-1:-1:-1;21438:19:0;;21469:62;;21244:103;;4664:42;;21469:26;;:41;;;;;;;;;;;;;;21438:19;4664:42;21469:41;;;5:2:-1;;;;30:1;27;20:12;5:2;21469:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21469:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21469:41:0;;:62;:45;:62;:::i;:::-;21661:18;;21438:100;;-1:-1:-1;21624:56:0;;:32;21438:100;4475:4;21624:32;:15;:32;:::i;:56::-;21609:71;;21089:597;;;:::o;18163:407::-;-1:-1:-1;;;;;18257:20:0;;18249:70;;;;-1:-1:-1;;;18249:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18334:23:0;;18326:71;;;;-1:-1:-1;;;18326:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18426:17:0;;:9;:17;;;;;;;;;;;:29;;18448:6;18426:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18406:17:0;;;:9;:17;;;;;;;;;;;:49;;;;18485:20;;;;;;;:32;;18510:6;18485:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18462:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18529:35;;;;;;;18462:20;;18529:35;;;;;;;;;;;;;18163: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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21887:389;21944:23;;;22033:36;4224:19;4475:4;22033:36;:19;:36;:::i;:::-;22005:64;;4664:42;-1:-1:-1;;;;;22094:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22094:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22094:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22094:27:0;;-1:-1:-1;22190:35:0;;;:73;;22248:15;22190:73;;;22228:17;22190:73;22163:107;;21887:389;;;:::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;17352:464::-;-1:-1:-1;;;;;17464:18:0;;17435:26;17464:18;;;;;;;;;;;17505:28;;;;17489:95;;;;-1:-1:-1;;;17489:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17608:12;;:24;;17625:6;17608:24;:16;:24;:::i;:::-;17593:12;:39;-1:-1:-1;;;;;17639:18:0;;:9;:18;;;;;;;;;;;17660:27;;;17639:48;;17727:37;;;;;;;17639:9;;:18;17727:37;;;;;;;;;;;17776:34;;;-1:-1:-1;;;;;17776:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17352:464;;;;:::o;16685:281::-;16783:12;;:24;;16800:6;16783:24;:16;:24;:::i;:::-;16768:12;:39;-1:-1:-1;;;;;16835:18:0;;:9;:18;;;;;;;;;;;:30;;16858:6;16835:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;16814:18:0;;:9;:18;;;;;;;;;;;;:51;;;;16879:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;16923:37;;;;;;;;-1:-1:-1;;;;;16923:37:0;;;16940:1;;16923:37;;;;;;;;;16685:281;;;:::o;22657:430::-;22726:16;22770:1;22762:5;:9;:42;;4475:4;22762:42;;;22779:7;22762:42;22751:53;-1:-1:-1;22827:1:0;22818:10;;;;22813:269;22830:10;;22813:269;;4475:4;22873:51;4536:4;22874:20;22886:7;;22874:20;:11;:20;:::i;:::-;22873:26;:51;:26;:51;:::i;:::-;:69;;;;;;;-1:-1:-1;22965:1:0;22957:5;:9;:14;22953:122;;4475:4;22995:52;4536:4;22996:21;:7;23008:8;22996:21;:11;:21;:::i;22995:52::-;:70;;;;;;22984:81;;22953:122;22851:1;22842:10;;;;22813:269;
Swarm Source
bzzr://7359847f22a54b7d46cf796bf2b615b0bf8e8444dedc74c054db867b034d7056
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.024738 | 47.9705 | $1.19 |
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.