Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13494745 | 1040 days ago | IN | 0 ETH | 0.1230094 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
13494745 | 1040 days ago | 0 ETH |
Loading...
Loading
Contract Name:
ChainLinkPricer
Compiler Version
v0.6.10+commit.00c0fcaf
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.10; import {AggregatorInterface} from "../interfaces/AggregatorInterface.sol"; import {OracleInterface} from "../interfaces/OracleInterface.sol"; import {OpynPricerInterface} from "../interfaces/OpynPricerInterface.sol"; import {SafeMath} from "../packages/oz/SafeMath.sol"; /** * @notice A Pricer contract for one asset as reported by Chainlink */ contract ChainLinkPricer is OpynPricerInterface { using SafeMath for uint256; /// @dev base decimals uint256 internal constant BASE = 8; /// @notice chainlink response decimals uint256 public aggregatorDecimals; /// @notice the opyn oracle address OracleInterface public oracle; /// @notice the aggregator for an asset AggregatorInterface public aggregator; /// @notice asset that this pricer will a get price for address public asset; /// @notice bot address that is allowed to call setExpiryPriceInOracle address public bot; /** * @param _bot priveleged address that can call setExpiryPriceInOracle * @param _asset asset that this pricer will get a price for * @param _aggregator Chainlink aggregator contract for the asset * @param _oracle Opyn Oracle address */ constructor( address _bot, address _asset, address _aggregator, address _oracle ) public { require(_bot != address(0), "ChainLinkPricer: Cannot set 0 address as bot"); require(_oracle != address(0), "ChainLinkPricer: Cannot set 0 address as oracle"); require(_aggregator != address(0), "ChainLinkPricer: Cannot set 0 address as aggregator"); bot = _bot; oracle = OracleInterface(_oracle); aggregator = AggregatorInterface(_aggregator); asset = _asset; aggregatorDecimals = uint256(aggregator.decimals()); } /** * @notice modifier to check if sender address is equal to bot address */ modifier onlyBot() { require(msg.sender == bot, "ChainLinkPricer: unauthorized sender"); _; } /** * @notice set the expiry price in the oracle, can only be called by Bot address * @dev a roundId must be provided to confirm price validity, which is the first Chainlink price provided after the expiryTimestamp * @param _expiryTimestamp expiry to set a price for * @param _roundId the first roundId after expiryTimestamp */ function setExpiryPriceInOracle(uint256 _expiryTimestamp, uint80 _roundId) external onlyBot { (, int256 price, , uint256 roundTimestamp, ) = aggregator.getRoundData(_roundId); require(_expiryTimestamp <= roundTimestamp, "ChainLinkPricer: invalid roundId"); oracle.setExpiryPrice(asset, _expiryTimestamp, uint256(price)); } /** * @notice get the live price for the asset * @dev overides the getPrice function in OpynPricerInterface * @return price of the asset in USD, scaled by 1e8 */ function getPrice() external view override returns (uint256) { (, int256 answer, , , ) = aggregator.latestRoundData(); require(answer > 0, "ChainLinkPricer: price is lower than 0"); // chainlink's answer is already 1e8 return _scaleToBase(uint256(answer)); } /** * @notice get historical chainlink price * @param _roundId chainlink round id * @return round price and timestamp */ function getHistoricalPrice(uint80 _roundId) external view override returns (uint256, uint256) { (, int256 price, , uint256 roundTimestamp, ) = aggregator.getRoundData(_roundId); return (_scaleToBase(uint256(price)), roundTimestamp); } /** * @notice scale aggregator response to base decimals (1e8) * @param _price aggregator price * @return price scaled to 1e8 */ function _scaleToBase(uint256 _price) internal view returns (uint256) { if (aggregatorDecimals > BASE) { uint256 exp = aggregatorDecimals.sub(BASE); _price = _price.div(10**exp); } else if (aggregatorDecimals < BASE) { uint256 exp = BASE.sub(aggregatorDecimals); _price = _price.mul(10**exp); } return _price; } }
// SPDX-License-Identifier: MIT // openzeppelin-contracts v3.1.0 /* solhint-disable */ pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.10; interface OracleInterface { function isLockingPeriodOver(address _asset, uint256 _expiryTimestamp) external view returns (bool); function isDisputePeriodOver(address _asset, uint256 _expiryTimestamp) external view returns (bool); function getExpiryPrice(address _asset, uint256 _expiryTimestamp) external view returns (uint256, bool); function getDisputer() external view returns (address); function getPricer(address _asset) external view returns (address); function getPrice(address _asset) external view returns (uint256); function getPricerLockingPeriod(address _pricer) external view returns (uint256); function getPricerDisputePeriod(address _pricer) external view returns (uint256); function getChainlinkRoundData(address _asset, uint80 _roundId) external view returns (uint256, uint256); // Non-view function function setAssetPricer(address _asset, address _pricer) external; function setLockingPeriod(address _pricer, uint256 _lockingPeriod) external; function setDisputePeriod(address _pricer, uint256 _disputePeriod) external; function setExpiryPrice( address _asset, uint256 _expiryTimestamp, uint256 _price ) external; function disputeExpiryPrice( address _asset, uint256 _expiryTimestamp, uint256 _price ) external; function setDisputer(address _disputer) external; }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.10; interface OpynPricerInterface { function getPrice() external view returns (uint256); function getHistoricalPrice(uint80 _roundId) external view returns (uint256, uint256); }
/** * SPDX-License-Identifier: UNLICENSED */ pragma solidity 0.6.10; /** * @dev Interface of the Chainlink aggregator */ interface AggregatorInterface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_bot","type":"address"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_aggregator","type":"address"},{"internalType":"address","name":"_oracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"aggregator","outputs":[{"internalType":"contract AggregatorInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aggregatorDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getHistoricalPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract OracleInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expiryTimestamp","type":"uint256"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"setExpiryPriceInOracle","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051610a3b380380610a3b8339818101604052608081101561003357600080fd5b50805160208201516040830151606090930151919290916001600160a01b03841661008f5760405162461bcd60e51b815260040180806020018281038252602c815260200180610a0f602c913960400191505060405180910390fd5b6001600160a01b0381166100d45760405162461bcd60e51b815260040180806020018281038252602f8152602001806109ad602f913960400191505060405180910390fd5b6001600160a01b0382166101195760405162461bcd60e51b81526004018080602001828103825260338152602001806109dc6033913960400191505060405180910390fd5b600480546001600160a01b03199081166001600160a01b03878116919091178355600180548316858316179055600280548316868316179081905560038054909316878316179092556040805163313ce56760e01b81529051929091169263313ce567928282019260209290829003018186803b15801561019957600080fd5b505afa1580156101ad573d6000803e3d6000fd5b505050506040513d60208110156101c357600080fd5b505160ff16600055505050506107cf806101de6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637dc0d1d01161005b5780637dc0d1d0146100db57806398d5fdca146100e3578063b2b63d9f146100eb578063eec377c01461011c57610088565b806310814c371461008d578063245a7bfc146100b157806331b46c8b146100b957806338d52e0f146100d3575b600080fd5b61009561015e565b604080516001600160a01b039092168252519081900360200190f35b61009561016d565b6100c161017c565b60408051918252519081900360200190f35b610095610182565b610095610191565b6100c16101a0565b61011a6004803603604081101561010157600080fd5b508035906020013569ffffffffffffffffffff16610270565b005b6101456004803603602081101561013257600080fd5b503569ffffffffffffffffffff16610422565b6040805192835260208301919091528051918290030190f35b6004546001600160a01b031681565b6002546001600160a01b031681565b60005481565b6003546001600160a01b031681565b6001546001600160a01b031681565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156101f157600080fd5b505afa158015610205573d6000803e3d6000fd5b505050506040513d60a081101561021b57600080fd5b50602001519050600081136102615760405162461bcd60e51b81526004018080602001828103825260268152602001806107536026913960400191505060405180910390fd5b61026a816104cd565b91505090565b6004546001600160a01b031633146102b95760405162461bcd60e51b815260040180806020018281038252602481526020018061072f6024913960400191505060405180910390fd5b60025460408051639a6fc8f560e01b815269ffffffffffffffffffff84166004820152905160009283926001600160a01b0390911691639a6fc8f59160248082019260a092909190829003018186803b15801561031557600080fd5b505afa158015610329573d6000803e3d6000fd5b505050506040513d60a081101561033f57600080fd5b5060208101516060909101519092509050808411156103a5576040805162461bcd60e51b815260206004820181905260248201527f436861696e4c696e6b5072696365723a20696e76616c696420726f756e644964604482015290519081900360640190fd5b6001546003546040805163ee53140960e01b81526001600160a01b03928316600482015260248101889052604481018690529051919092169163ee53140991606480830192600092919082900301818387803b15801561040457600080fd5b505af1158015610418573d6000803e3d6000fd5b5050505050505050565b60025460408051639a6fc8f560e01b815269ffffffffffffffffffff8416600482015290516000928392839283926001600160a01b031691639a6fc8f59160248083019260a0929190829003018186803b15801561047f57600080fd5b505afa158015610493573d6000803e3d6000fd5b505050506040513d60a08110156104a957600080fd5b50602081015160609091015190925090506104c3826104cd565b9350915050915091565b60006008600054111561050d57600080546104ef90600863ffffffff61054c16565b905061050583600a83900a63ffffffff61059716565b925050610548565b60086000541015610548576000805461052e9060089063ffffffff61054c16565b905061054483600a83900a63ffffffff6105d916565b9250505b5090565b600061058e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610632565b90505b92915050565b600061058e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506106c9565b6000826105e857506000610591565b828202828482816105f557fe5b041461058e5760405162461bcd60e51b81526004018080602001828103825260218152602001806107796021913960400191505060405180910390fd5b600081848411156106c15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561068657818101518382015260200161066e565b50505050905090810190601f1680156106b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836107185760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561068657818101518382015260200161066e565b50600083858161072457fe5b049594505050505056fe436861696e4c696e6b5072696365723a20756e617574686f72697a65642073656e646572436861696e4c696e6b5072696365723a207072696365206973206c6f776572207468616e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220e371960ea0803846ea60b37a8f5040bf0ad6f2585b9b303e8011c3c3380438b064736f6c634300060a0033436861696e4c696e6b5072696365723a2043616e6e6f742073657420302061646472657373206173206f7261636c65436861696e4c696e6b5072696365723a2043616e6e6f7420736574203020616464726573732061732061676772656761746f72436861696e4c696e6b5072696365723a2043616e6e6f74207365742030206164647265737320617320626f74000000000000000000000000facb407914655562d6619b0048a612b1795df7830000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2000000000000000000000000cc70f09a6cc17553b2e31954cd36e4a2d89501f7000000000000000000000000789cd7ab3742e23ce0952f6bc3eb3a73a0e08833
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80637dc0d1d01161005b5780637dc0d1d0146100db57806398d5fdca146100e3578063b2b63d9f146100eb578063eec377c01461011c57610088565b806310814c371461008d578063245a7bfc146100b157806331b46c8b146100b957806338d52e0f146100d3575b600080fd5b61009561015e565b604080516001600160a01b039092168252519081900360200190f35b61009561016d565b6100c161017c565b60408051918252519081900360200190f35b610095610182565b610095610191565b6100c16101a0565b61011a6004803603604081101561010157600080fd5b508035906020013569ffffffffffffffffffff16610270565b005b6101456004803603602081101561013257600080fd5b503569ffffffffffffffffffff16610422565b6040805192835260208301919091528051918290030190f35b6004546001600160a01b031681565b6002546001600160a01b031681565b60005481565b6003546001600160a01b031681565b6001546001600160a01b031681565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156101f157600080fd5b505afa158015610205573d6000803e3d6000fd5b505050506040513d60a081101561021b57600080fd5b50602001519050600081136102615760405162461bcd60e51b81526004018080602001828103825260268152602001806107536026913960400191505060405180910390fd5b61026a816104cd565b91505090565b6004546001600160a01b031633146102b95760405162461bcd60e51b815260040180806020018281038252602481526020018061072f6024913960400191505060405180910390fd5b60025460408051639a6fc8f560e01b815269ffffffffffffffffffff84166004820152905160009283926001600160a01b0390911691639a6fc8f59160248082019260a092909190829003018186803b15801561031557600080fd5b505afa158015610329573d6000803e3d6000fd5b505050506040513d60a081101561033f57600080fd5b5060208101516060909101519092509050808411156103a5576040805162461bcd60e51b815260206004820181905260248201527f436861696e4c696e6b5072696365723a20696e76616c696420726f756e644964604482015290519081900360640190fd5b6001546003546040805163ee53140960e01b81526001600160a01b03928316600482015260248101889052604481018690529051919092169163ee53140991606480830192600092919082900301818387803b15801561040457600080fd5b505af1158015610418573d6000803e3d6000fd5b5050505050505050565b60025460408051639a6fc8f560e01b815269ffffffffffffffffffff8416600482015290516000928392839283926001600160a01b031691639a6fc8f59160248083019260a0929190829003018186803b15801561047f57600080fd5b505afa158015610493573d6000803e3d6000fd5b505050506040513d60a08110156104a957600080fd5b50602081015160609091015190925090506104c3826104cd565b9350915050915091565b60006008600054111561050d57600080546104ef90600863ffffffff61054c16565b905061050583600a83900a63ffffffff61059716565b925050610548565b60086000541015610548576000805461052e9060089063ffffffff61054c16565b905061054483600a83900a63ffffffff6105d916565b9250505b5090565b600061058e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610632565b90505b92915050565b600061058e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506106c9565b6000826105e857506000610591565b828202828482816105f557fe5b041461058e5760405162461bcd60e51b81526004018080602001828103825260218152602001806107796021913960400191505060405180910390fd5b600081848411156106c15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561068657818101518382015260200161066e565b50505050905090810190601f1680156106b35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836107185760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561068657818101518382015260200161066e565b50600083858161072457fe5b049594505050505056fe436861696e4c696e6b5072696365723a20756e617574686f72697a65642073656e646572436861696e4c696e6b5072696365723a207072696365206973206c6f776572207468616e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220e371960ea0803846ea60b37a8f5040bf0ad6f2585b9b303e8011c3c3380438b064736f6c634300060a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000facb407914655562d6619b0048a612b1795df7830000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2000000000000000000000000cc70f09a6cc17553b2e31954cd36e4a2d89501f7000000000000000000000000789cd7ab3742e23ce0952f6bc3eb3a73a0e08833
-----Decoded View---------------
Arg [0] : _bot (address): 0xfacb407914655562d6619b0048a612B1795dF783
Arg [1] : _asset (address): 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2
Arg [2] : _aggregator (address): 0xCc70F09A6CC17553b2E31954cD36E4A2d89501f7
Arg [3] : _oracle (address): 0x789cD7AB3742e23Ce0952F6Bc3Eb3A73A0E08833
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000facb407914655562d6619b0048a612b1795df783
Arg [1] : 0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2
Arg [2] : 000000000000000000000000cc70f09a6cc17553b2e31954cd36e4a2d89501f7
Arg [3] : 000000000000000000000000789cd7ab3742e23ce0952f6bc3eb3a73a0e08833
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.