From 48879ac8084069dfbc4c45cb2cde3944b328508f Mon Sep 17 00:00:00 2001 From: fmrmf Date: Thu, 22 Sep 2022 17:19:16 -0400 Subject: [PATCH] init xmons collection analysis --- contracts/solmate/tokens/ERC1155.sol | 257 ++++ contracts/solmate/tokens/ERC721.sol | 231 ++++ notebook/sudo-ape.ipynb | 1843 +++++++++++++++++++++++--- 3 files changed, 2157 insertions(+), 174 deletions(-) create mode 100644 contracts/solmate/tokens/ERC1155.sol create mode 100644 contracts/solmate/tokens/ERC721.sol diff --git a/contracts/solmate/tokens/ERC1155.sol b/contracts/solmate/tokens/ERC1155.sol new file mode 100644 index 0000000..cff0f02 --- /dev/null +++ b/contracts/solmate/tokens/ERC1155.sol @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Minimalist and gas efficient standard ERC1155 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) +abstract contract ERC1155 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event TransferSingle( + address indexed operator, + address indexed from, + address indexed to, + uint256 id, + uint256 amount + ); + + event TransferBatch( + address indexed operator, + address indexed from, + address indexed to, + uint256[] ids, + uint256[] amounts + ); + + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + event URI(string value, uint256 indexed id); + + /*////////////////////////////////////////////////////////////// + ERC1155 STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(address => mapping(uint256 => uint256)) public balanceOf; + + mapping(address => mapping(address => bool)) public isApprovedForAll; + + /*////////////////////////////////////////////////////////////// + METADATA LOGIC + //////////////////////////////////////////////////////////////*/ + + function uri(uint256 id) public view virtual returns (string memory); + + /*////////////////////////////////////////////////////////////// + ERC1155 LOGIC + //////////////////////////////////////////////////////////////*/ + + function setApprovalForAll(address operator, bool approved) public virtual { + isApprovedForAll[msg.sender][operator] = approved; + + emit ApprovalForAll(msg.sender, operator, approved); + } + + function safeTransferFrom( + address from, + address to, + uint256 id, + uint256 amount, + bytes calldata data + ) public virtual { + require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); + + balanceOf[from][id] -= amount; + balanceOf[to][id] += amount; + + emit TransferSingle(msg.sender, from, to, id, amount); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == + ERC1155TokenReceiver.onERC1155Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function safeBatchTransferFrom( + address from, + address to, + uint256[] calldata ids, + uint256[] calldata amounts, + bytes calldata data + ) public virtual { + require(ids.length == amounts.length, "LENGTH_MISMATCH"); + + require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); + + // Storing these outside the loop saves ~15 gas per iteration. + uint256 id; + uint256 amount; + + for (uint256 i = 0; i < ids.length; ) { + id = ids[i]; + amount = amounts[i]; + + balanceOf[from][id] -= amount; + balanceOf[to][id] += amount; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, from, to, ids, amounts); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == + ERC1155TokenReceiver.onERC1155BatchReceived.selector, + "UNSAFE_RECIPIENT" + ); + } + + function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) + public + view + virtual + returns (uint256[] memory balances) + { + require(owners.length == ids.length, "LENGTH_MISMATCH"); + + balances = new uint256[](owners.length); + + // Unchecked because the only math done is incrementing + // the array index counter which cannot possibly overflow. + unchecked { + for (uint256 i = 0; i < owners.length; ++i) { + balances[i] = balanceOf[owners[i]][ids[i]]; + } + } + } + + /*////////////////////////////////////////////////////////////// + ERC165 LOGIC + //////////////////////////////////////////////////////////////*/ + + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return + interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 + interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 + interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint( + address to, + uint256 id, + uint256 amount, + bytes memory data + ) internal virtual { + balanceOf[to][id] += amount; + + emit TransferSingle(msg.sender, address(0), to, id, amount); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == + ERC1155TokenReceiver.onERC1155Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _batchMint( + address to, + uint256[] memory ids, + uint256[] memory amounts, + bytes memory data + ) internal virtual { + uint256 idsLength = ids.length; // Saves MLOADs. + + require(idsLength == amounts.length, "LENGTH_MISMATCH"); + + for (uint256 i = 0; i < idsLength; ) { + balanceOf[to][ids[i]] += amounts[i]; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, address(0), to, ids, amounts); + + require( + to.code.length == 0 + ? to != address(0) + : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == + ERC1155TokenReceiver.onERC1155BatchReceived.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _batchBurn( + address from, + uint256[] memory ids, + uint256[] memory amounts + ) internal virtual { + uint256 idsLength = ids.length; // Saves MLOADs. + + require(idsLength == amounts.length, "LENGTH_MISMATCH"); + + for (uint256 i = 0; i < idsLength; ) { + balanceOf[from][ids[i]] -= amounts[i]; + + // An array can't have a total length + // larger than the max uint256 value. + unchecked { + ++i; + } + } + + emit TransferBatch(msg.sender, from, address(0), ids, amounts); + } + + function _burn( + address from, + uint256 id, + uint256 amount + ) internal virtual { + balanceOf[from][id] -= amount; + + emit TransferSingle(msg.sender, from, address(0), id, amount); + } +} + +/// @notice A generic interface for a contract which properly accepts ERC1155 tokens. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) +abstract contract ERC1155TokenReceiver { + function onERC1155Received( + address, + address, + uint256, + uint256, + bytes calldata + ) external virtual returns (bytes4) { + return ERC1155TokenReceiver.onERC1155Received.selector; + } + + function onERC1155BatchReceived( + address, + address, + uint256[] calldata, + uint256[] calldata, + bytes calldata + ) external virtual returns (bytes4) { + return ERC1155TokenReceiver.onERC1155BatchReceived.selector; + } +} diff --git a/contracts/solmate/tokens/ERC721.sol b/contracts/solmate/tokens/ERC721.sol new file mode 100644 index 0000000..b47f271 --- /dev/null +++ b/contracts/solmate/tokens/ERC721.sol @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity >=0.8.0; + +/// @notice Modern, minimalist, and gas efficient ERC-721 implementation. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) +abstract contract ERC721 { + /*////////////////////////////////////////////////////////////// + EVENTS + //////////////////////////////////////////////////////////////*/ + + event Transfer(address indexed from, address indexed to, uint256 indexed id); + + event Approval(address indexed owner, address indexed spender, uint256 indexed id); + + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); + + /*////////////////////////////////////////////////////////////// + METADATA STORAGE/LOGIC + //////////////////////////////////////////////////////////////*/ + + string public name; + + string public symbol; + + function tokenURI(uint256 id) public view virtual returns (string memory); + + /*////////////////////////////////////////////////////////////// + ERC721 BALANCE/OWNER STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(uint256 => address) internal _ownerOf; + + mapping(address => uint256) internal _balanceOf; + + function ownerOf(uint256 id) public view virtual returns (address owner) { + require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); + } + + function balanceOf(address owner) public view virtual returns (uint256) { + require(owner != address(0), "ZERO_ADDRESS"); + + return _balanceOf[owner]; + } + + /*////////////////////////////////////////////////////////////// + ERC721 APPROVAL STORAGE + //////////////////////////////////////////////////////////////*/ + + mapping(uint256 => address) public getApproved; + + mapping(address => mapping(address => bool)) public isApprovedForAll; + + /*////////////////////////////////////////////////////////////// + CONSTRUCTOR + //////////////////////////////////////////////////////////////*/ + + constructor(string memory _name, string memory _symbol) { + name = _name; + symbol = _symbol; + } + + /*////////////////////////////////////////////////////////////// + ERC721 LOGIC + //////////////////////////////////////////////////////////////*/ + + function approve(address spender, uint256 id) public virtual { + address owner = _ownerOf[id]; + + require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); + + getApproved[id] = spender; + + emit Approval(owner, spender, id); + } + + function setApprovalForAll(address operator, bool approved) public virtual { + isApprovedForAll[msg.sender][operator] = approved; + + emit ApprovalForAll(msg.sender, operator, approved); + } + + function transferFrom( + address from, + address to, + uint256 id + ) public virtual { + require(from == _ownerOf[id], "WRONG_FROM"); + + require(to != address(0), "INVALID_RECIPIENT"); + + require( + msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], + "NOT_AUTHORIZED" + ); + + // Underflow of the sender's balance is impossible because we check for + // ownership above and the recipient's balance can't realistically overflow. + unchecked { + _balanceOf[from]--; + + _balanceOf[to]++; + } + + _ownerOf[id] = to; + + delete getApproved[id]; + + emit Transfer(from, to, id); + } + + function safeTransferFrom( + address from, + address to, + uint256 id + ) public virtual { + transferFrom(from, to, id); + + require( + to.code.length == 0 || + ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == + ERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function safeTransferFrom( + address from, + address to, + uint256 id, + bytes calldata data + ) public virtual { + transferFrom(from, to, id); + + require( + to.code.length == 0 || + ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == + ERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + /*////////////////////////////////////////////////////////////// + ERC165 LOGIC + //////////////////////////////////////////////////////////////*/ + + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return + interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 + interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 + interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata + } + + /*////////////////////////////////////////////////////////////// + INTERNAL MINT/BURN LOGIC + //////////////////////////////////////////////////////////////*/ + + function _mint(address to, uint256 id) internal virtual { + require(to != address(0), "INVALID_RECIPIENT"); + + require(_ownerOf[id] == address(0), "ALREADY_MINTED"); + + // Counter overflow is incredibly unrealistic. + unchecked { + _balanceOf[to]++; + } + + _ownerOf[id] = to; + + emit Transfer(address(0), to, id); + } + + function _burn(uint256 id) internal virtual { + address owner = _ownerOf[id]; + + require(owner != address(0), "NOT_MINTED"); + + // Ownership check above ensures no underflow. + unchecked { + _balanceOf[owner]--; + } + + delete _ownerOf[id]; + + delete getApproved[id]; + + emit Transfer(owner, address(0), id); + } + + /*////////////////////////////////////////////////////////////// + INTERNAL SAFE MINT LOGIC + //////////////////////////////////////////////////////////////*/ + + function _safeMint(address to, uint256 id) internal virtual { + _mint(to, id); + + require( + to.code.length == 0 || + ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == + ERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } + + function _safeMint( + address to, + uint256 id, + bytes memory data + ) internal virtual { + _mint(to, id); + + require( + to.code.length == 0 || + ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == + ERC721TokenReceiver.onERC721Received.selector, + "UNSAFE_RECIPIENT" + ); + } +} + +/// @notice A generic interface for a contract which properly accepts ERC721 tokens. +/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) +abstract contract ERC721TokenReceiver { + function onERC721Received( + address, + address, + uint256, + bytes calldata + ) external virtual returns (bytes4) { + return ERC721TokenReceiver.onERC721Received.selector; + } +} diff --git a/notebook/sudo-ape.ipynb b/notebook/sudo-ape.ipynb index ea45f36..138661e 100644 --- a/notebook/sudo-ape.ipynb +++ b/notebook/sudo-ape.ipynb @@ -18,6 +18,8 @@ " - has no data so need to look at Transfer event for volume\n", " 3. SpotPriceUpdate(uint128 newSpotPrice)\n", " - emitted by LSSVMPair on spot price changes: use to track price changes\n", + "\n", + "Look at all pair contracts for a particular NFT collection.\n", "\"\"\"\n", "# switch to sudo-ape wd first for ape project to work properly\n", "import os\n", @@ -91,7 +93,7 @@ { "data": { "text/plain": [ - "15562955" + "15591287" ] }, "execution_count": 6, @@ -151,13 +153,13 @@ { "cell_type": "code", "execution_count": 9, - "id": "08870007", + "id": "677f01aa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 9, @@ -166,20 +168,21 @@ } ], "source": [ - "sudo_factory = Contract(\"0xb16c1342E617A5B6E4b631EB114483FDB289c0A4\")\n", - "sudo_factory" + "# look at xmons nft\n", + "sudo_pair_xmons = Contract(\"0x5caf332dca4e6c9e69d52f320c21e74845353db0\")\n", + "sudo_pair_xmons" ] }, { "cell_type": "code", "execution_count": 10, - "id": "f3e3cfdc", + "id": "a08d93ee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "NewPair(address poolAddress)" + "2" ] }, "execution_count": 10, @@ -188,41 +191,20 @@ } ], "source": [ - "sudo_factory.NewPair" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "ff547fad", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# use address of top xmons pool to check is pool thru factory\n", - "sudo_factory.isPair(\"0x5caf332dca4e6c9e69d52f320c21e74845353db0\", 0)" + "# TRADE pool type\n", + "sudo_pair_xmons.poolType()" ] }, { "cell_type": "code", "execution_count": 12, - "id": "677f01aa", + "id": "d292d761", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 12, @@ -231,35 +213,35 @@ } ], "source": [ - "sudo_pair_xmons = Contract(\"0x5caf332dca4e6c9e69d52f320c21e74845353db0\")\n", - "sudo_pair_xmons" + "# look at xmons as the collection of choice\n", + "collection = project.ERC721.at(sudo_pair_xmons.nft())\n", + "collection" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "a08d93ee", + "execution_count": 15, + "id": "c0d50f9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "2" + "8" ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# TRADE pool type\n", - "sudo_pair_xmons.poolType()" + "collection.balanceOf(sudo_pair_xmons.address)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "id": "53363718", "metadata": {}, "outputs": [ @@ -269,7 +251,7 @@ "SpotPriceUpdate(uint128 newSpotPrice)" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -280,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "id": "bc299ab2", "metadata": {}, "outputs": [ @@ -289,8 +271,8 @@ "output_type": "stream", "text": [ "INFO: Cache database has not been initialized\n", - "CPU times: user 29.5 s, sys: 3.99 s, total: 33.5 s\n", - "Wall time: 5min 27s\n" + "CPU times: user 34.4 s, sys: 5.22 s, total: 39.7 s\n", + "Wall time: 5min 35s\n" ] }, { @@ -392,63 +374,63 @@ " ...\n", " \n", " \n", - " 61\n", + " 65\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 17330097087378640000}\n", - " 0x2946f9b515e1b1144a2a2a7de75e111bdc1700485e16...\n", - " 15460128\n", - " 0xbe6bdd7ff1c6ead20430c3ca591031e3cab7165b492d...\n", - " 79\n", - " 52\n", + " {'newSpotPrice': 12330097087378640000}\n", + " 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7...\n", + " 15505080\n", + " 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1...\n", + " 165\n", + " 59\n", " \n", " \n", - " 62\n", + " 66\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 14830097087378640000}\n", - " 0xc5dd46e77a6a15f76f76b34bebc89c57a0a7436febb7...\n", - " 15460372\n", - " 0x46a34b7810110fe9171b49155170a0a8af02658675e5...\n", - " 190\n", - " 127\n", + " {'newSpotPrice': 9830097087378640000}\n", + " 0x2273b1ee002469d36c8b6243ac2241f962d48be23e51...\n", + " 15566325\n", + " 0x94339536bdd0a046f8fe43afe2703cd134d413afc038...\n", + " 46\n", + " 18\n", " \n", " \n", - " 63\n", + " 67\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 17330097087378640000}\n", - " 0x15592fc9f37ff3366ca8cec45612d9b4dc6eec6b76ac...\n", - " 15462678\n", - " 0xa641413250e702a7032da1803bd91a6a9095ab11e9ec...\n", - " 58\n", - " 37\n", + " {'newSpotPrice': 7330097087378640000}\n", + " 0x8588ea80a7780252093702a413d4600377a8cba6fd9c...\n", + " 15575241\n", + " 0x53efeb4588aee9ddd5fea76f3cfd979348009fdb5882...\n", + " 42\n", + " 29\n", " \n", " \n", - " 64\n", + " 68\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 14830097087378640000}\n", - " 0xe920b32111dc1c0691333c4880b495a944560a181646...\n", - " 15487756\n", - " 0xc545a2b6d360c6653972c1b1a52b1d90d7f59bcb9246...\n", - " 52\n", - " 81\n", + " {'newSpotPrice': 9830097087378640000}\n", + " 0xa0a2ad72904b9f51151b963e8f89d49d539a2c6251b5...\n", + " 15582614\n", + " 0x3216cd4243114573016a8928257f60eb568784369e73...\n", + " 8\n", + " 7\n", " \n", " \n", - " 65\n", + " 69\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 12330097087378640000}\n", - " 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7...\n", - " 15505080\n", - " 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1...\n", - " 165\n", - " 59\n", + " {'newSpotPrice': 7330097087378640000}\n", + " 0x0f0c92c52a66419cf127e6d95465200306c53ba0f614...\n", + " 15583837\n", + " 0xac80c3a0f4b64fbcb0512cf4bcbfc67f77cb37a6bd36...\n", + " 82\n", + " 37\n", " \n", " \n", "\n", - "

66 rows × 8 columns

\n", + "

70 rows × 8 columns

\n", "" ], "text/plain": [ @@ -459,11 +441,11 @@ "3 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "4 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", ".. ... ... \n", - "61 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "62 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "63 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "64 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "65 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "66 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "67 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "68 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "69 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "\n", " event_arguments \\\n", "0 {'newSpotPrice': 9077669902912621000} \n", @@ -472,11 +454,11 @@ "3 {'newSpotPrice': 11577669902912621000} \n", "4 {'newSpotPrice': 9077669902912621000} \n", ".. ... \n", - "61 {'newSpotPrice': 17330097087378640000} \n", - "62 {'newSpotPrice': 14830097087378640000} \n", - "63 {'newSpotPrice': 17330097087378640000} \n", - "64 {'newSpotPrice': 14830097087378640000} \n", "65 {'newSpotPrice': 12330097087378640000} \n", + "66 {'newSpotPrice': 9830097087378640000} \n", + "67 {'newSpotPrice': 7330097087378640000} \n", + "68 {'newSpotPrice': 9830097087378640000} \n", + "69 {'newSpotPrice': 7330097087378640000} \n", "\n", " transaction_hash block_number \\\n", "0 0x195069bfc2a5e1ee78ee3cd8114fdfce8c0d482036d3... 15198846 \n", @@ -485,11 +467,11 @@ "3 0x414ea41198833a399a68c9b66456047bc6dd349330d7... 15208415 \n", "4 0x28758b8d0ad21047a93b75089e210e0ca85f652842ef... 15218330 \n", ".. ... ... \n", - "61 0x2946f9b515e1b1144a2a2a7de75e111bdc1700485e16... 15460128 \n", - "62 0xc5dd46e77a6a15f76f76b34bebc89c57a0a7436febb7... 15460372 \n", - "63 0x15592fc9f37ff3366ca8cec45612d9b4dc6eec6b76ac... 15462678 \n", - "64 0xe920b32111dc1c0691333c4880b495a944560a181646... 15487756 \n", "65 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7... 15505080 \n", + "66 0x2273b1ee002469d36c8b6243ac2241f962d48be23e51... 15566325 \n", + "67 0x8588ea80a7780252093702a413d4600377a8cba6fd9c... 15575241 \n", + "68 0xa0a2ad72904b9f51151b963e8f89d49d539a2c6251b5... 15582614 \n", + "69 0x0f0c92c52a66419cf127e6d95465200306c53ba0f614... 15583837 \n", "\n", " block_hash log_index \\\n", "0 0xd3b29ce639c43280c2a194b638e07a5e1541824210aa... 54 \n", @@ -498,11 +480,11 @@ "3 0x36dce9b484abf8db83699dabf5d63cbca4b9f68cc7e2... 120 \n", "4 0x10112e7b56853191c7e46d36f0cca7431be567982f5c... 73 \n", ".. ... ... \n", - "61 0xbe6bdd7ff1c6ead20430c3ca591031e3cab7165b492d... 79 \n", - "62 0x46a34b7810110fe9171b49155170a0a8af02658675e5... 190 \n", - "63 0xa641413250e702a7032da1803bd91a6a9095ab11e9ec... 58 \n", - "64 0xc545a2b6d360c6653972c1b1a52b1d90d7f59bcb9246... 52 \n", "65 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1... 165 \n", + "66 0x94339536bdd0a046f8fe43afe2703cd134d413afc038... 46 \n", + "67 0x53efeb4588aee9ddd5fea76f3cfd979348009fdb5882... 42 \n", + "68 0x3216cd4243114573016a8928257f60eb568784369e73... 8 \n", + "69 0xac80c3a0f4b64fbcb0512cf4bcbfc67f77cb37a6bd36... 82 \n", "\n", " transaction_index \n", "0 37 \n", @@ -511,21 +493,22 @@ "3 56 \n", "4 59 \n", ".. ... \n", - "61 52 \n", - "62 127 \n", - "63 37 \n", - "64 81 \n", "65 59 \n", + "66 18 \n", + "67 29 \n", + "68 7 \n", + "69 37 \n", "\n", - "[66 rows x 8 columns]" + "[70 rows x 8 columns]" ] }, - "execution_count": 15, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# start with top pool for collection first\n", "# get start block from query_pairs IF query can't handle when start_block < contract creation block (it can, woot)\n", "%time query_prices_xmons = sudo_pair_xmons.SpotPriceUpdate.query('*', start_block=start_block)\n", "query_prices_xmons" @@ -533,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "e2df6428", "metadata": {}, "outputs": [], @@ -549,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "f6cb50dc", "metadata": {}, "outputs": [], @@ -559,7 +542,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "d6016528", "metadata": {}, "outputs": [ @@ -669,68 +652,68 @@ " ...\n", " \n", " \n", - " 61\n", + " 65\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 17330097087378640000}\n", - " 0x2946f9b515e1b1144a2a2a7de75e111bdc1700485e16...\n", - " 15460128\n", - " 0xbe6bdd7ff1c6ead20430c3ca591031e3cab7165b492d...\n", - " 79\n", - " 52\n", - " 17330097087378640000\n", + " {'newSpotPrice': 12330097087378640000}\n", + " 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7...\n", + " 15505080\n", + " 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1...\n", + " 165\n", + " 59\n", + " 12330097087378640000\n", " \n", " \n", - " 62\n", + " 66\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 14830097087378640000}\n", - " 0xc5dd46e77a6a15f76f76b34bebc89c57a0a7436febb7...\n", - " 15460372\n", - " 0x46a34b7810110fe9171b49155170a0a8af02658675e5...\n", - " 190\n", - " 127\n", - " 14830097087378640000\n", + " {'newSpotPrice': 9830097087378640000}\n", + " 0x2273b1ee002469d36c8b6243ac2241f962d48be23e51...\n", + " 15566325\n", + " 0x94339536bdd0a046f8fe43afe2703cd134d413afc038...\n", + " 46\n", + " 18\n", + " 9830097087378640000\n", " \n", " \n", - " 63\n", + " 67\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 17330097087378640000}\n", - " 0x15592fc9f37ff3366ca8cec45612d9b4dc6eec6b76ac...\n", - " 15462678\n", - " 0xa641413250e702a7032da1803bd91a6a9095ab11e9ec...\n", - " 58\n", - " 37\n", - " 17330097087378640000\n", + " {'newSpotPrice': 7330097087378640000}\n", + " 0x8588ea80a7780252093702a413d4600377a8cba6fd9c...\n", + " 15575241\n", + " 0x53efeb4588aee9ddd5fea76f3cfd979348009fdb5882...\n", + " 42\n", + " 29\n", + " 7330097087378640000\n", " \n", " \n", - " 64\n", + " 68\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 14830097087378640000}\n", - " 0xe920b32111dc1c0691333c4880b495a944560a181646...\n", - " 15487756\n", - " 0xc545a2b6d360c6653972c1b1a52b1d90d7f59bcb9246...\n", - " 52\n", - " 81\n", - " 14830097087378640000\n", + " {'newSpotPrice': 9830097087378640000}\n", + " 0xa0a2ad72904b9f51151b963e8f89d49d539a2c6251b5...\n", + " 15582614\n", + " 0x3216cd4243114573016a8928257f60eb568784369e73...\n", + " 8\n", + " 7\n", + " 9830097087378640000\n", " \n", " \n", - " 65\n", + " 69\n", " SpotPriceUpdate\n", " 0x5caF332DcA4e6C9E69d52F320c21e74845353db0\n", - " {'newSpotPrice': 12330097087378640000}\n", - " 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7...\n", - " 15505080\n", - " 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1...\n", - " 165\n", - " 59\n", - " 12330097087378640000\n", + " {'newSpotPrice': 7330097087378640000}\n", + " 0x0f0c92c52a66419cf127e6d95465200306c53ba0f614...\n", + " 15583837\n", + " 0xac80c3a0f4b64fbcb0512cf4bcbfc67f77cb37a6bd36...\n", + " 82\n", + " 37\n", + " 7330097087378640000\n", " \n", " \n", "\n", - "

66 rows × 9 columns

\n", + "

70 rows × 9 columns

\n", "" ], "text/plain": [ @@ -741,11 +724,11 @@ "3 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "4 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", ".. ... ... \n", - "61 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "62 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "63 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", - "64 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "65 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "66 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "67 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "68 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "69 SpotPriceUpdate 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", "\n", " event_arguments \\\n", "0 {'newSpotPrice': 9077669902912621000} \n", @@ -754,11 +737,11 @@ "3 {'newSpotPrice': 11577669902912621000} \n", "4 {'newSpotPrice': 9077669902912621000} \n", ".. ... \n", - "61 {'newSpotPrice': 17330097087378640000} \n", - "62 {'newSpotPrice': 14830097087378640000} \n", - "63 {'newSpotPrice': 17330097087378640000} \n", - "64 {'newSpotPrice': 14830097087378640000} \n", "65 {'newSpotPrice': 12330097087378640000} \n", + "66 {'newSpotPrice': 9830097087378640000} \n", + "67 {'newSpotPrice': 7330097087378640000} \n", + "68 {'newSpotPrice': 9830097087378640000} \n", + "69 {'newSpotPrice': 7330097087378640000} \n", "\n", " transaction_hash block_number \\\n", "0 0x195069bfc2a5e1ee78ee3cd8114fdfce8c0d482036d3... 15198846 \n", @@ -767,11 +750,11 @@ "3 0x414ea41198833a399a68c9b66456047bc6dd349330d7... 15208415 \n", "4 0x28758b8d0ad21047a93b75089e210e0ca85f652842ef... 15218330 \n", ".. ... ... \n", - "61 0x2946f9b515e1b1144a2a2a7de75e111bdc1700485e16... 15460128 \n", - "62 0xc5dd46e77a6a15f76f76b34bebc89c57a0a7436febb7... 15460372 \n", - "63 0x15592fc9f37ff3366ca8cec45612d9b4dc6eec6b76ac... 15462678 \n", - "64 0xe920b32111dc1c0691333c4880b495a944560a181646... 15487756 \n", "65 0xeec0e2fab623449d8cfe05883a3fce73774c490a69b7... 15505080 \n", + "66 0x2273b1ee002469d36c8b6243ac2241f962d48be23e51... 15566325 \n", + "67 0x8588ea80a7780252093702a413d4600377a8cba6fd9c... 15575241 \n", + "68 0xa0a2ad72904b9f51151b963e8f89d49d539a2c6251b5... 15582614 \n", + "69 0x0f0c92c52a66419cf127e6d95465200306c53ba0f614... 15583837 \n", "\n", " block_hash log_index \\\n", "0 0xd3b29ce639c43280c2a194b638e07a5e1541824210aa... 54 \n", @@ -780,11 +763,11 @@ "3 0x36dce9b484abf8db83699dabf5d63cbca4b9f68cc7e2... 120 \n", "4 0x10112e7b56853191c7e46d36f0cca7431be567982f5c... 73 \n", ".. ... ... \n", - "61 0xbe6bdd7ff1c6ead20430c3ca591031e3cab7165b492d... 79 \n", - "62 0x46a34b7810110fe9171b49155170a0a8af02658675e5... 190 \n", - "63 0xa641413250e702a7032da1803bd91a6a9095ab11e9ec... 58 \n", - "64 0xc545a2b6d360c6653972c1b1a52b1d90d7f59bcb9246... 52 \n", "65 0x188da61234954d9150e4ee3e72f84b3fc663bae565c1... 165 \n", + "66 0x94339536bdd0a046f8fe43afe2703cd134d413afc038... 46 \n", + "67 0x53efeb4588aee9ddd5fea76f3cfd979348009fdb5882... 42 \n", + "68 0x3216cd4243114573016a8928257f60eb568784369e73... 8 \n", + "69 0xac80c3a0f4b64fbcb0512cf4bcbfc67f77cb37a6bd36... 82 \n", "\n", " transaction_index newSpotPrice \n", "0 37 9077669902912621000 \n", @@ -793,28 +776,28 @@ "3 56 11577669902912621000 \n", "4 59 9077669902912621000 \n", ".. ... ... \n", - "61 52 17330097087378640000 \n", - "62 127 14830097087378640000 \n", - "63 37 17330097087378640000 \n", - "64 81 14830097087378640000 \n", "65 59 12330097087378640000 \n", + "66 18 9830097087378640000 \n", + "67 29 7330097087378640000 \n", + "68 7 9830097087378640000 \n", + "69 37 7330097087378640000 \n", "\n", - "[66 rows x 9 columns]" + "[70 rows x 9 columns]" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# only 64 price updates for this pool over the last 44 days since deployed (not much)\n", + "# only 70 price updates for this pool over the last 63 days since deployed (not much)\n", "query_prices_xmons" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "f9cfebc7", "metadata": {}, "outputs": [ @@ -824,13 +807,13 @@ "" ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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AHyZUxdB79q1S6NGjVKnTp108OBB7du3Tz179tSf//xnFRQU6N1333VHrB7DRdANY/bi+uUfr6wz0zMAwLPcfhH07Nmzdf/992v+/PkKDg62lt9888265557nNkk/ERcBIlPfRgXAPAvTp0C++abb/S73/2uTvlll12m4uLiZgcFAADgTk4lQIGBgSovL69T/n//93+KjIxsdlAAAADu5FQCdOutt+q5557TuXPnJEkWi0UFBQV64okn9Otf/9qlAQIAALiaUwnQggULVFFRoaioKP30008aOXKkevfurY4dO+q//uu/XB0jAACASzl1EXRoaKjWr1+v7Oxs/etf/1JFRYWuvfZajR492tXxAQAAuJzTc4FlZGQoIyNDx44dU21trc2ypUuXuiQ4b+E2eAAA/I/bb4OfO3eunnvuOV1//fWKiYmRxWJxKlAAAABvcCoBev3115Wenq7//M//dHU8AAAAbufURdBnz57VsGHDXB0LAACARziVAD3wwANavny5q2MBAADwCKdOgZ05c0ZvvvmmvvjiCw0YMEBt2rSxWf7yyy+7JDgAAAB3cCoB2rVrlwYNGiRJ2r17t80yLogGAAC+zqkEaMOGDa6OAwAAwGOcugYIAADAn5EAAQAA0yEBAgAApkMCBAAATIcECAAAmI5XE6CNGzdqwoQJio2NlcVi0erVqxutn5mZKYvFUudVXFxsU2/x4sXq0aOH2rVrp4SEBG3bts2NvQAAAP7GqwlQZWWlBg4cqMWLFzu03r59+1RUVGR9RUVFWZe9//77mj17tp555hl9++23GjhwoMaOHatjx465OnwAAOCnnHoOkKuMHz9e48ePd3i9qKgoderUqd5lL7/8sh588EHdf//9ki5M3Prpp59q6dKlevLJJ5sTLgAAaCH88hqgQYMGKSYmRjfddJOys7Ot5WfPntWOHTs0evRoa1mrVq00evRobd682RuhAgAAH+TVI0COiomJ0euvv67rr79e1dXVWrJkiZKTk7V161Zde+21On78uGpqatSlSxeb9bp06aIffvihwe1WV1erurra+r68vNxtfQCa60BJhQ6drFKP8A6Ki+jg9vV8Zfv+GgvM7eK+GGCxqMYwrP/11X3TTN8dv0qA+vXrp379+lnfDxs2TPv379df//pX/e///q/T201LS9PcuXNdESLgNqVVZzVzRY42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YDokQAAAwHRIgAAAgOmQAAEAANMhAQLgsOTkZM2aNavB5T169NDChQtd1p6rt+cpTY0TYDYbN27UhAkTFBsbK4vFotWrVzu0/rPPPiuLxVLn1aFDB4djIQECAAAeUVlZqYEDB2rx4sVOrT9nzhwVFRXZvK688krdcccdDm+LBAgA/EhNTY1qa2u9HQbglPHjx+uFF17Q7bffXu/y6upqzZkzR5dddpk6dOighIQEZWZmWpd37NhR0dHR1tfRo0f1/fffa9q0aQ7HQgIEwCnnz5/X9OnTFRoaqoiICD311FNqaGrBgoIC3XbbberYsaNCQkJ055136ujRozZ1PvnkEw0ePFjt2rVTREREg38gJWnJkiXq1KmTMjIymowzOTlZM2fO1OOPP66wsDBFR0fr2WeftS4/ePCgLBaLcnJyrGWlpaWyWCzWP7yZmZmyWCxau3at4uPjFRQUpF/84hc6duyY/vnPf6p///4KCQnRPffco6qqKofGqak/+Onp6erUqZM+/vhjXXnllQoMDFRBQUGT/Qb80fTp07V582atXLlSu3bt0h133KFx48YpNze33vpLlixR3759NWLECIfbIgEC4JR33nlHrVu31rZt2/TKK6/o5Zdf1pIlS+rUq62t1W233aaTJ08qKytL69ev14EDB3TXXXdZ63z66ae6/fbbdfPNN2vnzp3KyMjQkCFD6m13/vz5evLJJ7Vu3TqNGjXK7lg7dOigrVu3av78+Xruuee0fv16h/v87LPP6tVXX9XXX3+twsJC3XnnnVq4cKGWL1+uTz/9VOvWrdOiRYvqtN3YONnzB7+qqkrz5s3TkiVLtGfPHkVFRTkcO+DrCgoKtGzZMn344YcaMWKEevXqpTlz5uiGG27QsmXL6tQ/c+aM/v73vzt19EeS5LZ55gG0WCNHjjT69+9v1NbWWsueeOIJo3///oZhGEb37t2Nv/71r4ZhGMa6deuMgIAAo6CgwFp3z549hiRj27ZthmEYRmJionHvvfc22N7F7T3++ONGTEyMsXv3bodiveGGG2zKBg8ebDzxxBOGYRhGfn6+IcnYuXOndfmpU6cMScaGDRsMwzCMDRs2GJKML774wlonLS3NkGTs37/fWva73/3OGDt2rE3bjY3ToUOHjICAAOPw4cM28Y0aNcpITU01DMMwli1bZkgycnJy7O4z4A8kGatWrbK+X7NmjSHJ6NChg82rdevWxp133lln/eXLlxutW7c2iouLnWq/tZOJGgCTGzp0qCwWi/V9YmKiFixYoJqaGpt6e/fuVbdu3dStWzdr2ZVXXqlOnTpp7969Gjx4sHJycvTggw822t6CBQtUWVmp7du3q2fPng7FOmDAAJv3MTExOnbsmEPbuHQ7Xbp0Ufv27W1i6dKli7Zt22azTmPj9N1336mmpkZ9+/a1Wae6ulrh4eHW923btq3TB6ClqaioUEBAgHbs2KGAgACbZR07dqxTf8mSJfrlL3+pLl26ONUeCRAArwsKCmqyzogRI/Tpp5/qgw8+0JNPPunQ9tu0aWPz3mKxWC8kbtXqwpUAxs+uyzl37lyT27FYLI1u1x72/sEPCgqySaKAlig+Pl41NTU6duxYk9f05Ofna8OGDfr444+dbo8ECIBTtm7davN+y5Yt6tOnT50f8v79+6uwsFCFhYXWo0Dff/+9SktLdeWVV0q6cGQlIyND999/f4PtDRkyRNOnT9e4cePUunVrzZkzxyX9iIyMlCQVFRUpPj5ekmwuiG6uxsbJkT/4QEtQUVGhvLw86/v8/Hzl5OQoLCxMffv21b333qvJkydrwYIFio+PV0lJiTIyMjRgwADdcsst1vWWLl2qmJgYjR8/3ulYSIAAOKWgoECzZ8/W7373O3377bdatGiRFixYUKfe6NGjdc011+jee+/VwoULdf78ef3hD3/QyJEjdf3110uSnnnmGY0aNUq9evXS3XffrfPnz+uzzz7TE088YbOtYcOG6bPPPtP48ePVunVrlzxkMCgoSEOHDtWLL76ouLg4HTt2TH/+85+bvd2LGhsnR/7gAy3B9u3bdeONN1rfz549W5I0ZcoUpaena9myZXrhhRf06KOP6vDhw4qIiNDQoUP1y1/+0rpObW2t0tPTNXXq1Dr/4HIECRAAp0yePFk//fSThgwZooCAAD388MP67W9/W6eexWLRRx99pBkzZigpKUmtWrXSuHHjbO6WSk5O1ocffqjnn39eL774okJCQpSUlFRvuzfccIM+/fRT3XzzzQoICNCMGTOa3ZelS5dq2rRpuu6669SvXz/Nnz9fY8aMafZ2pabHyZ4/+EBLkZyc3ODjMqQLp5nnzp2ruXPnNlinVatWKiwsbHYsFqOxSAAAAFogngMEAABMhwQIgN8qKChQx44dG3zxxGQADeEUGAC/df78eR08eLDB5T169FDr1lzqCKAuEiAAAGA6nAIDAACmQwIEAABMhwQIAACYDgkQAAAwHRIgAABgOiRAAADAdEiAAACA6ZAAAQAA0/n/AHPvT47TpuPqAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAHACAYAAABtbFabAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLtUlEQVR4nO3deXgUZbr38V8TIISQBLInEiBIQFSEyBIWCVEYFh0k4xxUxAN6kHEcFhEXxPeIMuOZKIoHdXhFZZMzwzK+R1BxxbBkQBZBIqLIJBAISwJJIAlJNISk3j889KHJWp3e0vl+rquuy6566nnuu6tN31RV12MxDMMQAAAAGqyFuwMAAABoaiigAAAATKKAAgAAMIkCCgAAwCQKKAAAAJMooAAAAEyigAIAADCJAgoAAMAkCigAAACTKKAAAABMooCqR1pamsaOHavo6GhZLBZt2LDB1P4///yzHnjgAfXq1UstW7ZUcnJyje0WL16snj17ys/PTz169NCqVasaHzwAAHAKCqh6lJaWqnfv3lq8eLFd+1dWVsrPz08zZ87UiBEjamzz5ptvau7cuXr++ef1/fffa/78+Zo2bZo++uijxoQOAACcxMJkwg1nsVi0fv16m7NI5eXl+j//5/9ozZo1Kiws1I033qiXXnpJSUlJ1fZ/4IEHVFhYWO0s1uDBgzVkyBC9/PLL1nWPP/64du/ere3btzspGwAAYC/OQDXS9OnTtXPnTq1du1YHDhzQ+PHjNXr0aGVkZDS4j/LycrVp08ZmnZ+fn/bs2aOKigpHhwwAABqJAqoRsrOztWLFCr333nsaOnSorr32Wj3xxBO65ZZbtGLFigb3M2rUKC1dulT79u2TYRjau3evli5dqoqKCuXn5zsxAwAAYI+W7g6gKfvuu+9UWVmp7t2726wvLy9XSEhIg/t59tlnlZubq4EDB8owDEVERGjy5MlasGCBWrSgxgUAwNNQQDVCSUmJfHx8tG/fPvn4+Nhsa9euXYP78fPz0/Lly/XWW2/pzJkzioqK0ttvv62AgACFhYU5OmwAANBIFFCNEB8fr8rKSp09e1ZDhw5tdH+tWrVSx44dJUlr167Vr3/9a85AAQDggSig6lFSUqLMzEzr66ysLKWnpys4OFjdu3fXxIkTNWnSJC1cuFDx8fHKy8tTamqqbrrpJt1xxx2SpB9++EEXL17UuXPndOHCBaWnp0uS+vTpI0n65z//qT179ighIUHnz5/Xq6++qoMHD+rdd991dboAAKABeIxBPbZu3apbb7212vrJkydr5cqVqqio0AsvvKBVq1bp1KlTCg0N1cCBAzV//nz16tVLktSlSxcdP368Wh+X3/pDhw7pvvvu0+HDh9WqVSvdeuuteumll9SjRw/nJgcAAOxCAQUAAGASN9gAAACYRAEFAABgEjeR16CqqkqnT59WQECALBaLu8MBAAANYBiGLly4oOjoaKf/ip0CqganT59WTEyMu8MAAAB2OHHihPWxQM5CAVWDgIAASb8cgMDAQDdHAwAAGqK4uFgxMTHW73FnooCqweXLdoGBgRRQAAA0Ma64/YabyAEAAEyigAIAADCJAgoAAMAkCigAAACTKKAAAABMooACAAAwiQIKAADAJLcWUCkpKerfv78CAgIUHh6u5ORkHT58uM59kpKSZLFYqi133HGHtc0DDzxQbfvo0aOdnQ4AAGgm3PogzW3btmnatGnq37+/Ll26pGeeeUYjR47UDz/8IH9//xr3ef/993Xx4kXr64KCAvXu3Vvjx4+3aTd69GitWLHC+trX19c5SQAAgGbHrQXUZ599ZvN65cqVCg8P1759+5SYmFjjPsHBwTav165dq7Zt21YroHx9fRUZGenYgAEAAORh90AVFRVJql4k1WXZsmW69957q52x2rp1q8LDw9WjRw898sgjKigoqLWP8vJyFRcX2ywAAOloXom2HD6rrPxSd4cCeBSLYRiGu4OQpKqqKt15550qLCzU9u3bG7TPnj17lJCQoN27d2vAgAHW9ZfPSsXGxurIkSN65pln1K5dO+3cuVM+Pj7V+nn++ec1f/78auuLioqYCw9As1RYdlEz16QrLSPPui4xLkxvTIhXUNtWbowMqF1xcbGCgoJc8v3tMQXUI488ok8//VTbt29Xx44dG7TPww8/rJ07d+rAgQN1tjt69KiuvfZaffnllxo+fHi17eXl5SovL7e+vjybMwUUgOZq0rI92pGZr8orviJ8LBYN6RaqVVMG1LEn4D6uLKA84hLe9OnTtXHjRm3ZsqXBxVNpaanWrl2rKVOm1Nu2a9euCg0NVWZmZo3bfX19FRgYaLMAQHN1NK9EaRl5NsWTJFUahtIy8ricB8jNBZRhGJo+fbrWr1+vzZs3KzY2tsH7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plxcNGQ+r6aeIwDAPUwVUJcuXVJlZaV8fX2t686cOaMlS5aotLRUd955p2655RaHBwnnaGrzc5nVkPm8mnqOAAD3MPUcqKlTp2rmzJnW1xcuXFD//v21ePFiff7557r11lv1ySefODxIOEdTm5/LrPrm8/KGHAEA7mGqgNqxY4d++9vfWl+vWrVKlZWVysjI0LfffqvZs2fr5ZdfdniQcJ43JsRrSLdQm3VDuoXqjQnxtezRtLwxIV6D/me6iSsNvjbEa3IEALieqV/h+fv76+DBg4qNjZUk3XXXXerYsaNef/11SdIPP/ygpKQknT171jnRukhz+hXeZU1tfi6zsvJLbebv8sYcAaC589hf4bVp00Y//fST9fWuXbtszji1adNGJSUljosOLhMb6p2F02Xenh8AwLVMXcLr06eP/uu//kuS9I9//ENnzpzRbbfdZt1+5MgRnkQOAAC8nqkzUPPmzdOYMWP097//XTk5OXrggQcUFRVl3b5+/XoNGTLE4UECAAB4ElMF1LBhw7Rv3z598cUXioyM1Pjx42229+nTRwMG8GRnAADg3eyaysXbNcebyAEAaOo89ibyyzp16qSkpCQNGzZMSUlJuvbaax0dFwAAgMcydRP5ZX/+85/Vpk0bvfTSS4qLi1NMTIzuv/9+vfPOO8rIyHB0jAAAAB6l0ZfwcnJytG3bNm3cuFHr1q1TVVWVKisrHRWfW3AJDwCApsfjL+FJUllZmbZv366tW7dqy5Yt2r9/v2688UYlJSU5MDwAAADPY1cBNXjwYO3fv189e/ZUUlKSnn76aSUmJqpDhw6Ojg8AAMDj2HUP1I8//ih/f39dd911uu6669SzZ0+KJwAA0GzYVUAVFBRo8+bNGjhwoD7//HMNGTJE11xzje677z698847jo4RAADAozT6JnLDMLRv3z795S9/0d/+9jduIgcAAG7h8TeRf/PNN9q6dau2bt2q7du368KFC+rVq5dmzJihYcOGOTpGAAAAj2JXATVgwADFx8dr2LBhmjp1qhITExUUFOTo2AAAADySXQXUuXPnuLQFAACaLbtuIg8MDFRhYaGWLl2quXPn6ty5c5J+ubR36tQphwYIAADgaew6A3XgwAENHz5c7du317FjxzR16lQFBwfr/fffV3Z2tlatWuXoOAEAADyGXWegZs+erQcffFAZGRlq06aN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\n", "text/plain": [ "
" ] @@ -840,15 +823,1527 @@ } ], "source": [ + "# initial plot for the top xmons pool\n", "query_prices_xmons.plot(x='block_number', y='newSpotPrice', kind='scatter')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "cdf852f9", "metadata": {}, "outputs": [], + "source": [ + "# load full pairs csv to get all collection\n", + "query_pairs = pd.read_csv('notebook/data/pairs_full.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "e91a1aa6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_namecontract_addressevent_argumentstransaction_hashblock_numberblock_hashlog_indextransaction_indexpoolAddresspoolTypenft
0NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x08142348E6BBf233002b81047bc...0xba75dd0b017667074a1ed080571fee06b3cea5444f25...146507480xf63250e045af2d83fca5535fe3738deffd3c6f17f93b...1590x08142348E6BBf233002b81047bc2f27026af10A510x5Af0D9827E0c53E4799BB226655A1de152A425a5
1NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x518b7160990AD19dcfF0Ba028e2...0x7e33fe2f08ee09a339b127c8658a892600637da3448d...146521890x4b0de468eecdfea07b64168655f129d43d8e56f01f42...41370x518b7160990AD19dcfF0Ba028e245fA616b44F5E10xCa7cA7BcC765F77339bE2d648BA53ce9c8a262bD
2NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x351E40e39ae7D0d60Dc283485bC...0x230624db7d760f3ad189bdebb431ef74b6cd899855d6...146521990x572e74e542e87e141a2176725d7b216133bd0d13dcf5...1501170x351E40e39ae7D0d60Dc283485bC627891Ec1D00E10x521f9C7505005CFA19A8E5786a9c3c9c9F5e6f42
3NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e...0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15...146522230x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e...1421080x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e210x0427743DF720801825a5c82e0582B1E915E0F750
4NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x866C5c02dC07EE37146c4874d70...0x0c2b148a424bb8f25f32ca3ded2c87704cb73ab5b65b...146624270x8f687e0ea159efeb37fd7e65ec00a008e6b96cc1b7ee...1711490x866C5c02dC07EE37146c4874d704D3603bF5D95010xD07e72b00431af84AD438CA995Fd9a7F0207542d
....................................
30990NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x9AAa20179145C9153a36Bbf71e2...0x35feb962e106bfbd16bb949605d171bda649c015621d...155615620x7fe005a4046800acc48f09ae4a0c92eea79f0cf0a38f...4812650x9AAa20179145C9153a36Bbf71e2FF0c6eC2bed1f10x1CEf785AA885836CeE4f53B6ACe83D187d819639
30991NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xf29EE6A9C566Fb837988a72bdaa...0xf8451b200c08f1603db95f39140fb21d633f6119e9f4...155616510x3c1e8ab50f8a8dcba3e5fae236eb5ec6640bf942d0e3...146920xf29EE6A9C566Fb837988a72bdaa5749564Dc8b6920x8270FC3B2d23DE703b265b2ABE008883954fea8E
30992NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xCbb272D3c518386D1dd5a673698...0x5eb463db486d91a5ee20d64f894d504b03820bcde553...155617250x03a607aa73430521c37d30a177c1de30509b46a143fd...110390xCbb272D3c518386D1dd5a673698F02d1a0063D3c10x1CEf785AA885836CeE4f53B6ACe83D187d819639
30993NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xC66Cfab72F2d43eb6Bb7058B2af...0xe482845e9b8234d98b0e6ed1747b62bafc6ebc345dad...155617340x6889adf6bf42faf501840a41858d7687860edc3e1138...81720xC66Cfab72F2d43eb6Bb7058B2af484A45eB2b9E910x1CEf785AA885836CeE4f53B6ACe83D187d819639
30994NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xeF8607A3001e486B902f3f6Ba8a...0xc163fd17f632fa94a8971f517bf496bafc27534f92a1...155617460x70e35a6e0c6cb12a623ec65b9152948624e8d8081e11...148820xeF8607A3001e486B902f3f6Ba8a40D2445feDc2910x8270FC3B2d23DE703b265b2ABE008883954fea8E
\n", + "

30995 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " event_name contract_address \\\n", + "0 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "1 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "2 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "3 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "4 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "... ... ... \n", + "30990 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "30991 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "30992 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "30993 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "30994 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "\n", + " event_arguments \\\n", + "0 {'poolAddress': '0x08142348E6BBf233002b81047bc... \n", + "1 {'poolAddress': '0x518b7160990AD19dcfF0Ba028e2... \n", + "2 {'poolAddress': '0x351E40e39ae7D0d60Dc283485bC... \n", + "3 {'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e... \n", + "4 {'poolAddress': '0x866C5c02dC07EE37146c4874d70... \n", + "... ... \n", + "30990 {'poolAddress': '0x9AAa20179145C9153a36Bbf71e2... \n", + "30991 {'poolAddress': '0xf29EE6A9C566Fb837988a72bdaa... \n", + "30992 {'poolAddress': '0xCbb272D3c518386D1dd5a673698... \n", + "30993 {'poolAddress': '0xC66Cfab72F2d43eb6Bb7058B2af... \n", + "30994 {'poolAddress': '0xeF8607A3001e486B902f3f6Ba8a... \n", + "\n", + " transaction_hash block_number \\\n", + "0 0xba75dd0b017667074a1ed080571fee06b3cea5444f25... 14650748 \n", + "1 0x7e33fe2f08ee09a339b127c8658a892600637da3448d... 14652189 \n", + "2 0x230624db7d760f3ad189bdebb431ef74b6cd899855d6... 14652199 \n", + "3 0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15... 14652223 \n", + "4 0x0c2b148a424bb8f25f32ca3ded2c87704cb73ab5b65b... 14662427 \n", + "... ... ... \n", + "30990 0x35feb962e106bfbd16bb949605d171bda649c015621d... 15561562 \n", + "30991 0xf8451b200c08f1603db95f39140fb21d633f6119e9f4... 15561651 \n", + "30992 0x5eb463db486d91a5ee20d64f894d504b03820bcde553... 15561725 \n", + "30993 0xe482845e9b8234d98b0e6ed1747b62bafc6ebc345dad... 15561734 \n", + "30994 0xc163fd17f632fa94a8971f517bf496bafc27534f92a1... 15561746 \n", + "\n", + " block_hash log_index \\\n", + "0 0xf63250e045af2d83fca5535fe3738deffd3c6f17f93b... 15 \n", + "1 0x4b0de468eecdfea07b64168655f129d43d8e56f01f42... 41 \n", + "2 0x572e74e542e87e141a2176725d7b216133bd0d13dcf5... 150 \n", + "3 0x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e... 142 \n", + "4 0x8f687e0ea159efeb37fd7e65ec00a008e6b96cc1b7ee... 171 \n", + "... ... ... \n", + "30990 0x7fe005a4046800acc48f09ae4a0c92eea79f0cf0a38f... 481 \n", + "30991 0x3c1e8ab50f8a8dcba3e5fae236eb5ec6640bf942d0e3... 146 \n", + "30992 0x03a607aa73430521c37d30a177c1de30509b46a143fd... 110 \n", + "30993 0x6889adf6bf42faf501840a41858d7687860edc3e1138... 81 \n", + "30994 0x70e35a6e0c6cb12a623ec65b9152948624e8d8081e11... 148 \n", + "\n", + " transaction_index poolAddress \\\n", + "0 9 0x08142348E6BBf233002b81047bc2f27026af10A5 \n", + "1 37 0x518b7160990AD19dcfF0Ba028e245fA616b44F5E \n", + "2 117 0x351E40e39ae7D0d60Dc283485bC627891Ec1D00E \n", + "3 108 0x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e2 \n", + "4 149 0x866C5c02dC07EE37146c4874d704D3603bF5D950 \n", + "... ... ... \n", + "30990 265 0x9AAa20179145C9153a36Bbf71e2FF0c6eC2bed1f \n", + "30991 92 0xf29EE6A9C566Fb837988a72bdaa5749564Dc8b69 \n", + "30992 39 0xCbb272D3c518386D1dd5a673698F02d1a0063D3c \n", + "30993 72 0xC66Cfab72F2d43eb6Bb7058B2af484A45eB2b9E9 \n", + "30994 82 0xeF8607A3001e486B902f3f6Ba8a40D2445feDc29 \n", + "\n", + " poolType nft \n", + "0 1 0x5Af0D9827E0c53E4799BB226655A1de152A425a5 \n", + "1 1 0xCa7cA7BcC765F77339bE2d648BA53ce9c8a262bD \n", + "2 1 0x521f9C7505005CFA19A8E5786a9c3c9c9F5e6f42 \n", + "3 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "4 1 0xD07e72b00431af84AD438CA995Fd9a7F0207542d \n", + "... ... ... \n", + "30990 1 0x1CEf785AA885836CeE4f53B6ACe83D187d819639 \n", + "30991 2 0x8270FC3B2d23DE703b265b2ABE008883954fea8E \n", + "30992 1 0x1CEf785AA885836CeE4f53B6ACe83D187d819639 \n", + "30993 1 0x1CEf785AA885836CeE4f53B6ACe83D187d819639 \n", + "30994 1 0x8270FC3B2d23DE703b265b2ABE008883954fea8E \n", + "\n", + "[30995 rows x 11 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "query_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "0023793c", + "metadata": {}, + "outputs": [], + "source": [ + "# focus on collection we care about\n", + "query_pairs_for_collection = query_pairs.copy()[query_pairs['nft'] == collection.address]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d9e3f28e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_namecontract_addressevent_argumentstransaction_hashblock_numberblock_hashlog_indextransaction_indexpoolAddresspoolTypenft
3NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e...0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15...146522230x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e...1421080x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e210x0427743DF720801825a5c82e0582B1E915E0F750
27NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x3eaf9979b55E85Cf91980922eFD...0x3a882f2571a30202e7b109f8075ff392f86c30d7f116...147884680xc6d8dae849dd05ddec7508c673457238e18a8fe55a41...138480x3eaf9979b55E85Cf91980922eFDCae7cd818318D10x0427743DF720801825a5c82e0582B1E915E0F750
162NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x23B5256CE9d8538EBd148051998...0xad549e49c473d4ab475eb73b7990b60d7d460754c985...151006820x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f...1751690x23B5256CE9d8538EBd14805199863E97397b112610x0427743DF720801825a5c82e0582B1E915E0F750
163NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xFEDF2F226C97A1106623C0a3c58...0xdb41ebef7623358c2502c1ddb4ca539365af3dcbd6b8...151015950x58ccd0444131c60fdc65cd31c3eb274bf3eab88f3856...2031440xFEDF2F226C97A1106623C0a3c58BDDe197c44D3810x0427743DF720801825a5c82e0582B1E915E0F750
164NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xb341b6a76478a69060c350B71b1...0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e...151016240xfdafeac51272715769013f4227929f24dcf42a077667...119760xb341b6a76478a69060c350B71b13d283d5C6E8DA10x0427743DF720801825a5c82e0582B1E915E0F750
....................................
29093NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xfE9B364E05ca9f2F5947C816184...0xd34abc6259a53631fe00fbbc7b665705ff19c1694c37...154778740xb9b56a4f6f973ac7ae2e4d84d03915e8f84f72d8e702...6202500xfE9B364E05ca9f2F5947C816184A3f62F12CdFcc00x0427743DF720801825a5c82e0582B1E915E0F750
29232NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xF6A90f5c9115903046aC5bEd89b...0xb0cc3797ba8a86ffdd61f92b3fe384ea2d89174d33c8...154863480xe916f4ae169538fe9a37ef4e4434475443dc35b60d5b...2441030xF6A90f5c9115903046aC5bEd89b0A2B8FA9a23C110x0427743DF720801825a5c82e0582B1E915E0F750
29249NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x4eEDC301887673a2b7112f903BD...0x73487512a29670525c5925b90b58af2486e8979e6b8e...154869920xb315b7385732259e7c0bae69ee5d2001dfa66a6e9a9d...96270x4eEDC301887673a2b7112f903BD99344E3E44d0c10x0427743DF720801825a5c82e0582B1E915E0F750
29268NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x1a9b5B2aEF0ef30054fEfb3Dbb6...0xfe9844dc384913d3032eeb76deddab41d6f5e192bd66...154881050x766413907814e8df5213905bc498e9108fa968f12025...74440x1a9b5B2aEF0ef30054fEfb3Dbb65Ec0E8d4F9DCD10x0427743DF720801825a5c82e0582B1E915E0F750
29400NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xc8b7595873c57CAE949a4D4FCF4...0x4bb3a870674419ce6f673ef488f54f5ea8826b2a3174...154942410x3eed45c939d47a9f962ff0d25ac6f326b74be5cb4367...7291810xc8b7595873c57CAE949a4D4FCF468aa003aF461000x0427743DF720801825a5c82e0582B1E915E0F750
\n", + "

81 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " event_name contract_address \\\n", + "3 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "27 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "162 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "163 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "164 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "... ... ... \n", + "29093 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29232 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29249 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29268 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29400 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "\n", + " event_arguments \\\n", + "3 {'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e... \n", + "27 {'poolAddress': '0x3eaf9979b55E85Cf91980922eFD... \n", + "162 {'poolAddress': '0x23B5256CE9d8538EBd148051998... \n", + "163 {'poolAddress': '0xFEDF2F226C97A1106623C0a3c58... \n", + "164 {'poolAddress': '0xb341b6a76478a69060c350B71b1... \n", + "... ... \n", + "29093 {'poolAddress': '0xfE9B364E05ca9f2F5947C816184... \n", + "29232 {'poolAddress': '0xF6A90f5c9115903046aC5bEd89b... \n", + "29249 {'poolAddress': '0x4eEDC301887673a2b7112f903BD... \n", + "29268 {'poolAddress': '0x1a9b5B2aEF0ef30054fEfb3Dbb6... \n", + "29400 {'poolAddress': '0xc8b7595873c57CAE949a4D4FCF4... \n", + "\n", + " transaction_hash block_number \\\n", + "3 0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15... 14652223 \n", + "27 0x3a882f2571a30202e7b109f8075ff392f86c30d7f116... 14788468 \n", + "162 0xad549e49c473d4ab475eb73b7990b60d7d460754c985... 15100682 \n", + "163 0xdb41ebef7623358c2502c1ddb4ca539365af3dcbd6b8... 15101595 \n", + "164 0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e... 15101624 \n", + "... ... ... \n", + "29093 0xd34abc6259a53631fe00fbbc7b665705ff19c1694c37... 15477874 \n", + "29232 0xb0cc3797ba8a86ffdd61f92b3fe384ea2d89174d33c8... 15486348 \n", + "29249 0x73487512a29670525c5925b90b58af2486e8979e6b8e... 15486992 \n", + "29268 0xfe9844dc384913d3032eeb76deddab41d6f5e192bd66... 15488105 \n", + "29400 0x4bb3a870674419ce6f673ef488f54f5ea8826b2a3174... 15494241 \n", + "\n", + " block_hash log_index \\\n", + "3 0x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e... 142 \n", + "27 0xc6d8dae849dd05ddec7508c673457238e18a8fe55a41... 138 \n", + "162 0x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f... 175 \n", + "163 0x58ccd0444131c60fdc65cd31c3eb274bf3eab88f3856... 203 \n", + "164 0xfdafeac51272715769013f4227929f24dcf42a077667... 119 \n", + "... ... ... \n", + "29093 0xb9b56a4f6f973ac7ae2e4d84d03915e8f84f72d8e702... 620 \n", + "29232 0xe916f4ae169538fe9a37ef4e4434475443dc35b60d5b... 244 \n", + "29249 0xb315b7385732259e7c0bae69ee5d2001dfa66a6e9a9d... 96 \n", + "29268 0x766413907814e8df5213905bc498e9108fa968f12025... 74 \n", + "29400 0x3eed45c939d47a9f962ff0d25ac6f326b74be5cb4367... 729 \n", + "\n", + " transaction_index poolAddress \\\n", + "3 108 0x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e2 \n", + "27 48 0x3eaf9979b55E85Cf91980922eFDCae7cd818318D \n", + "162 169 0x23B5256CE9d8538EBd14805199863E97397b1126 \n", + "163 144 0xFEDF2F226C97A1106623C0a3c58BDDe197c44D38 \n", + "164 76 0xb341b6a76478a69060c350B71b13d283d5C6E8DA \n", + "... ... ... \n", + "29093 250 0xfE9B364E05ca9f2F5947C816184A3f62F12CdFcc \n", + "29232 103 0xF6A90f5c9115903046aC5bEd89b0A2B8FA9a23C1 \n", + "29249 27 0x4eEDC301887673a2b7112f903BD99344E3E44d0c \n", + "29268 44 0x1a9b5B2aEF0ef30054fEfb3Dbb65Ec0E8d4F9DCD \n", + "29400 181 0xc8b7595873c57CAE949a4D4FCF468aa003aF4610 \n", + "\n", + " poolType nft \n", + "3 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "27 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "162 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "163 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "164 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "... ... ... \n", + "29093 0 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "29232 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "29249 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "29268 1 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "29400 0 0x0427743DF720801825a5c82e0582B1E915E0F750 \n", + "\n", + "[81 rows x 11 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# wow, 81 pool pairs focused on xmons nft\n", + "query_pairs_for_collection" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "44c55e27", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# pairs for collection 0x0427743DF720801825a5c82e0582B1E915E0F750 with poolType = 0: 39\n", + "# pairs for collection 0x0427743DF720801825a5c82e0582B1E915E0F750 with poolType = 1: 39\n", + "# pairs for collection 0x0427743DF720801825a5c82e0582B1E915E0F750 with poolType = 2: 3\n" + ] + } + ], + "source": [ + "# how many are of different pool types?\n", + "# interesting: only 3 trade pools. most LPs are trying to buy/sell NFT in a one sided pool (like a limit order)\n", + "print(f'# pairs for collection {collection.address} with poolType = {0}:', len(query_pairs_for_collection[query_pairs_for_collection['poolType'] == 0]))\n", + "print(f'# pairs for collection {collection.address} with poolType = {1}:', len(query_pairs_for_collection[query_pairs_for_collection['poolType'] == 1]))\n", + "print(f'# pairs for collection {collection.address} with poolType = {2}:', len(query_pairs_for_collection[query_pairs_for_collection['poolType'] == 2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "7706a994", + "metadata": {}, + "outputs": [], + "source": [ + "# NewPair events only give the pair address without any addition. Query\n", + "# for additional pool info from each pool contract at poolAddress in NewPair\n", + "def get_pair_specifics(key: str, x: pd.Series, is_method: bool = True) -> tp.Any:\n", + " \"\"\"\n", + " Gets pair specific info from the LSSVMPair contract.\n", + " \"\"\"\n", + " addr = x['poolAddress']\n", + " pair = project.LSSVMPair.at(addr)\n", + " try:\n", + " val = getattr(pair, key)() if is_method else getattr(pair, key)\n", + " except Exception:\n", + " val = None\n", + " return val" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "f7d9969b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 21 s, sys: 4.39 s, total: 25.4 s\n", + "Wall time: 37.3 s\n" + ] + } + ], + "source": [ + "# get the current ETH (token) balances for each pool\n", + "%time query_balance_token = query_pairs_for_collection.apply(lambda x: get_pair_specifics('balance', x, False), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "af73505b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3 0\n", + "27 0\n", + "162 0\n", + "163 0\n", + "164 0\n", + " ... \n", + "29093 1296\n", + "29232 0\n", + "29249 0\n", + "29268 0\n", + "29400 0\n", + "Length: 81, dtype: object" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# eth balances of xmons pools in wei terms\n", + "query_balance_token" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "15efdf17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# of xmons pools with non-zero ETH balances: 11\n" + ] + }, + { + "data": { + "text/plain": [ + "814 23327553398058254300\n", + "3382 100000000000000\n", + "14120 100000000000000\n", + "16244 400000000000000\n", + "16328 1000000000000000\n", + "20240 399000000000000\n", + "21355 1000000000000\n", + "21390 1000000000000000\n", + "25084 110000000000000\n", + "28424 500000000000000\n", + "29093 1296\n", + "dtype: object" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# pools with non-zero ETH balances ...\n", + "# 11/81 xmons collection pools have ETH balances\n", + "print('# of xmons pools with non-zero ETH balances:', len(query_balance_token[query_balance_token > 0]))\n", + "query_balance_token[query_balance_token > 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "5dea9bd5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "814 23.327553\n", + "3382 0.0001\n", + "14120 0.0001\n", + "16244 0.0004\n", + "16328 0.001\n", + "20240 0.000399\n", + "21355 0.000001\n", + "21390 0.001\n", + "25084 0.00011\n", + "28424 0.0005\n", + "29093 0.0\n", + "dtype: object" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# divide by number of decimals to put into ETH terms\n", + "query_balance_token[query_balance_token > 0] / 1e18" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "4f2cd69e", + "metadata": {}, + "outputs": [], + "source": [ + "# NewPair events only give the pair address without any addition. Query\n", + "# for additional pool info from each pool contract at poolAddress in NewPair\n", + "def get_nft_balance(nft_addr: str, x: pd.Series) -> int:\n", + " \"\"\"\n", + " Gets pair specific info from the LSSVMPair contract.\n", + " \"\"\"\n", + " pool_addr = x['poolAddress']\n", + " nft = project.ERC721.at(nft_addr)\n", + " return nft.balanceOf(pool_addr)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "f2755820", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 23.6 s, sys: 4.58 s, total: 28.2 s\n", + "Wall time: 1min 19s\n" + ] + } + ], + "source": [ + "# get the current NFT balances for each pool\n", + "%time query_balance_nft = query_pairs_for_collection.apply(lambda x: get_nft_balance(collection.address, x), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "a8e936f5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3 0\n", + "27 0\n", + "162 6\n", + "163 0\n", + "164 1\n", + " ..\n", + "29093 0\n", + "29232 0\n", + "29249 0\n", + "29268 0\n", + "29400 0\n", + "Length: 81, dtype: int64" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "query_balance_nft" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "b9469169", + "metadata": {}, + "outputs": [], + "source": [ + "# add both balance columsn to collection pairs df\n", + "query_pairs_for_collection['balance_token'] = query_balance_token / 1e18\n", + "query_pairs_for_collection['balance_nft'] = query_balance_nft" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "5d43b680", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_namecontract_addressevent_argumentstransaction_hashblock_numberblock_hashlog_indextransaction_indexpoolAddresspoolTypenftbalance_tokenbalance_nft
3NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e...0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15...146522230x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e...1421080x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e210x0427743DF720801825a5c82e0582B1E915E0F7500.00
27NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x3eaf9979b55E85Cf91980922eFD...0x3a882f2571a30202e7b109f8075ff392f86c30d7f116...147884680xc6d8dae849dd05ddec7508c673457238e18a8fe55a41...138480x3eaf9979b55E85Cf91980922eFDCae7cd818318D10x0427743DF720801825a5c82e0582B1E915E0F7500.00
162NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x23B5256CE9d8538EBd148051998...0xad549e49c473d4ab475eb73b7990b60d7d460754c985...151006820x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f...1751690x23B5256CE9d8538EBd14805199863E97397b112610x0427743DF720801825a5c82e0582B1E915E0F7500.06
163NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xFEDF2F226C97A1106623C0a3c58...0xdb41ebef7623358c2502c1ddb4ca539365af3dcbd6b8...151015950x58ccd0444131c60fdc65cd31c3eb274bf3eab88f3856...2031440xFEDF2F226C97A1106623C0a3c58BDDe197c44D3810x0427743DF720801825a5c82e0582B1E915E0F7500.00
164NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xb341b6a76478a69060c350B71b1...0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e...151016240xfdafeac51272715769013f4227929f24dcf42a077667...119760xb341b6a76478a69060c350B71b13d283d5C6E8DA10x0427743DF720801825a5c82e0582B1E915E0F7500.01
..........................................
29093NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xfE9B364E05ca9f2F5947C816184...0xd34abc6259a53631fe00fbbc7b665705ff19c1694c37...154778740xb9b56a4f6f973ac7ae2e4d84d03915e8f84f72d8e702...6202500xfE9B364E05ca9f2F5947C816184A3f62F12CdFcc00x0427743DF720801825a5c82e0582B1E915E0F7500.00
29232NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xF6A90f5c9115903046aC5bEd89b...0xb0cc3797ba8a86ffdd61f92b3fe384ea2d89174d33c8...154863480xe916f4ae169538fe9a37ef4e4434475443dc35b60d5b...2441030xF6A90f5c9115903046aC5bEd89b0A2B8FA9a23C110x0427743DF720801825a5c82e0582B1E915E0F7500.00
29249NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x4eEDC301887673a2b7112f903BD...0x73487512a29670525c5925b90b58af2486e8979e6b8e...154869920xb315b7385732259e7c0bae69ee5d2001dfa66a6e9a9d...96270x4eEDC301887673a2b7112f903BD99344E3E44d0c10x0427743DF720801825a5c82e0582B1E915E0F7500.00
29268NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x1a9b5B2aEF0ef30054fEfb3Dbb6...0xfe9844dc384913d3032eeb76deddab41d6f5e192bd66...154881050x766413907814e8df5213905bc498e9108fa968f12025...74440x1a9b5B2aEF0ef30054fEfb3Dbb65Ec0E8d4F9DCD10x0427743DF720801825a5c82e0582B1E915E0F7500.00
29400NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xc8b7595873c57CAE949a4D4FCF4...0x4bb3a870674419ce6f673ef488f54f5ea8826b2a3174...154942410x3eed45c939d47a9f962ff0d25ac6f326b74be5cb4367...7291810xc8b7595873c57CAE949a4D4FCF468aa003aF461000x0427743DF720801825a5c82e0582B1E915E0F7500.00
\n", + "

81 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " event_name contract_address \\\n", + "3 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "27 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "162 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "163 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "164 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "... ... ... \n", + "29093 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29232 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29249 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29268 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "29400 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "\n", + " event_arguments \\\n", + "3 {'poolAddress': '0x0636a6Bd07dDBEA28a3cc63353e... \n", + "27 {'poolAddress': '0x3eaf9979b55E85Cf91980922eFD... \n", + "162 {'poolAddress': '0x23B5256CE9d8538EBd148051998... \n", + "163 {'poolAddress': '0xFEDF2F226C97A1106623C0a3c58... \n", + "164 {'poolAddress': '0xb341b6a76478a69060c350B71b1... \n", + "... ... \n", + "29093 {'poolAddress': '0xfE9B364E05ca9f2F5947C816184... \n", + "29232 {'poolAddress': '0xF6A90f5c9115903046aC5bEd89b... \n", + "29249 {'poolAddress': '0x4eEDC301887673a2b7112f903BD... \n", + "29268 {'poolAddress': '0x1a9b5B2aEF0ef30054fEfb3Dbb6... \n", + "29400 {'poolAddress': '0xc8b7595873c57CAE949a4D4FCF4... \n", + "\n", + " transaction_hash block_number \\\n", + "3 0xff03f1a4956f878f1bd42a6dfa2ec18165822cde3d15... 14652223 \n", + "27 0x3a882f2571a30202e7b109f8075ff392f86c30d7f116... 14788468 \n", + "162 0xad549e49c473d4ab475eb73b7990b60d7d460754c985... 15100682 \n", + "163 0xdb41ebef7623358c2502c1ddb4ca539365af3dcbd6b8... 15101595 \n", + "164 0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e... 15101624 \n", + "... ... ... \n", + "29093 0xd34abc6259a53631fe00fbbc7b665705ff19c1694c37... 15477874 \n", + "29232 0xb0cc3797ba8a86ffdd61f92b3fe384ea2d89174d33c8... 15486348 \n", + "29249 0x73487512a29670525c5925b90b58af2486e8979e6b8e... 15486992 \n", + "29268 0xfe9844dc384913d3032eeb76deddab41d6f5e192bd66... 15488105 \n", + "29400 0x4bb3a870674419ce6f673ef488f54f5ea8826b2a3174... 15494241 \n", + "\n", + " block_hash log_index \\\n", + "3 0x877d4993fe635aaaea71fa3c8bb8c705d67f86559c3e... 142 \n", + "27 0xc6d8dae849dd05ddec7508c673457238e18a8fe55a41... 138 \n", + "162 0x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f... 175 \n", + "163 0x58ccd0444131c60fdc65cd31c3eb274bf3eab88f3856... 203 \n", + "164 0xfdafeac51272715769013f4227929f24dcf42a077667... 119 \n", + "... ... ... \n", + "29093 0xb9b56a4f6f973ac7ae2e4d84d03915e8f84f72d8e702... 620 \n", + "29232 0xe916f4ae169538fe9a37ef4e4434475443dc35b60d5b... 244 \n", + "29249 0xb315b7385732259e7c0bae69ee5d2001dfa66a6e9a9d... 96 \n", + "29268 0x766413907814e8df5213905bc498e9108fa968f12025... 74 \n", + "29400 0x3eed45c939d47a9f962ff0d25ac6f326b74be5cb4367... 729 \n", + "\n", + " transaction_index poolAddress \\\n", + "3 108 0x0636a6Bd07dDBEA28a3cc63353ea725e8cE509e2 \n", + "27 48 0x3eaf9979b55E85Cf91980922eFDCae7cd818318D \n", + "162 169 0x23B5256CE9d8538EBd14805199863E97397b1126 \n", + "163 144 0xFEDF2F226C97A1106623C0a3c58BDDe197c44D38 \n", + "164 76 0xb341b6a76478a69060c350B71b13d283d5C6E8DA \n", + "... ... ... \n", + "29093 250 0xfE9B364E05ca9f2F5947C816184A3f62F12CdFcc \n", + "29232 103 0xF6A90f5c9115903046aC5bEd89b0A2B8FA9a23C1 \n", + "29249 27 0x4eEDC301887673a2b7112f903BD99344E3E44d0c \n", + "29268 44 0x1a9b5B2aEF0ef30054fEfb3Dbb65Ec0E8d4F9DCD \n", + "29400 181 0xc8b7595873c57CAE949a4D4FCF468aa003aF4610 \n", + "\n", + " poolType nft balance_token \\\n", + "3 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "27 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "162 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "163 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "164 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "... ... ... ... \n", + "29093 0 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "29232 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "29249 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "29268 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "29400 0 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "\n", + " balance_nft \n", + "3 0 \n", + "27 0 \n", + "162 6 \n", + "163 0 \n", + "164 1 \n", + "... ... \n", + "29093 0 \n", + "29232 0 \n", + "29249 0 \n", + "29268 0 \n", + "29400 0 \n", + "\n", + "[81 rows x 13 columns]" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "query_pairs_for_collection" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "ac52c522", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# of pairs with balances > min: 10\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_namecontract_addressevent_argumentstransaction_hashblock_numberblock_hashlog_indextransaction_indexpoolAddresspoolTypenftbalance_tokenbalance_nft
162NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x23B5256CE9d8538EBd148051998...0xad549e49c473d4ab475eb73b7990b60d7d460754c985...151006820x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f...1751690x23B5256CE9d8538EBd14805199863E97397b112610x0427743DF720801825a5c82e0582B1E915E0F7500.06
164NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xb341b6a76478a69060c350B71b1...0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e...151016240xfdafeac51272715769013f4227929f24dcf42a077667...119760xb341b6a76478a69060c350B71b13d283d5C6E8DA10x0427743DF720801825a5c82e0582B1E915E0F7500.01
814NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x5caF332DcA4e6C9E69d52F320c2...0x7e866076d6ba9b1ca2bbd8574c953bb369d84b0915a9...151814760x105a983c12fd2fb13f281eb94077d5d0481832521a5b...2281160x5caF332DcA4e6C9E69d52F320c21e74845353db020x0427743DF720801825a5c82e0582B1E915E0F75023.3275538
10844NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x1544F99043acBC1ceffE2Bc03BB...0xd5f1cfb2ee8db3805c278459b990284216a6513cf45d...153466590x6b12e183b541efa775abc8d090d8e66d9ba5f8c5800c...178930x1544F99043acBC1ceffE2Bc03BBdC6A9017196A110x0427743DF720801825a5c82e0582B1E915E0F7500.03
12013NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x4c19B043e4e3fEcEd7D7734928d...0x7e9ec12d7287486c6f77c805a13d9ab8d5a10808e311...153533710xb9270e7536ed21f4a86f2c0d98050604ec1c2665bf9c...1031820x4c19B043e4e3fEcEd7D7734928d205aCB84885cf10x0427743DF720801825a5c82e0582B1E915E0F7500.01
19092NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xBa633d5F380aE1090D256B79109...0x253b2cc526dfd34a1fb7704140503291308497b844d4...153950340xc3bee0ef779705ac0546a8df8d23c11eb73eb40cbf29...101420xBa633d5F380aE1090D256B79109A850F11870d0b10x0427743DF720801825a5c82e0582B1E915E0F7500.01
25889NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0xf33893376FCC3709bEDb6acCceD...0x968d98444a53a2fe2b906b78b717cc2b3fdc3d5b22ed...154309490x20edf13e97bb34b7ad6a3fafb0ee011c8ca10144318e...128880xf33893376FCC3709bEDb6acCceDDc9618d65DB6F10x0427743DF720801825a5c82e0582B1E915E0F7500.01
28337NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x980147F6d452cb3642bA4a97f19...0x6bfc9cc1f433b4352837fa62776527814c9e40048b75...154569820x6d88dd9c4548d42014c42bac3a5f9ac3bcc5ae3e8767...1721200x980147F6d452cb3642bA4a97f1966bd92D326B2310x0427743DF720801825a5c82e0582B1E915E0F7500.02
28392NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x2C841D58064Cb092bf72a846382...0x21d39004feba2cf25e4ff2691201cab54d21273c2d53...154577720xe7b788a38e899760dcd88eec5822e9143e3b94c32da2...3231560x2C841D58064Cb092bf72a8463828cEA54FAb91BA20x0427743DF720801825a5c82e0582B1E915E0F7500.03
28776NewPair0xb16c1342E617A5B6E4b631EB114483FDB289c0A4{'poolAddress': '0x4063D73a22b9f660F24bab57452...0x8e9a99ba6b548e52e7ce0c0a7db6a8272c8e441bacdd...154672040x4e202dd8ea2f719be9a3283ff3773c5a3d05d4e9c2a3...41370x4063D73a22b9f660F24bab574522212D8d930b9d10x0427743DF720801825a5c82e0582B1E915E0F7500.02
\n", + "
" + ], + "text/plain": [ + " event_name contract_address \\\n", + "162 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "164 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "814 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "10844 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "12013 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "19092 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "25889 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "28337 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "28392 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "28776 NewPair 0xb16c1342E617A5B6E4b631EB114483FDB289c0A4 \n", + "\n", + " event_arguments \\\n", + "162 {'poolAddress': '0x23B5256CE9d8538EBd148051998... \n", + "164 {'poolAddress': '0xb341b6a76478a69060c350B71b1... \n", + "814 {'poolAddress': '0x5caF332DcA4e6C9E69d52F320c2... \n", + "10844 {'poolAddress': '0x1544F99043acBC1ceffE2Bc03BB... \n", + "12013 {'poolAddress': '0x4c19B043e4e3fEcEd7D7734928d... \n", + "19092 {'poolAddress': '0xBa633d5F380aE1090D256B79109... \n", + "25889 {'poolAddress': '0xf33893376FCC3709bEDb6acCceD... \n", + "28337 {'poolAddress': '0x980147F6d452cb3642bA4a97f19... \n", + "28392 {'poolAddress': '0x2C841D58064Cb092bf72a846382... \n", + "28776 {'poolAddress': '0x4063D73a22b9f660F24bab57452... \n", + "\n", + " transaction_hash block_number \\\n", + "162 0xad549e49c473d4ab475eb73b7990b60d7d460754c985... 15100682 \n", + "164 0x458c500cf171ac4d3fd9fd3fa344d1ed24778beab03e... 15101624 \n", + "814 0x7e866076d6ba9b1ca2bbd8574c953bb369d84b0915a9... 15181476 \n", + "10844 0xd5f1cfb2ee8db3805c278459b990284216a6513cf45d... 15346659 \n", + "12013 0x7e9ec12d7287486c6f77c805a13d9ab8d5a10808e311... 15353371 \n", + "19092 0x253b2cc526dfd34a1fb7704140503291308497b844d4... 15395034 \n", + "25889 0x968d98444a53a2fe2b906b78b717cc2b3fdc3d5b22ed... 15430949 \n", + "28337 0x6bfc9cc1f433b4352837fa62776527814c9e40048b75... 15456982 \n", + "28392 0x21d39004feba2cf25e4ff2691201cab54d21273c2d53... 15457772 \n", + "28776 0x8e9a99ba6b548e52e7ce0c0a7db6a8272c8e441bacdd... 15467204 \n", + "\n", + " block_hash log_index \\\n", + "162 0x7ecf57d813de8a1382c1d6b72e7400362ea1dab55b2f... 175 \n", + "164 0xfdafeac51272715769013f4227929f24dcf42a077667... 119 \n", + "814 0x105a983c12fd2fb13f281eb94077d5d0481832521a5b... 228 \n", + "10844 0x6b12e183b541efa775abc8d090d8e66d9ba5f8c5800c... 178 \n", + "12013 0xb9270e7536ed21f4a86f2c0d98050604ec1c2665bf9c... 103 \n", + "19092 0xc3bee0ef779705ac0546a8df8d23c11eb73eb40cbf29... 101 \n", + "25889 0x20edf13e97bb34b7ad6a3fafb0ee011c8ca10144318e... 128 \n", + "28337 0x6d88dd9c4548d42014c42bac3a5f9ac3bcc5ae3e8767... 172 \n", + "28392 0xe7b788a38e899760dcd88eec5822e9143e3b94c32da2... 323 \n", + "28776 0x4e202dd8ea2f719be9a3283ff3773c5a3d05d4e9c2a3... 41 \n", + "\n", + " transaction_index poolAddress \\\n", + "162 169 0x23B5256CE9d8538EBd14805199863E97397b1126 \n", + "164 76 0xb341b6a76478a69060c350B71b13d283d5C6E8DA \n", + "814 116 0x5caF332DcA4e6C9E69d52F320c21e74845353db0 \n", + "10844 93 0x1544F99043acBC1ceffE2Bc03BBdC6A9017196A1 \n", + "12013 182 0x4c19B043e4e3fEcEd7D7734928d205aCB84885cf \n", + "19092 42 0xBa633d5F380aE1090D256B79109A850F11870d0b \n", + "25889 88 0xf33893376FCC3709bEDb6acCceDDc9618d65DB6F \n", + "28337 120 0x980147F6d452cb3642bA4a97f1966bd92D326B23 \n", + "28392 156 0x2C841D58064Cb092bf72a8463828cEA54FAb91BA \n", + "28776 37 0x4063D73a22b9f660F24bab574522212D8d930b9d \n", + "\n", + " poolType nft balance_token \\\n", + "162 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "164 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "814 2 0x0427743DF720801825a5c82e0582B1E915E0F750 23.327553 \n", + "10844 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "12013 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "19092 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "25889 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "28337 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "28392 2 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "28776 1 0x0427743DF720801825a5c82e0582B1E915E0F750 0.0 \n", + "\n", + " balance_nft \n", + "162 6 \n", + "164 1 \n", + "814 8 \n", + "10844 3 \n", + "12013 1 \n", + "19092 1 \n", + "25889 1 \n", + "28337 2 \n", + "28392 3 \n", + "28776 2 " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# filter out the zero pools\n", + "min_token_size = 0.01\n", + "print('# of pairs with balances > min:', len(query_pairs_for_collection[(query_pairs_for_collection['balance_token'] > min_token_size) | (query_pairs_for_collection['balance_nft'] > 0)]))\n", + "query_pairs_for_collection[(query_pairs_for_collection['balance_token'] > min_token_size) | (query_pairs_for_collection['balance_nft'] > 0)]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "c03f4ae7", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: look at the price history for these 10 pools" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de3d94f5", + "metadata": {}, + "outputs": [], "source": [] } ],