Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
CyanWalletLogic
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import { ICyanConduit } from "../interfaces/conduit/ICyanConduit.sol"; import { AddressProvider } from "../main/AddressProvider.sol"; import "../thirdparty/ICryptoPunk.sol"; import "../interfaces/core/IWallet.sol"; import "../interfaces/main/ICyanPeerPlan.sol"; import "./payment-plan/PaymentPlanTypes.sol"; library CyanWalletLogic { AddressProvider private constant addressProvider = AddressProvider(0xCF9A19D879769aDaE5e4f31503AAECDa82568E55); /** * @notice Allows operators to transfer out non locked tokens. * Note: Can only transfer if token is not locked. * @param cyanWalletAddress Cyan Wallet address * @param to Receiver address * @param item Transferring item */ function transferNonLockedItem( address cyanWalletAddress, address to, Item calldata item ) external { _transferNonLockedItem(cyanWalletAddress, to, item.contractAddress, item.tokenId, item.amount, item.itemType); } /** * @notice Allows operators to transfer out non locked tokens. * Note: Can only transfer if token is not locked. * @param cyanWalletAddress Cyan Wallet address * @param to Receiver address * @param item Transferring item */ function transferNonLockedItem( address cyanWalletAddress, address to, ICyanPeerPlan.Item calldata item ) external { _transferNonLockedItem(cyanWalletAddress, to, item.contractAddress, item.tokenId, item.amount, item.itemType); } function _transferNonLockedItem( address cyanWalletAddress, address to, address collection, uint256 tokenId, uint256 amount, uint8 itemType ) private { IWallet wallet = IWallet(cyanWalletAddress); if (itemType == 1) { // ERC721 wallet.executeModule( abi.encodeWithSelector(IWallet.transferNonLockedERC721.selector, collection, tokenId, to) ); } else if (itemType == 2) { // ERC1155 wallet.executeModule( abi.encodeWithSelector(IWallet.transferNonLockedERC1155.selector, collection, tokenId, amount, to) ); } else if (itemType == 3) { // CryptoPunks wallet.executeModule(abi.encodeWithSelector(IWallet.transferNonLockedCryptoPunk.selector, tokenId, to)); } else { revert InvalidItem(); } } /** * @notice Transfers token to CyanWallet and locks it * @param from From address * @param cyanWalletAddress Cyan Wallet address * @param item Transferring item */ function transferItemAndLock( address from, address cyanWalletAddress, Item calldata item ) external { _transferItemAndLock(from, cyanWalletAddress, item.contractAddress, item.tokenId, item.amount, item.itemType); } /** * @notice Transfers token to CyanWallet and locks it * @param from From address * @param cyanWalletAddress Cyan Wallet address * @param item Transferring item */ function transferItemAndLock( address from, address cyanWalletAddress, ICyanPeerPlan.Item calldata item ) external { _transferItemAndLock(from, cyanWalletAddress, item.contractAddress, item.tokenId, item.amount, item.itemType); } function _transferItemAndLock( address from, address cyanWalletAddress, address collection, uint256 tokenId, uint256 amount, uint8 itemType ) private { if (itemType == 3) { // CryptoPunks ICryptoPunk cryptoPunkContract = ICryptoPunk(collection); if (cryptoPunkContract.punkIndexToAddress(tokenId) != from) revert InvalidItem(); cryptoPunkContract.buyPunk{ value: 0 }(tokenId); cryptoPunkContract.transferPunk(cyanWalletAddress, tokenId); } else { ICyanConduit conduit = ICyanConduit(addressProvider.addresses("CYAN_CONDUIT")); if (itemType == 1) { conduit.transferERC721(from, cyanWalletAddress, collection, tokenId); } else if (itemType == 2) { conduit.transferERC1155(from, cyanWalletAddress, collection, tokenId, amount); } else { revert InvalidItem(); } } _setLockState(cyanWalletAddress, collection, tokenId, amount, itemType, true); } /** * @notice Update locking status of a token in Cyan Wallet * @param cyanWalletAddress Cyan Wallet address * @param item Locking/unlocking item * @param state Token will be locked if true */ function setLockState( address cyanWalletAddress, Item calldata item, bool state ) public { _setLockState(cyanWalletAddress, item.contractAddress, item.tokenId, item.amount, item.itemType, state); } /** * @notice Update locking status of a token in Cyan Wallet * @param cyanWalletAddress Cyan Wallet address * @param item Locking/unlocking item * @param state Token will be locked if true */ function setLockState( address cyanWalletAddress, ICyanPeerPlan.Item calldata item, bool state ) public { _setLockState(cyanWalletAddress, item.contractAddress, item.tokenId, item.amount, item.itemType, state); } function _setLockState( address cyanWalletAddress, address collection, uint256 tokenId, uint256 amount, uint8 itemType, bool state ) private { IWallet wallet = IWallet(cyanWalletAddress); if (itemType == 1) { // ERC721 wallet.executeModule( abi.encodeWithSelector(IWallet.setLockedERC721Token.selector, collection, tokenId, state) ); } else if (itemType == 2) { // ERC1155 wallet.executeModule( abi.encodeWithSelector( state ? IWallet.increaseLockedERC1155Token.selector : IWallet.decreaseLockedERC1155Token.selector, collection, tokenId, amount ) ); } else if (itemType == 3) { // CryptoPunks wallet.executeModule(abi.encodeWithSelector(IWallet.setLockedCryptoPunk.selector, tokenId, state)); } else { revert InvalidItem(); } } /** * @notice Triggers Cyan Wallet's autoPay method * @param cyanWalletAddress Cyan Wallet address * @param planId Payment plan ID * @param amount Pay amount for the plan * @param autoRepayStatus Auto repayment status */ function executeAutoPay( address cyanWalletAddress, uint256 planId, uint256 amount, uint8 autoRepayStatus ) external { IWallet(cyanWalletAddress).executeModule( abi.encodeWithSelector(IWallet.autoPay.selector, planId, amount, autoRepayStatus) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; enum ConduitItemType { NATIVE, // unused ERC20, ERC721, ERC1155 } struct ConduitTransfer { ConduitItemType itemType; address collection; address from; address to; uint256 identifier; uint256 amount; } struct ConduitBatch1155Transfer { address collection; address from; address to; uint256[] ids; uint256[] amounts; } interface ICyanConduit { error ChannelClosed(address channel); error ChannelStatusAlreadySet(address channel, bool isOpen); error InvalidItemType(); error InvalidAdmin(); event ChannelUpdated(address indexed channel, bool open); function execute(ConduitTransfer[] calldata transfers) external returns (bytes4 magicValue); function executeBatch1155(ConduitBatch1155Transfer[] calldata batch1155Transfers) external returns (bytes4 magicValue); function executeWithBatch1155( ConduitTransfer[] calldata standardTransfers, ConduitBatch1155Transfer[] calldata batch1155Transfers ) external returns (bytes4 magicValue); function transferERC20( address from, address to, address token, uint256 amount ) external; function transferERC721( address from, address to, address collection, uint256 tokenId ) external; function transferERC1155( address from, address to, address collection, uint256 tokenId, uint256 amount ) external; function updateChannel(address channel, bool isOpen) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import { Item } from "../../main/payment-plan/PaymentPlanTypes.sol"; interface IWallet { function executeModule(bytes memory) external returns (bytes memory); function transferNonLockedERC721( address, uint256, address ) external; function transferNonLockedERC1155( address, uint256, uint256, address ) external; function transferNonLockedCryptoPunk(uint256, address) external; function setLockedERC721Token( address, uint256, bool ) external; function increaseLockedERC1155Token( address, uint256, uint256 ) external; function decreaseLockedERC1155Token( address, uint256, uint256 ) external; function setLockedCryptoPunk(uint256, bool) external; function autoPay( uint256, uint256, uint8 ) external; function earlyUnwindOpensea( uint256, uint256, Item memory, bytes memory ) external; function earlyUnwindCyan(uint256, address) external; function isLockedNFT(address, uint256) external view returns (bool); function repayBendDaoLoan( address collection, uint256 tokenId, uint256 amount, address currency ) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface ICyanPeerPlan { enum PlanStatus { NONE, ACTIVE, DEFAULTED, COMPLETED, LIQUIDATED } struct LenderSignature { uint256 signedDate; uint256 expiryDate; uint32 maxUsageCount; bool extendable; bytes signature; } struct Plan { uint256 amount; address lenderAddress; address currencyAddress; uint32 interestRate; uint32 serviceFeeRate; uint32 term; } struct PaymentPlan { Plan plan; uint256 dueDate; address cyanWalletAddress; PlanStatus status; bool extendable; } struct Item { uint256 amount; uint256 tokenId; address contractAddress; // 1 -> ERC721 // 2 -> ERC1155 // 3 -> CryptoPunks uint8 itemType; bytes collectionSignature; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; /// @title Cyan AddressProvider contract /// @author Bulgantamir Gankhuyag - <[email protected]> /// @author Naranbayar Uuganbayar - <[email protected]> contract AddressProvider is Ownable { error AddressNotFound(bytes32 id); event AddressSet(bytes32 id, address newAddress); mapping(bytes32 => address) public addresses; constructor(address owner) { transferOwnership(owner); } // @dev Sets an address for an id replacing the address saved in the addresses map // @param id The id // @param newAddress The address to set function setAddress(bytes32 id, address newAddress) external onlyOwner { addresses[id] = newAddress; emit AddressSet(id, newAddress); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; // DataTypes enum PawnCreateType { REGULAR, BEND_DAO, REFINANCE } enum PaymentPlanStatus { BNPL_CREATED, BNPL_FUNDED, BNPL_ACTIVE, BNPL_DEFAULTED, BNPL_REJECTED, BNPL_COMPLETED, BNPL_LIQUIDATED, PAWN_ACTIVE, PAWN_DEFAULTED, PAWN_COMPLETED, PAWN_LIQUIDATED } struct Plan { uint256 amount; uint32 downPaymentPercent; uint32 interestRate; uint32 serviceFeeRate; uint32 term; uint8 totalNumberOfPayments; uint8 counterPaidPayments; uint8 autoRepayStatus; } struct PaymentPlan { Plan plan; uint256 createdDate; address cyanWalletAddress; PaymentPlanStatus status; } struct Item { uint256 amount; uint256 tokenId; address contractAddress; address cyanVaultAddress; // 1 -> ERC721 // 2 -> ERC1155 // 3 -> CryptoPunks uint8 itemType; } struct PaymentAmountInfo { uint256 loanAmount; uint256 interestAmount; uint256 serviceAmount; } // Errors error InvalidSender(); error InvalidBlockNumber(); error InvalidSignature(); error InvalidServiceFeeRate(); error InvalidTokenPrice(); error InvalidInterestRate(); error InvalidDownPaymentPercent(); error InvalidDownPayment(); error InvalidAmount(); error InvalidTerm(); error InvalidPaidCount(); error InvalidStage(); error InvalidAddress(); error InvalidAutoRepaymentDate(); error InvalidAutoRepaymentStatus(); error InvalidTotalNumberOfPayments(); error InvalidReviveDate(); error InvalidItem(); error InvalidBaseDiscountRate(); error InvalidApeCoinPlan(); error InvalidBendDaoPlan(); error InvalidCurrency(); error InvalidCyanBuyer(); error InvalidSelector(); error EthTransferFailed(); error PaymentPlanAlreadyExists(); error PaymentPlanNotFound();
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; interface ICryptoPunk { function punkIndexToAddress(uint256) external view returns (address); function buyPunk(uint256) external payable; function transferPunk(address, uint256) external; function offerPunkForSale(uint256, uint256) external; function offerPunkForSaleToAddress( uint256, uint256, address ) external; function acceptBidForPunk(uint256, uint256) external; }
{ "optimizer": { "enabled": true, "runs": 500 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract Creation Code
610c3561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100875760003560e01c8063760bb18e11610065578063760bb18e146100ee5780637e7d7ed41461010e578063f8d18ae21461012e578063fff7406b1461014e57600080fd5b80630b7aa22a1461008c5780632e96aa8e146100ae57806330b760d9146100ce575b600080fd5b81801561009857600080fd5b506100ac6100a73660046108dd565b61016e565b005b8180156100ba57600080fd5b506100ac6100c936600461093b565b6101a4565b8180156100da57600080fd5b506100ac6100e9366004610983565b610266565b8180156100fa57600080fd5b506100ac610109366004610983565b610292565b81801561011a57600080fd5b506100ac6101293660046109f5565b6102c3565b81801561013a57600080fd5b506100ac6101493660046108dd565b6102f4565b81801561015a57600080fd5b506100ac610169366004610a32565b610320565b61019f83836101836060850160408601610a89565b6020850135853561019a60a0880160808901610aad565b61034b565b505050565b60408051602481018590526044810184905260ff831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03166358d9dd0d60e11b179052905163152760d960e31b81526001600160a01b0386169163a93b06c8916102189190600401610aec565b6000604051808303816000875af1158015610237573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261025f9190810190610b35565b5050505050565b61019f838361027b6060850160408601610a89565b6020850135853561019a6080880160608901610aad565b61019f83836102a76060850160408601610a89565b602085013585356102be6080880160608901610aad565b6104e7565b61019f836102d76060850160408601610a89565b602085013585356102ee60a0880160808901610aad565b866107c9565b61019f83836103096060850160408601610a89565b602085013585356102be60a0880160808901610aad565b61019f836103346060850160408601610a89565b602085013585356102ee6080880160608901610aad565b8560ff8216600103610439576040516001600160a01b03868116602483015260448201869052878116606483015282169063a93b06c890638cf7558960e01b906084015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e084901b90921682526103ec91600401610aec565b6000604051808303816000875af115801561040b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104339190810190610b35565b506104de565b8160ff16600203610487576040516001600160a01b0386811660248301526044820186905260648201859052878116608483015282169063a93b06c890632a1d8e8960e21b9060a40161038f565b8160ff166003036104c557604051602481018590526001600160a01b03878116604483015282169063a93b06c89062fbe9d560e61b9060640161038f565b6040516327b3518960e11b815260040160405180910390fd5b50505050505050565b8060ff1660030361064f57604051630b02f02d60e31b81526004810184905284906001600160a01b038881169190831690635817816890602401602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190610be2565b6001600160a01b031614610589576040516327b3518960e11b815260040160405180910390fd5b60405163104c9fd360e31b8152600481018590526001600160a01b03821690638264fe98906000906024016000604051808303818588803b1580156105cd57600080fd5b505af11580156105e1573d6000803e3d6000fd5b50506040516322dca8bb60e21b81526001600160a01b038a811660048301526024820189905285169350638b72a2ec92506044019050600060405180830381600087803b15801561063157600080fd5b505af1158015610645573d6000803e3d6000fd5b50505050506107b2565b60405163699f200f60e01b81526b10d6505397d0d3d39115525560a21b600482015260009073cf9a19d879769adae5e4f31503aaecda82568e559063699f200f90602401602060405180830381865afa1580156106b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d49190610be2565b90508160ff1660010361075957604051633c4fc9fb60e11b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905282169063789f93f6906084015b600060405180830381600087803b15801561073c57600080fd5b505af1158015610750573d6000803e3d6000fd5b505050506107b0565b8160ff166002036104c557604051633a54a01760e11b81526001600160a01b0388811660048301528781166024830152868116604483015260648201869052608482018590528216906374a9402e9060a401610722565b505b6107c1858585858560016107c9565b505050505050565b8560ff8316600103610811576040516001600160a01b03878116602483015260448201879052831515606483015282169063a93b06c8906324d2eb4160e01b9060840161038f565b8260ff1660020361086e57806001600160a01b031663a93b06c88361083d5763865d533f60e01b610846565b63f13304c560e01b5b6040516001600160a01b038a166024820152604481018990526064810188905260840161038f565b8260ff166003036104c5576040516024810186905282151560448201526001600160a01b0382169063a93b06c89063133e8e6d60e31b9060640161038f565b6001600160a01b03811681146108c257600080fd5b50565b600060a082840312156108d757600080fd5b50919050565b600080600060e084860312156108f257600080fd5b83356108fd816108ad565b9250602084013561090d816108ad565b915061091c85604086016108c5565b90509250925092565b803560ff8116811461093657600080fd5b919050565b6000806000806080858703121561095157600080fd5b843561095c816108ad565b9350602085013592506040850135915061097860608601610925565b905092959194509250565b60008060006060848603121561099857600080fd5b83356109a3816108ad565b925060208401356109b3816108ad565b9150604084013567ffffffffffffffff8111156109cf57600080fd5b6109db868287016108c5565b9150509250925092565b8035801515811461093657600080fd5b600080600060e08486031215610a0a57600080fd5b8335610a15816108ad565b9250610a2485602086016108c5565b915061091c60c085016109e5565b600080600060608486031215610a4757600080fd5b8335610a52816108ad565b9250602084013567ffffffffffffffff811115610a6e57600080fd5b610a7a868287016108c5565b92505061091c604085016109e5565b600060208284031215610a9b57600080fd5b8135610aa6816108ad565b9392505050565b600060208284031215610abf57600080fd5b610aa682610925565b60005b83811015610ae3578181015183820152602001610acb565b50506000910152565b6020815260008251806020840152610b0b816040850160208701610ac8565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610b4757600080fd5b815167ffffffffffffffff80821115610b5f57600080fd5b818401915084601f830112610b7357600080fd5b815181811115610b8557610b85610b1f565b604051601f8201601f19908116603f01168101908382118183101715610bad57610bad610b1f565b81604052828152876020848701011115610bc657600080fd5b610bd7836020830160208801610ac8565b979650505050505050565b600060208284031215610bf457600080fd5b8151610aa6816108ad56fea264697066735822122021d5940716f8554ddf1e59e5102a0bdbaa572b14bade09adb55dcb1a934fea2e64736f6c63430008130033
Deployed Bytecode
0x73495279f278fe3d44b92c320d84397559271d1fb530146080604052600436106100875760003560e01c8063760bb18e11610065578063760bb18e146100ee5780637e7d7ed41461010e578063f8d18ae21461012e578063fff7406b1461014e57600080fd5b80630b7aa22a1461008c5780632e96aa8e146100ae57806330b760d9146100ce575b600080fd5b81801561009857600080fd5b506100ac6100a73660046108dd565b61016e565b005b8180156100ba57600080fd5b506100ac6100c936600461093b565b6101a4565b8180156100da57600080fd5b506100ac6100e9366004610983565b610266565b8180156100fa57600080fd5b506100ac610109366004610983565b610292565b81801561011a57600080fd5b506100ac6101293660046109f5565b6102c3565b81801561013a57600080fd5b506100ac6101493660046108dd565b6102f4565b81801561015a57600080fd5b506100ac610169366004610a32565b610320565b61019f83836101836060850160408601610a89565b6020850135853561019a60a0880160808901610aad565b61034b565b505050565b60408051602481018590526044810184905260ff831660648083019190915282518083039091018152608490910182526020810180516001600160e01b03166358d9dd0d60e11b179052905163152760d960e31b81526001600160a01b0386169163a93b06c8916102189190600401610aec565b6000604051808303816000875af1158015610237573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261025f9190810190610b35565b5050505050565b61019f838361027b6060850160408601610a89565b6020850135853561019a6080880160608901610aad565b61019f83836102a76060850160408601610a89565b602085013585356102be6080880160608901610aad565b6104e7565b61019f836102d76060850160408601610a89565b602085013585356102ee60a0880160808901610aad565b866107c9565b61019f83836103096060850160408601610a89565b602085013585356102be60a0880160808901610aad565b61019f836103346060850160408601610a89565b602085013585356102ee6080880160608901610aad565b8560ff8216600103610439576040516001600160a01b03868116602483015260448201869052878116606483015282169063a93b06c890638cf7558960e01b906084015b60408051601f198184030181529181526020820180516001600160e01b03167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e084901b90921682526103ec91600401610aec565b6000604051808303816000875af115801561040b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104339190810190610b35565b506104de565b8160ff16600203610487576040516001600160a01b0386811660248301526044820186905260648201859052878116608483015282169063a93b06c890632a1d8e8960e21b9060a40161038f565b8160ff166003036104c557604051602481018590526001600160a01b03878116604483015282169063a93b06c89062fbe9d560e61b9060640161038f565b6040516327b3518960e11b815260040160405180910390fd5b50505050505050565b8060ff1660030361064f57604051630b02f02d60e31b81526004810184905284906001600160a01b038881169190831690635817816890602401602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190610be2565b6001600160a01b031614610589576040516327b3518960e11b815260040160405180910390fd5b60405163104c9fd360e31b8152600481018590526001600160a01b03821690638264fe98906000906024016000604051808303818588803b1580156105cd57600080fd5b505af11580156105e1573d6000803e3d6000fd5b50506040516322dca8bb60e21b81526001600160a01b038a811660048301526024820189905285169350638b72a2ec92506044019050600060405180830381600087803b15801561063157600080fd5b505af1158015610645573d6000803e3d6000fd5b50505050506107b2565b60405163699f200f60e01b81526b10d6505397d0d3d39115525560a21b600482015260009073cf9a19d879769adae5e4f31503aaecda82568e559063699f200f90602401602060405180830381865afa1580156106b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d49190610be2565b90508160ff1660010361075957604051633c4fc9fb60e11b81526001600160a01b038881166004830152878116602483015286811660448301526064820186905282169063789f93f6906084015b600060405180830381600087803b15801561073c57600080fd5b505af1158015610750573d6000803e3d6000fd5b505050506107b0565b8160ff166002036104c557604051633a54a01760e11b81526001600160a01b0388811660048301528781166024830152868116604483015260648201869052608482018590528216906374a9402e9060a401610722565b505b6107c1858585858560016107c9565b505050505050565b8560ff8316600103610811576040516001600160a01b03878116602483015260448201879052831515606483015282169063a93b06c8906324d2eb4160e01b9060840161038f565b8260ff1660020361086e57806001600160a01b031663a93b06c88361083d5763865d533f60e01b610846565b63f13304c560e01b5b6040516001600160a01b038a166024820152604481018990526064810188905260840161038f565b8260ff166003036104c5576040516024810186905282151560448201526001600160a01b0382169063a93b06c89063133e8e6d60e31b9060640161038f565b6001600160a01b03811681146108c257600080fd5b50565b600060a082840312156108d757600080fd5b50919050565b600080600060e084860312156108f257600080fd5b83356108fd816108ad565b9250602084013561090d816108ad565b915061091c85604086016108c5565b90509250925092565b803560ff8116811461093657600080fd5b919050565b6000806000806080858703121561095157600080fd5b843561095c816108ad565b9350602085013592506040850135915061097860608601610925565b905092959194509250565b60008060006060848603121561099857600080fd5b83356109a3816108ad565b925060208401356109b3816108ad565b9150604084013567ffffffffffffffff8111156109cf57600080fd5b6109db868287016108c5565b9150509250925092565b8035801515811461093657600080fd5b600080600060e08486031215610a0a57600080fd5b8335610a15816108ad565b9250610a2485602086016108c5565b915061091c60c085016109e5565b600080600060608486031215610a4757600080fd5b8335610a52816108ad565b9250602084013567ffffffffffffffff811115610a6e57600080fd5b610a7a868287016108c5565b92505061091c604085016109e5565b600060208284031215610a9b57600080fd5b8135610aa6816108ad565b9392505050565b600060208284031215610abf57600080fd5b610aa682610925565b60005b83811015610ae3578181015183820152602001610acb565b50506000910152565b6020815260008251806020840152610b0b816040850160208701610ac8565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610b4757600080fd5b815167ffffffffffffffff80821115610b5f57600080fd5b818401915084601f830112610b7357600080fd5b815181811115610b8557610b85610b1f565b604051601f8201601f19908116603f01168101908382118183101715610bad57610bad610b1f565b81604052828152876020848701011115610bc657600080fd5b610bd7836020830160208801610ac8565b979650505050505050565b600060208284031215610bf457600080fd5b8151610aa6816108ad56fea264697066735822122021d5940716f8554ddf1e59e5102a0bdbaa572b14bade09adb55dcb1a934fea2e64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.