// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {HoodTickerRegistry} from "./HoodTickerRegistry.sol";
import {ECDSA} from "./utils/ECDSA.sol";
import {Ownable} from "./utils/Ownable.sol";
/// @notice Signed stock price checkpoints for Hood Tokenized Terminal.
/// @dev Alpaca or any other market-data vendor should stay off-chain behind a backend signer. API keys never touch
/// the frontend and never touch this contract. The terminal can stream fast prices off-chain, while this oracle stores
/// compact signed checkpoints on Robinhood Chain for users, sponsors, and tokenized-stock apps that want verifiable data.
/// This is not a custody contract and cannot trap user funds.
contract HoodStockPriceOracle is Ownable {
using ECDSA for bytes32;
struct PriceUpdate {
bytes32 symbol;
uint256 price; // USD price with 8 decimals.
int256 changeBps; // Session change in basis points. 100 = 1%.
uint64 marketTimestamp;
uint256 nonce;
}
struct Price {
uint256 price;
int256 changeBps;
uint64 marketTimestamp;
uint64 updatedAt;
address signer;
}
bytes32 public constant PRICE_UPDATE_TYPEHASH = keccak256(
"PriceUpdate(bytes32 symbol,uint256 price,int256 changeBps,uint64 marketTimestamp,uint256 nonce)"
);
HoodTickerRegistry public immutable tickerRegistry;
uint256 public maxUpdateDelay = 15 minutes;
uint256 public maxFutureDrift = 2 minutes;
uint256 public maxDeviationBps;
mapping(address => bool) public isSigner;
mapping(bytes32 => Price) public latestPrice;
mapping(bytes32 => bool) public usedDigests;
bytes32 private immutable _domainSeparator;
uint256 private immutable _domainChainId;
event SignerSet(address indexed signer, bool allowed);
event OracleConfigSet(uint256 maxUpdateDelay, uint256 maxFutureDrift, uint256 maxDeviationBps);
event PricePosted(
bytes32 indexed symbol,
uint256 price,
int256 changeBps,
uint64 marketTimestamp,
address indexed signer
);
constructor(address initialOwner, HoodTickerRegistry tickerRegistry_) Ownable(initialOwner) {
require(address(tickerRegistry_) != address(0), "Oracle: zero registry");
tickerRegistry = tickerRegistry_;
_domainChainId = block.chainid;
_domainSeparator = _buildDomainSeparator();
}
function postPrice(PriceUpdate calldata update, bytes calldata signature) external {
require(tickerRegistry.isActiveTicker(update.symbol), "Oracle: inactive ticker");
require(update.price > 0, "Oracle: zero price");
require(update.marketTimestamp <= block.timestamp + maxFutureDrift, "Oracle: future price");
require(block.timestamp <= update.marketTimestamp + maxUpdateDelay, "Oracle: stale price");
bytes32 digest = priceDigest(update);
require(!usedDigests[digest], "Oracle: used update");
address signer = digest.recover(signature);
require(isSigner[signer], "Oracle: bad signer");
Price storage current = latestPrice[update.symbol];
require(update.marketTimestamp >= current.marketTimestamp, "Oracle: old price");
if (maxDeviationBps > 0 && current.price > 0) {
uint256 diff = update.price > current.price ? update.price - current.price : current.price - update.price;
require((diff * 10_000) / current.price <= maxDeviationBps, "Oracle: deviation");
}
usedDigests[digest] = true;
latestPrice[update.symbol] = Price({
price: update.price,
changeBps: update.changeBps,
marketTimestamp: update.marketTimestamp,
updatedAt: uint64(block.timestamp),
signer: signer
});
emit PricePosted(update.symbol, update.price, update.changeBps, update.marketTimestamp, signer);
}
function setSigner(address signer, bool allowed) external onlyOwner {
require(signer != address(0), "Oracle: zero signer");
isSigner[signer] = allowed;
emit SignerSet(signer, allowed);
}
function setOracleConfig(
uint256 newMaxUpdateDelay,
uint256 newMaxFutureDrift,
uint256 newMaxDeviationBps
) external onlyOwner {
require(newMaxUpdateDelay >= 1 minutes, "Oracle: delay too low");
require(newMaxFutureDrift <= 10 minutes, "Oracle: drift too high");
require(newMaxDeviationBps <= 10_000, "Oracle: deviation too high");
maxUpdateDelay = newMaxUpdateDelay;
maxFutureDrift = newMaxFutureDrift;
maxDeviationBps = newMaxDeviationBps;
emit OracleConfigSet(newMaxUpdateDelay, newMaxFutureDrift, newMaxDeviationBps);
}
function priceDigest(PriceUpdate calldata update) public view returns (bytes32) {
bytes32 structHash = keccak256(
abi.encode(
PRICE_UPDATE_TYPEHASH,
update.symbol,
update.price,
update.changeBps,
update.marketTimestamp,
update.nonce
)
);
return keccak256(abi.encodePacked("\x19\x01", domainSeparator(), structHash));
}
function domainSeparator() public view returns (bytes32) {
return block.chainid == _domainChainId ? _domainSeparator : _buildDomainSeparator();
}
function DOMAIN_SEPARATOR() external view returns (bytes32) {
return domainSeparator();
}
function _buildDomainSeparator() private view returns (bytes32) {
return keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes("Hood Tokenized Terminal Oracle")),
keccak256(bytes("1")),
block.chainid,
address(this)
)
);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "tickerRegistry_",
"type": "address",
"internalType": "contract HoodTickerRegistry"
}
],
"stateMutability": "nonpayable"
},
{
"name": "OracleConfigSet",
"type": "event",
"inputs": [
{
"name": "maxUpdateDelay",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "maxFutureDrift",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "maxDeviationBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PricePosted",
"type": "event",
"inputs": [
{
"name": "symbol",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "price",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "changeBps",
"type": "int256",
"indexed": false,
"internalType": "int256"
},
{
"name": "marketTimestamp",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "signer",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SignerSet",
"type": "event",
"inputs": [
{
"name": "signer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "PRICE_UPDATE_TYPEHASH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "domainSeparator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "isSigner",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "latestPrice",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "price",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "changeBps",
"type": "int256",
"internalType": "int256"
},
{
"name": "marketTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "updatedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "signer",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "maxDeviationBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxFutureDrift",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxUpdateDelay",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "postPrice",
"type": "function",
"inputs": [
{
"name": "update",
"type": "tuple",
"components": [
{
"name": "symbol",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "price",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "changeBps",
"type": "int256",
"internalType": "int256"
},
{
"name": "marketTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "nonce",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct HoodStockPriceOracle.PriceUpdate"
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "priceDigest",
"type": "function",
"inputs": [
{
"name": "update",
"type": "tuple",
"components": [
{
"name": "symbol",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "price",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "changeBps",
"type": "int256",
"internalType": "int256"
},
{
"name": "marketTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "nonce",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct HoodStockPriceOracle.PriceUpdate"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "setOracleConfig",
"type": "function",
"inputs": [
{
"name": "newMaxUpdateDelay",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "newMaxFutureDrift",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "newMaxDeviationBps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSigner",
"type": "function",
"inputs": [
{
"name": "signer",
"type": "address",
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tickerRegistry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract HoodTickerRegistry"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "usedDigests",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
}
]0x60e060405261038460015560786002553480156200001b575f80fd5b506040516200148e3803806200148e8339810160408190526200003e9162000258565b816001600160a01b0381166200009b5760405162461bcd60e51b815260206004820152601360248201527f4f776e61626c653a207a65726f206f776e65720000000000000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0381166200013b5760405162461bcd60e51b815260206004820152601560248201527f4f7261636c653a207a65726f2072656769737472790000000000000000000000604482015260640162000092565b6001600160a01b0381166080524660c05262000234604080518082018252601e81527f486f6f6420546f6b656e697a6564205465726d696e616c204f7261636c6500006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fbb201489d8e8cb95d6899787496d8029ebd28a580e98a64602e8aaadd84d954e818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a05250620002959050565b6001600160a01b038116811462000255575f80fd5b50565b5f80604083850312156200026a575f80fd5b8251620002778162000240565b60208401519092506200028a8162000240565b809150509250929050565b60805160a05160c0516111c7620002c75f395f610c3101525f610d3e01525f8181610135015261031101526111c75ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80637df73e2711610093578063f2fde38b11610063578063f2fde38b146102b0578063f34f620c146102c3578063f698da25146102ea578063fe1a0753146102f2575f80fd5b80637df73e27146102375780638da5cb5b14610269578063b3156aa51461027b578063d39c4de71461028e575f80fd5b80633644e515116100ce5780633644e515146101825780633ee7a7011461018a5780634eec7c2b14610193578063644fe11114610224575f80fd5b80630eb52c25146100ff5780630f32188b146101145780632a8581261461013057806331cb61051461016f575b5f80fd5b61011261010d366004610f3d565b6102fb565b005b61011d60015481565b6040519081526020015b60405180910390f35b6101577f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610127565b61011261017d366004610fe5565b61083f565b61011d610912565b61011d60035481565b6101e66101a136600461101a565b60056020525f908152604090208054600182015460028301546003909301549192909167ffffffffffffffff80831692600160401b900416906001600160a01b031685565b60408051958652602086019490945267ffffffffffffffff928316938501939093521660608301526001600160a01b0316608082015260a001610127565b610112610232366004611031565b610920565b61025961024536600461105a565b60046020525f908152604090205460ff1681565b6040519015158152602001610127565b5f54610157906001600160a01b031681565b61011d61028936600461107a565b610a84565b61025961029c36600461101a565b60066020525f908152604090205460ff1681565b6101126102be36600461105a565b610b60565b61011d7f06cffd0f6ff46e859993f61221d71f26e32d420ab3a028bb36cd4d6eb7f4cf6f81565b61011d610c2e565b61011d60025481565b604051637b4551f960e11b8152833560048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f68aa3f290602401602060405180830381865afa15801561035e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103829190611094565b6103d35760405162461bcd60e51b815260206004820152601760248201527f4f7261636c653a20696e616374697665207469636b657200000000000000000060448201526064015b60405180910390fd5b5f83602001351161041b5760405162461bcd60e51b81526020600482015260126024820152714f7261636c653a207a65726f20707269636560701b60448201526064016103ca565b60025461042890426110c3565b61043860808501606086016110dc565b67ffffffffffffffff1611156104875760405162461bcd60e51b81526020600482015260146024820152734f7261636c653a2066757475726520707269636560601b60448201526064016103ca565b60015461049a60808501606086016110dc565b67ffffffffffffffff166104ae91906110c3565b4211156104f35760405162461bcd60e51b81526020600482015260136024820152724f7261636c653a207374616c6520707269636560681b60448201526064016103ca565b5f6104fd84610a84565b5f8181526006602052604090205490915060ff16156105545760405162461bcd60e51b81526020600482015260136024820152724f7261636c653a20757365642075706461746560681b60448201526064016103ca565b5f610560828585610d60565b6001600160a01b0381165f9081526004602052604090205490915060ff166105bf5760405162461bcd60e51b815260206004820152601260248201527127b930b1b6329d103130b21039b4b3b732b960711b60448201526064016103ca565b84355f908152600560205260409020600281015467ffffffffffffffff166105ed60808801606089016110dc565b67ffffffffffffffff1610156106395760405162461bcd60e51b81526020600482015260116024820152704f7261636c653a206f6c6420707269636560781b60448201526064016103ca565b5f60035411801561064a5750805415155b156106e65780545f9060208801351161067357815461066e90602089013590611103565b610683565b8154610683906020890135611103565b60035483549192509061069883612710611116565b6106a2919061112d565b11156106e45760405162461bcd60e51b815260206004820152601160248201527027b930b1b6329d103232bb34b0ba34b7b760791b60448201526064016103ca565b505b5f83815260066020908152604091829020805460ff19166001179055815160a081018352888201358152888301359181019190915290810161072e6080890160608a016110dc565b67ffffffffffffffff90811682524281166020808401919091526001600160a01b0380871660409485018190528b355f8181526005855286902087518155878501516001820155878701516002820180546060808c01518a16600160401b026fffffffffffffffffffffffffffffffff19909216939099169290921791909117905560809788015160039091018054919094166001600160a01b0319909116179092559490937ffe3c2d1304267334f486c2ffda211fd6342229ca667c61fd8588b8b610e1c73e93928c013592908c01359161080f91908d01908d016110dc565b60408051938452602084019290925267ffffffffffffffff169082015260600160405180910390a3505050505050565b5f546001600160a01b031633146108685760405162461bcd60e51b81526004016103ca9061114c565b6001600160a01b0382166108b45760405162461bcd60e51b815260206004820152601360248201527227b930b1b6329d103d32b9379039b4b3b732b960691b60448201526064016103ca565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527ffc4acb499491cd850a8a21ab98c7f128850c0f0e5f1a875a62b7fa055c2ecf19910160405180910390a25050565b5f61091b610c2e565b905090565b5f546001600160a01b031633146109495760405162461bcd60e51b81526004016103ca9061114c565b603c8310156109925760405162461bcd60e51b81526020600482015260156024820152744f7261636c653a2064656c617920746f6f206c6f7760581b60448201526064016103ca565b6102588211156109dd5760405162461bcd60e51b815260206004820152601660248201527509ee4c2c6d8ca7440c8e4d2cce840e8dede40d0d2ced60531b60448201526064016103ca565b612710811115610a2f5760405162461bcd60e51b815260206004820152601a60248201527f4f7261636c653a20646576696174696f6e20746f6f206869676800000000000060448201526064016103ca565b60018390556002829055600381905560408051848152602081018490529081018290527fdf3bcefaac89a5666d752b32b11a125ef219e6ead8f881280207a5251ea233b89060600160405180910390a1505050565b5f807f06cffd0f6ff46e859993f61221d71f26e32d420ab3a028bb36cd4d6eb7f4cf6f833560208501356040860135610ac360808801606089016110dc565b604080516020810196909652850193909352606084019190915260808381019190915267ffffffffffffffff90911660a083015284013560c082015260e001604051602081830303815290604052805190602001209050610b22610c2e565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b5f546001600160a01b03163314610b895760405162461bcd60e51b81526004016103ca9061114c565b6001600160a01b038116610bd55760405162461bcd60e51b815260206004820152601360248201527227bbb730b136329d103d32b9379037bbb732b960691b60448201526064016103ca565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610d3b5750604080518082018252601e81527f486f6f6420546f6b656e697a6564205465726d696e616c204f7261636c6500006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fbb201489d8e8cb95d6899787496d8029ebd28a580e98a64602e8aaadd84d954e818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b5f60418214610da55760405162461bcd60e51b815260206004820152601160248201527008a8688a6827440c4c2c840d8cadccee8d607b1b60448201526064016103ca565b8235602084013560408501355f1a601b811015610dca57610dc7601b82611178565b90505b8060ff16601b1480610ddf57508060ff16601c145b610e1a5760405162461bcd60e51b815260206004820152600c60248201526b22a1a229a09d103130b2103b60a11b60448201526064016103ca565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610e795760405162461bcd60e51b815260206004820152600c60248201526b45434453413a20626164207360a01b60448201526064016103ca565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ec9573d5f803e3d5ffd5b5050604051601f1901519450506001600160a01b038416610f1d5760405162461bcd60e51b815260206004820152600e60248201526d45434453413a206261642073696760901b60448201526064016103ca565b5050509392505050565b5f60a08284031215610f37575f80fd5b50919050565b5f805f60c08486031215610f4f575f80fd5b610f598585610f27565b925060a084013567ffffffffffffffff80821115610f75575f80fd5b818601915086601f830112610f88575f80fd5b813581811115610f96575f80fd5b876020828501011115610fa7575f80fd5b6020830194508093505050509250925092565b80356001600160a01b0381168114610fd0575f80fd5b919050565b8015158114610fe2575f80fd5b50565b5f8060408385031215610ff6575f80fd5b610fff83610fba565b9150602083013561100f81610fd5565b809150509250929050565b5f6020828403121561102a575f80fd5b5035919050565b5f805f60608486031215611043575f80fd5b505081359360208301359350604090920135919050565b5f6020828403121561106a575f80fd5b61107382610fba565b9392505050565b5f60a0828403121561108a575f80fd5b6110738383610f27565b5f602082840312156110a4575f80fd5b815161107381610fd5565b634e487b7160e01b5f52601160045260245ffd5b808201808211156110d6576110d66110af565b92915050565b5f602082840312156110ec575f80fd5b813567ffffffffffffffff81168114611073575f80fd5b818103818111156110d6576110d66110af565b80820281158282048414176110d6576110d66110af565b5f8261114757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526012908201527127bbb730b136329d103737ba1037bbb732b960711b604082015260600190565b60ff81811683821601908111156110d6576110d66110af56fea2646970667358221220b1ab88812ba6987c859f77767a8bf9f97b5c410f34a7dfb48525eb6d5d875c4c64736f6c63430008180033000000000000000000000000f2a5f11b11c8039a4cc8c51d654adca1ae06182f00000000000000000000000058f1b2d6479f2bc6db3fa955e74b2c86c01a71c2
0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80637df73e2711610093578063f2fde38b11610063578063f2fde38b146102b0578063f34f620c146102c3578063f698da25146102ea578063fe1a0753146102f2575f80fd5b80637df73e27146102375780638da5cb5b14610269578063b3156aa51461027b578063d39c4de71461028e575f80fd5b80633644e515116100ce5780633644e515146101825780633ee7a7011461018a5780634eec7c2b14610193578063644fe11114610224575f80fd5b80630eb52c25146100ff5780630f32188b146101145780632a8581261461013057806331cb61051461016f575b5f80fd5b61011261010d366004610f3d565b6102fb565b005b61011d60015481565b6040519081526020015b60405180910390f35b6101577f00000000000000000000000058f1b2d6479f2bc6db3fa955e74b2c86c01a71c281565b6040516001600160a01b039091168152602001610127565b61011261017d366004610fe5565b61083f565b61011d610912565b61011d60035481565b6101e66101a136600461101a565b60056020525f908152604090208054600182015460028301546003909301549192909167ffffffffffffffff80831692600160401b900416906001600160a01b031685565b60408051958652602086019490945267ffffffffffffffff928316938501939093521660608301526001600160a01b0316608082015260a001610127565b610112610232366004611031565b610920565b61025961024536600461105a565b60046020525f908152604090205460ff1681565b6040519015158152602001610127565b5f54610157906001600160a01b031681565b61011d61028936600461107a565b610a84565b61025961029c36600461101a565b60066020525f908152604090205460ff1681565b6101126102be36600461105a565b610b60565b61011d7f06cffd0f6ff46e859993f61221d71f26e32d420ab3a028bb36cd4d6eb7f4cf6f81565b61011d610c2e565b61011d60025481565b604051637b4551f960e11b8152833560048201527f00000000000000000000000058f1b2d6479f2bc6db3fa955e74b2c86c01a71c26001600160a01b03169063f68aa3f290602401602060405180830381865afa15801561035e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103829190611094565b6103d35760405162461bcd60e51b815260206004820152601760248201527f4f7261636c653a20696e616374697665207469636b657200000000000000000060448201526064015b60405180910390fd5b5f83602001351161041b5760405162461bcd60e51b81526020600482015260126024820152714f7261636c653a207a65726f20707269636560701b60448201526064016103ca565b60025461042890426110c3565b61043860808501606086016110dc565b67ffffffffffffffff1611156104875760405162461bcd60e51b81526020600482015260146024820152734f7261636c653a2066757475726520707269636560601b60448201526064016103ca565b60015461049a60808501606086016110dc565b67ffffffffffffffff166104ae91906110c3565b4211156104f35760405162461bcd60e51b81526020600482015260136024820152724f7261636c653a207374616c6520707269636560681b60448201526064016103ca565b5f6104fd84610a84565b5f8181526006602052604090205490915060ff16156105545760405162461bcd60e51b81526020600482015260136024820152724f7261636c653a20757365642075706461746560681b60448201526064016103ca565b5f610560828585610d60565b6001600160a01b0381165f9081526004602052604090205490915060ff166105bf5760405162461bcd60e51b815260206004820152601260248201527127b930b1b6329d103130b21039b4b3b732b960711b60448201526064016103ca565b84355f908152600560205260409020600281015467ffffffffffffffff166105ed60808801606089016110dc565b67ffffffffffffffff1610156106395760405162461bcd60e51b81526020600482015260116024820152704f7261636c653a206f6c6420707269636560781b60448201526064016103ca565b5f60035411801561064a5750805415155b156106e65780545f9060208801351161067357815461066e90602089013590611103565b610683565b8154610683906020890135611103565b60035483549192509061069883612710611116565b6106a2919061112d565b11156106e45760405162461bcd60e51b815260206004820152601160248201527027b930b1b6329d103232bb34b0ba34b7b760791b60448201526064016103ca565b505b5f83815260066020908152604091829020805460ff19166001179055815160a081018352888201358152888301359181019190915290810161072e6080890160608a016110dc565b67ffffffffffffffff90811682524281166020808401919091526001600160a01b0380871660409485018190528b355f8181526005855286902087518155878501516001820155878701516002820180546060808c01518a16600160401b026fffffffffffffffffffffffffffffffff19909216939099169290921791909117905560809788015160039091018054919094166001600160a01b0319909116179092559490937ffe3c2d1304267334f486c2ffda211fd6342229ca667c61fd8588b8b610e1c73e93928c013592908c01359161080f91908d01908d016110dc565b60408051938452602084019290925267ffffffffffffffff169082015260600160405180910390a3505050505050565b5f546001600160a01b031633146108685760405162461bcd60e51b81526004016103ca9061114c565b6001600160a01b0382166108b45760405162461bcd60e51b815260206004820152601360248201527227b930b1b6329d103d32b9379039b4b3b732b960691b60448201526064016103ca565b6001600160a01b0382165f81815260046020908152604091829020805460ff191685151590811790915591519182527ffc4acb499491cd850a8a21ab98c7f128850c0f0e5f1a875a62b7fa055c2ecf19910160405180910390a25050565b5f61091b610c2e565b905090565b5f546001600160a01b031633146109495760405162461bcd60e51b81526004016103ca9061114c565b603c8310156109925760405162461bcd60e51b81526020600482015260156024820152744f7261636c653a2064656c617920746f6f206c6f7760581b60448201526064016103ca565b6102588211156109dd5760405162461bcd60e51b815260206004820152601660248201527509ee4c2c6d8ca7440c8e4d2cce840e8dede40d0d2ced60531b60448201526064016103ca565b612710811115610a2f5760405162461bcd60e51b815260206004820152601a60248201527f4f7261636c653a20646576696174696f6e20746f6f206869676800000000000060448201526064016103ca565b60018390556002829055600381905560408051848152602081018490529081018290527fdf3bcefaac89a5666d752b32b11a125ef219e6ead8f881280207a5251ea233b89060600160405180910390a1505050565b5f807f06cffd0f6ff46e859993f61221d71f26e32d420ab3a028bb36cd4d6eb7f4cf6f833560208501356040860135610ac360808801606089016110dc565b604080516020810196909652850193909352606084019190915260808381019190915267ffffffffffffffff90911660a083015284013560c082015260e001604051602081830303815290604052805190602001209050610b22610c2e565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b5f546001600160a01b03163314610b895760405162461bcd60e51b81526004016103ca9061114c565b6001600160a01b038116610bd55760405162461bcd60e51b815260206004820152601360248201527227bbb730b136329d103d32b9379037bbb732b960691b60448201526064016103ca565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f7f00000000000000000000000000000000000000000000000000000000000012374614610d3b5750604080518082018252601e81527f486f6f6420546f6b656e697a6564205465726d696e616c204f7261636c6500006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fbb201489d8e8cb95d6899787496d8029ebd28a580e98a64602e8aaadd84d954e818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f23c87b3f5cc23d4dffcbd187645502a3fb03483cc21619dd9b2bd3088d88851590565b5f60418214610da55760405162461bcd60e51b815260206004820152601160248201527008a8688a6827440c4c2c840d8cadccee8d607b1b60448201526064016103ca565b8235602084013560408501355f1a601b811015610dca57610dc7601b82611178565b90505b8060ff16601b1480610ddf57508060ff16601c145b610e1a5760405162461bcd60e51b815260206004820152600c60248201526b22a1a229a09d103130b2103b60a11b60448201526064016103ca565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610e795760405162461bcd60e51b815260206004820152600c60248201526b45434453413a20626164207360a01b60448201526064016103ca565b604080515f81526020810180835289905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ec9573d5f803e3d5ffd5b5050604051601f1901519450506001600160a01b038416610f1d5760405162461bcd60e51b815260206004820152600e60248201526d45434453413a206261642073696760901b60448201526064016103ca565b5050509392505050565b5f60a08284031215610f37575f80fd5b50919050565b5f805f60c08486031215610f4f575f80fd5b610f598585610f27565b925060a084013567ffffffffffffffff80821115610f75575f80fd5b818601915086601f830112610f88575f80fd5b813581811115610f96575f80fd5b876020828501011115610fa7575f80fd5b6020830194508093505050509250925092565b80356001600160a01b0381168114610fd0575f80fd5b919050565b8015158114610fe2575f80fd5b50565b5f8060408385031215610ff6575f80fd5b610fff83610fba565b9150602083013561100f81610fd5565b809150509250929050565b5f6020828403121561102a575f80fd5b5035919050565b5f805f60608486031215611043575f80fd5b505081359360208301359350604090920135919050565b5f6020828403121561106a575f80fd5b61107382610fba565b9392505050565b5f60a0828403121561108a575f80fd5b6110738383610f27565b5f602082840312156110a4575f80fd5b815161107381610fd5565b634e487b7160e01b5f52601160045260245ffd5b808201808211156110d6576110d66110af565b92915050565b5f602082840312156110ec575f80fd5b813567ffffffffffffffff81168114611073575f80fd5b818103818111156110d6576110d66110af565b80820281158282048414176110d6576110d66110af565b5f8261114757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526012908201527127bbb730b136329d103737ba1037bbb732b960711b604082015260600190565b60ff81811683821601908111156110d6576110d66110af56fea2646970667358221220b1ab88812ba6987c859f77767a8bf9f97b5c410f34a7dfb48525eb6d5d875c4c64736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 | |
| Robinhood Gift (GIFT) | GIFT | 1 | — | — |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x3c4bab…349016 | 37 days agoThu, 09 Jul 2026 17:16:01 UTC | 0xfe3c2d…c73e | [0] 0x515151000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd747 |
| 0xe1ada4…bef97b | 37 days agoThu, 09 Jul 2026 17:16:00 UTC | 0xfe3c2d…c73e | [0] 0x535059000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd742 |
| 0xc2b05d…dab85e | 37 days agoThu, 09 Jul 2026 17:15:59 UTC | 0xfe3c2d…c73e | [0] 0x54534c410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd744 |
| 0x460094…a029ad | 37 days agoThu, 09 Jul 2026 17:15:58 UTC | 0xfe3c2d…c73e | [0] 0x4e5644410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd749 |
| 0xf89db7…54dfdb | 37 days agoThu, 09 Jul 2026 17:15:57 UTC | 0xfe3c2d…c73e | [0] 0x4141504c0000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd74b |
| 0x9841ff…9d3f1d | 37 days agoThu, 09 Jul 2026 17:15:56 UTC | 0xfe3c2d…c73e | [0] 0x484f4f440000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd746 |
| 0xf2667e…b18ff7 | 37 days agoThu, 09 Jul 2026 17:15:00 UTC | 0xfe3c2d…c73e | [0] 0x515151000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd70f |
| 0x648848…a2c746 | 37 days agoThu, 09 Jul 2026 17:15:00 UTC | 0xfe3c2d…c73e | [0] 0x535059000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd70b |
| 0xca8654…4f3e59 | 37 days agoThu, 09 Jul 2026 17:14:59 UTC | 0xfe3c2d…c73e | [0] 0x54534c410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd70c |
| 0xbed1b9…66781a | 37 days agoThu, 09 Jul 2026 17:14:58 UTC | 0xfe3c2d…c73e | [0] 0x4e5644410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6fe |
| 0x3e29c3…d1dda9 | 37 days agoThu, 09 Jul 2026 17:14:57 UTC | 0xfe3c2d…c73e | [0] 0x4141504c0000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd70b |
| 0x59bf8d…10e9fc | 37 days agoThu, 09 Jul 2026 17:14:56 UTC | 0xfe3c2d…c73e | [0] 0x484f4f440000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd70f |
| 0x71242b…669db7 | 37 days agoThu, 09 Jul 2026 17:14:01 UTC | 0xfe3c2d…c73e | [0] 0x515151000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6cb |
| 0x8f113a…8dba28 | 37 days agoThu, 09 Jul 2026 17:14:00 UTC | 0xfe3c2d…c73e | [0] 0x535059000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6c4 |
| 0xa5e9db…877785 | 37 days agoThu, 09 Jul 2026 17:13:59 UTC | 0xfe3c2d…c73e | [0] 0x54534c410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6c3 |
| 0xdcb086…c6104d | 37 days agoThu, 09 Jul 2026 17:13:58 UTC | 0xfe3c2d…c73e | [0] 0x4e5644410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6d3 |
| 0x8f6a02…102570 | 37 days agoThu, 09 Jul 2026 17:13:57 UTC | 0xfe3c2d…c73e | [0] 0x4141504c0000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6d2 |
| 0x688a54…19c0a0 | 37 days agoThu, 09 Jul 2026 17:13:56 UTC | 0xfe3c2d…c73e | [0] 0x484f4f440000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd6c2 |
| 0x168836…6acab9 | 37 days agoThu, 09 Jul 2026 17:13:00 UTC | 0xfe3c2d…c73e | [0] 0x515151000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd693 |
| 0x46384f…00336b | 37 days agoThu, 09 Jul 2026 17:13:00 UTC | 0xfe3c2d…c73e | [0] 0x535059000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd68f |
| 0xf600fa…cc4a0a | 37 days agoThu, 09 Jul 2026 17:12:59 UTC | 0xfe3c2d…c73e | [0] 0x54534c410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd686 |
| 0xa5e896…abb559 | 37 days agoThu, 09 Jul 2026 17:12:58 UTC | 0xfe3c2d…c73e | [0] 0x4e5644410000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd687 |
| 0xbc93bf…772e9e | 37 days agoThu, 09 Jul 2026 17:12:57 UTC | 0xfe3c2d…c73e | [0] 0x4141504c0000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd696 |
| 0x375205…16118b | 37 days agoThu, 09 Jul 2026 17:12:56 UTC | 0xfe3c2d…c73e | [0] 0x484f4f440000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd688 |
| 0xb5963c…ed4cf9 | 37 days agoThu, 09 Jul 2026 17:12:00 UTC | 0xfe3c2d…c73e | [0] 0x515151000000…00000000 [1] 0x000000000000…d30c9dce data: 0x000000000000000000…6a4fd62f |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x49c55637…35e325 | Transfer | 5,384,143 | 37 days agoThu, 09 Jul 2026 17:07:04 UTC | 0x0000…0000 | IN | 0x7be5…7c7c | Mint | Robinhood Gift (GIFT) #1178 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2a2040aa…29831a | Transfer | 19,339,447 | 21 days agoSat, 25 Jul 2026 21:39:38 UTC | 0xcaf7…5d11 | IN | 0x7be5…7c7c | $0.001 DIH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x3c4bab…349016 | postPrice | 5,389,508 | 37 days agoThu, 09 Jul 2026 17:16:01 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0xe1ada4…bef97b | postPrice | 5,389,495 | 37 days agoThu, 09 Jul 2026 17:16:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000298 | |
| 0xc2b05d…dab85e | postPrice | 5,389,486 | 37 days agoThu, 09 Jul 2026 17:15:59 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000298 | |
| 0x460094…a029ad | postPrice | 5,389,477 | 37 days agoThu, 09 Jul 2026 17:15:58 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000300 | |
| 0xf89db7…54dfdb | postPrice | 5,389,468 | 37 days agoThu, 09 Jul 2026 17:15:57 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000291 | |
| 0x9841ff…9d3f1d | postPrice | 5,389,459 | 37 days agoThu, 09 Jul 2026 17:15:56 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0xf2667e…b18ff7 | postPrice | 5,388,906 | 37 days agoThu, 09 Jul 2026 17:15:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0x648848…a2c746 | postPrice | 5,388,897 | 37 days agoThu, 09 Jul 2026 17:15:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000307 | |
| 0xca8654…4f3e59 | postPrice | 5,388,888 | 37 days agoThu, 09 Jul 2026 17:14:59 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000298 | |
| 0xbed1b9…66781a | postPrice | 5,388,879 | 37 days agoThu, 09 Jul 2026 17:14:58 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000300 | |
| 0x3e29c3…d1dda9 | postPrice | 5,388,871 | 37 days agoThu, 09 Jul 2026 17:14:57 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000300 | |
| 0x59bf8d…10e9fc | postPrice | 5,388,863 | 37 days agoThu, 09 Jul 2026 17:14:56 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000301 | |
| 0x71242b…669db7 | postPrice | 5,388,305 | 37 days agoThu, 09 Jul 2026 17:14:01 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0x8f113a…8dba28 | postPrice | 5,388,294 | 37 days agoThu, 09 Jul 2026 17:14:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000299 | |
| 0xa5e9db…877785 | postPrice | 5,388,285 | 37 days agoThu, 09 Jul 2026 17:13:59 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000306 | |
| 0xdcb086…c6104d | postPrice | 5,388,274 | 37 days agoThu, 09 Jul 2026 17:13:58 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000301 | |
| 0x8f6a02…102570 | postPrice | 5,388,265 | 37 days agoThu, 09 Jul 2026 17:13:57 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000300 | |
| 0x688a54…19c0a0 | postPrice | 5,388,255 | 37 days agoThu, 09 Jul 2026 17:13:56 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0x168836…6acab9 | postPrice | 5,387,699 | 37 days agoThu, 09 Jul 2026 17:13:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000305 | |
| 0x46384f…00336b | postPrice | 5,387,691 | 37 days agoThu, 09 Jul 2026 17:13:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000296 | |
| 0xf600fa…cc4a0a | postPrice | 5,387,683 | 37 days agoThu, 09 Jul 2026 17:12:59 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000300 | |
| 0xa5e896…abb559 | postPrice | 5,387,674 | 37 days agoThu, 09 Jul 2026 17:12:58 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0xbc93bf…772e9e | postPrice | 5,387,666 | 37 days agoThu, 09 Jul 2026 17:12:57 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000302 | |
| 0x375205…16118b | postPrice | 5,387,658 | 37 days agoThu, 09 Jul 2026 17:12:56 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000309 | |
| 0xb5963c…ed4cf9 | postPrice | 5,387,101 | 37 days agoThu, 09 Jul 2026 17:12:00 UTC | 0xb406…9dce | IN | HoodStockPriceOracle | $0.000 ETH | 0.00000294 |