diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5676c22..6a395130 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,7 +44,7 @@ jobs: SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - name: Build fat jar - run: sbt clean assembly + run: sbt 'set test in assembly := {}' clean assembly - name: Upload release binaries uses: alexellis/upload-assets@0.2.2 env: diff --git a/appkit/src/test/resources/tokens.json b/appkit/src/test/resources/tokens.json new file mode 100644 index 00000000..2510f190 --- /dev/null +++ b/appkit/src/test/resources/tokens.json @@ -0,0 +1 @@ +{"items":[{"id":"2ac6e502e997681191ad336587e4bd0a1f25ce3709c29214f6c533575f9957fd","boxId":"5eb715015c6d894303f3ba9c1796791c9a2af61aab659b8a63d890fbbc92756b","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 12423.04, \"stakeTime\": \"2022-07-09 17:05:30.551623\"}","type":"EIP-004","decimals":0},{"id":"06df2bafbb01da36aa29520148b4ee4cd09e5f2e499e9bfb37aa84ad67338176","boxId":"ba9b08c242d3578ba0dd0fe970235e21895c85c72c282a4a4ddccd8946b427e6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 227011.2046, \"stakeTime\": \"2022-07-09 13:28:00.426000\"}","type":"EIP-004","decimals":0},{"id":"9eccc846606c4a34e2e3ac189041a8f41e3dc1681f61bb0c5e1f6d3cb9c380af","boxId":"f6d7d13ee06d11d4b8483204641731a92039564366616e75dc6289cbcd59d1ef","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"e6ed2270b6a3443c4203a086bd2010a65cda3ba82c8eb31e8e622a7de35cc086","boxId":"9eccc846606c4a34e2e3ac189041a8f41e3dc1681f61bb0c5e1f6d3cb9c380af","emissionAmount":9223372036854774807,"name":"ERG_SigUSD_LP","description":"","type":"EIP-004","decimals":0},{"id":"538223621c6b6a15fd714ffaae3ce239fb5bd1594fed1fd2bbbbfd30496e54d4","boxId":"6e1893108d1b1590713b4b31c5eb32433c8c7d7f3aec311138114c29fb4c8c76","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 227971.23500000002, \"stakeTime\": \"2022-07-09 11:31:53.693000\"}","type":"EIP-004","decimals":0},{"id":"4fed18b28203e4946df19460623fcd2dd1f2d0e7a735523e197a3dd69bd295ad","boxId":"29e575d36612bb6b1f38e1fee7e5b5e4603895ffef59139318251d8c02a45b42","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 2443.8513000000003, \"stakeTime\": \"2022-07-09 11:12:35.876000\"}","type":"EIP-004","decimals":0},{"id":"e9144b4ef5a51dadb66ce03cad409a70052a62976d65f41d0bc841b93ea88c5a","boxId":"0058dde4725aab4c32bc7bf053e31ef4997f0933201bf1dee77a62941fa0eace","emissionAmount":1,"name":"Mandala","description":"","type":"EIP-004","decimals":0},{"id":"b89f18f3354b91041baaa2ccf9552b82bfefa629a9f6a8386c866616505494e2","boxId":"3a2f4877b6ea442a4087d16321c7c70c4aa8aa121c28c0f2d35e2f1585ed3b4e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 247125.5748, \"stakeTime\": \"2022-07-09 09:15:29.265000\"}","type":"EIP-004","decimals":0},{"id":"b021aebe76561148d329db62b4aed3506e6527565a6b7f7b44935f71d8b0b070","boxId":"2299018929fa874c4e37c5c16c4d02f7b2ad16462c456b007f50e2ee354d6e9b","emissionAmount":1,"name":"Animal pop art #24. Lemur","description":"Animal pop art #24. Lemur. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"59359e5b99a45a2a14de0728e0767dbead2fd28d79d1812a451668400fe47c6f","boxId":"7930e45d98e684b1e62dce747290e6906f7912365f8f18a0fd81b99845946c5b","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 13679.03, \"stakeTime\": \"2022-07-09 06:19:56.293031\"}","type":"EIP-004","decimals":0},{"id":"8bb62ae54553a707c02148bd23eff99ab1571ab77da51b16f0cace6914257bb7","boxId":"a2402e452824b7bd26e9fc0226d7dbbd47a0abe6256fb961616e8d72f1b1d1c4","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 8461.0, \"stakeTime\": \"2022-07-09 06:07:39.088000\"}","type":"EIP-004","decimals":0},{"id":"3ce95baf7b803f0720999c9fb861416eda63afc6c8bf89e2411ef813ce917823","boxId":"31518dbae97da7d7c3d731223fbe9b148d8c24d30ec50a86074af46e6fbbc750","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 309647.8788, \"stakeTime\": \"2022-07-09 06:09:31.135000\"}","type":"EIP-004","decimals":0},{"id":"32d84bc0a55edef3cd76d9643748d8df2d5a419f4ac60456f33a12bb57cdb998","boxId":"285a689c354c93bec31cfe760b63836e3fa32a92eb27e49836f58bd2ccbebcb3","emissionAmount":1,"name":"Super ErgoSaur #1","description":"The sturdiest dinosaur you can find in the Ergozoic era. Herbivore. Part cyborg. | @Ergosaurs","type":"EIP-004","decimals":0},{"id":"557a1a37e7d1785e44ec4bc6d7573f6ca4aa3ffece285d33c6fbad8dbc1d221a","boxId":"a419f74ad29959ce4a14c74485fcf114ecfbc8e738704343cd9251a7ca1e6fb9","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 13053.8513, \"stakeTime\": \"2022-07-09 05:29:36.873000\"}","type":"EIP-004","decimals":0},{"id":"6a5efbd4a720c4e0d06ca25d92f8e8c642068cf523b811add623971a52b60419","boxId":"c4c44d05d1190105a70b82461db112e2b88e7fa1e606fbec63334463d483be24","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 3000.0, \"stakeTime\": \"2022-07-09 05:10:24.043000\"}","type":"EIP-004","decimals":0},{"id":"e7b45bad3d67cfff881c4995c351c75e892b1ae55f506ecd1a4c49b69ba34380","boxId":"60fd91bfa0193dffbbc1d661e71ea8f46a3b767080f2648281cc30d4bb97d10b","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 9967.27, \"stakeTime\": \"2022-07-09 04:01:42.340615\"}","type":"EIP-004","decimals":0},{"id":"0d0d3ab9c426460515cdf50d9adc9901decc6dd4bc70761867c5465c41cd910c","boxId":"6303411ae065a87250768bd71f5867c3850158c83756de0eae9ca539f8909758","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1000152.5784, \"stakeTime\": \"2022-07-09 02:36:18.269000\"}","type":"EIP-004","decimals":0},{"id":"7b3fe08cb7eacda1c208d4b302cbf7d7c2247e545df71231ba390dd55bbf09c1","boxId":"aa48b8f676f59be749002dffdfae0d960316b6274a58815cf3ae1a61889a85ef","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 64468.434100000006, \"stakeTime\": \"2022-07-09 02:21:51.192000\"}","type":"EIP-004","decimals":0},{"id":"195ae583302fd411ba958923997cf2386b0c62dff553eb9dfc36439b6b08e041","boxId":"2780ce935e8c1cf2a39627a532128eae8a0f6b62e78e562dbe0c3ee1d777ff4b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 48317.1287, \"stakeTime\": \"2022-07-09 02:16:53.523000\"}","type":"EIP-004","decimals":0},{"id":"8fab5bad024827bfaa9df123d180b327c6dcbc46bd3d57869a44af09fd3f87e8","boxId":"2e6a4c8cab247f7ab85eaf4817382aa39be604421f9fc92dc6822628e8a9e7ba","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 50000.0, \"stakeTime\": \"2022-07-09 01:59:31.459000\"}","type":"EIP-004","decimals":0},{"id":"ec0a13e21714f84b6cc6f6da3e44cc1266cabc98cd16a32071420c30dff65a4d","boxId":"224f717e1bf50d7a0030264cf6971ddd0e76ad5a6bf3a614ab7d55ab1edf9e9c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1000.0, \"stakeTime\": \"2022-07-09 01:50:56.639259\"}","type":"EIP-004","decimals":0},{"id":"17080df829d93bb8a586ce7e9c6e3cbfe02dceda1726284970d9b03f423a404e","boxId":"a4022835282d22cbd8f839ff1da45a1b1dcd5ebbe7671256f2f632082588ca20","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 200000.36620000002, \"stakeTime\": \"2022-07-09 01:25:32.553000\"}","type":"EIP-004","decimals":0},{"id":"f523cdd1ff2f0055d48cb3b8d3ec3e748a441f601effbaa264f049b393057602","boxId":"238c9b695dc32b98c57f522af2dc3e9bbbe79e2429d95a0e33505668ca39cbc8","emissionAmount":1,"name":"Aneta Angels #2728","description":"Background\nGradient 4\n5.00%\nBody\nNinja Red\n3.56%\nFace\nConfident\n8.71%\nHead\nViking Hat\n3.97%\nSkintone\nTone 4\n25.28%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"62511121ac1cccc5089170339daf0139dd3771e33ac06e3ed97d1577f1f26630","boxId":"2f4b9e5f2cdc6d5b63564e79109b5b93e46340cd9338e844f33a237aa1414ff5","emissionAmount":1,"name":"Aneta Angels #1892","description":"Background\nNight\n1.10%\nBody\nMetal Armor\n0.23%\nFace\nSmiley\n16.55%\nHead\nViking Hat\n3.97%\nSkintone\nTone 2\n25.19%\nWings\nPink Wings\n8.63%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"6c343b7f548ec3a2840442016c7acf0f78f933bdec178c9b94bef24db3b7b816","boxId":"50193cb902fc530885c9fcf33987bba958a887af2495465cf726eefb45525371","emissionAmount":1,"name":"Aneta Angels #8702","description":"Background\nLight Yellow\n8.79%\nBody\nDracula\n1.06%\nFace\nEye Patch\n9.95%\nHead\nAstronaut Helmet\n0.15%\nSkintone\nTone 4\n25.28%\nWings\nRainbow Wings\n16.17%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"f28a48ecbe793330e250f43b216c6329856ff9de316e046fe2ba7900c94a8fa0","boxId":"bf1499fb557e70e59f3644f6365b176b11470cac2b224e03bd78bc7e7c1f6d23","emissionAmount":1,"name":"Aneta Angels #0990","description":"Background\nGradient 6\n4.77%\nBody\nArcheologist\n2.12%\nFace\nEye Patch\n9.95%\nHead\nDracula Hair\n6.11%\nSkintone\nTone 2\n25.19%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"74030ff96ee912d20965955a5cf3a485020b34b7c865bc4a8ae5cd0d1b4aa1eb","boxId":"d280d890be15e5415cac78023f62f91c67eae6ad776f3c43e26bb83f22a2c40c","emissionAmount":1,"name":"Aneta Angels #8556","description":"Background\nGradient 3\n5.06%\nBody\nLight Blue Shirt\n1.96%\nFace\nFreckles\n10.53%\nHead\nFace Paint\n2.91%\nSkintone\nTone 1\n24.80%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"d310d9b4b7778c4cfc2a5dc4b1545292fc03334cb4c783ef94555b06b6a54ae1","boxId":"a96bef21c91c48b7eb7ce10bd9403224ca998ead4e757c6aa8e572779fe7188a","emissionAmount":1,"name":"Aneta Angels #0741","description":"Background\nLight Purple\n9.19%\nBody\nWhite Dirndl\n1.72%\nFace\nFreckles\n10.53%\nHead\nPirate Hat\n1.97%\nSkintone\nTone 2\n25.19%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"f2383d9b5b4f2d87c8788a44453d201a8b00740166be19e5c37dfbd2fc2c993f","boxId":"e0a1975643030e70511bffd7a642f822647c52d1f4fb4afdf8c91e67407b78c6","emissionAmount":1,"name":"Aneta Angels #4077","description":"Background\nLight Yellow\n8.79%\nBody\nChef\n1.90%\nFace\nSad\n5.43%\nHead\nFirefighter Hat\n2.93%\nSkintone\nTone 4\n25.28%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"956dcb38e593aee9d67102ef1ce6bc09a9eb199cf49f38fbd6297cc35e61ac69","boxId":"b8787953cd5090eeb2c50528739e4fcd3e59a7c907fc06ef7371fb0f5bd79210","emissionAmount":1,"name":"Aneta Angels #7257","description":"Background\nLight Yellow\n8.79%\nBody\nArgentina\n1.69%\nFace\nLaughing\n5.29%\nHead\nAstronaut Helmet\n0.15%\nSkintone\nTone 3\n24.62%\nWings\nPink Wings\n8.63%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"6176702dd4e1c3b9deacfd2ac84eeee71cce91ed7f3a2334861f5b5e137dd969","boxId":"362637cdf1c8d0a5757ff7485c33d1d4e08b2b3f0798dac74f0f31f466258fab","emissionAmount":1,"name":"Aneta Angels #8637","description":"Traits\nBackground\nGradient 5\n4.75%\nBody\nSouth Korea\n0.92%\nFace\nBored\n16.46%\nHead\nAstronaut Helmet\n0.15%\nSkintone\nTone 2\n25.19%\nWings\nMetal Wings\n16.37%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"e2e1a1385338103193bc7d67c3f7c9204a40ab3062fe3d3c9be174d643d40857","boxId":"d2c823c977ce4ad811d37fe373c618620d80e17db7fa943ac5eabd0ae83d67b2","emissionAmount":1,"name":"Aneta Angels #2462","description":"Background\nGradient 8\n5.11%\nBody\nNinja Yellow\n3.31%\nFace\nEye Patch\n9.95%\nHead\nPirate Hat\n1.97%\nSkintone\nTone 3\n24.62%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"235c3a8ffa9ed739e19df90cddac8f1c83e50420191286694a462ecd104f48de","boxId":"43c880c2a9a0b83bfa7872eeeca625158197124d2656cb48e56a9af48cd2f489","emissionAmount":1,"name":"Aneta Angels #0456","description":"Background\nGradient 6\n4.77%\nBody\nAlien\n1.14%\nFace\nConfident\n8.71%\nHead\nAstronaut Helmet\n0.15%\nSkintone\nTone 1\n24.80%\nWings\nRainbow Wings\n16.17%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"fb16d8a2b308e96f69153f9d0294ce3d7eaef157114758083564a5296db3ffba","boxId":"33e643f78c9f4732f6d320487c3fdd6afbfcb0e309637f2b6c7633663ab59677","emissionAmount":1,"name":"Aneta Angels #8328","description":"Background\nGradient 8\n5.11%\nBody\n90s Jacket\n2.09%\nFace\nPuppet\n0.97%\nHead\nAstronaut Helmet\n0.15%\nSkintone\nTone 3\n24.62%\nWings\nMetal Wings\n16.37%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"0a864636ba2ae8aaf520218981593db1f8b924de98a2f3f94e5402cc84f802f8","boxId":"83b062908feb1314dc87aed46915a8fe2e17fae3d91dc62628f671125faa395b","emissionAmount":1,"name":"Aneta Angels #2406","description":"Background\nGradient 6\n4.77%\nBody\nRed Shirt\n1.06%\nFace\nDracula Face\n2.23%\nHead\nFace Paint\n2.91%\nSkintone\nTone 3\n24.62%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"cbaec91c805d2609fc510d117d977b88da8f744dd7d4be4e01ce0c00d6ea08c9","boxId":"63d275454016ea5e4d77ae76f5e1896ff6054d3d3e88b6075244e6cb7b83ae2c","emissionAmount":1,"name":"Aneta Angels #1591","description":"Background\nLight Purple\n9.19%\nBody\nRed Shirt\n1.06%\nFace\nBored\n16.46%\nHead\nArmor Helmet\n1.15%\nSkintone\nTone 3\n24.62%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"bfa273a339a853598f7802869c7a2b38f568df4362a951aae89e3d419a71ce5d","boxId":"2202f1b877e41060b2cfb28fd072abffb1aec0f2460ff99b960101f339656a9f","emissionAmount":1,"name":"Aneta Angels #3452","description":"Background\nGradient 7\n4.87%\nBody\nDracula\n1.06%\nFace\nSmiley\n16.55%\nHead\nCrown\n0.43%\nSkintone\nTone 1\n24.80%\nWings\nGold Wings\n0.50%\n\nANETA ANGELS\nhttps://nft.anetabtc.io/","type":"EIP-004","decimals":0},{"id":"a189340f21f555bf55b867893ac0b5e5bfa09d34d2db669995ed9b42899fe4c6","boxId":"09c89e0a3a384b196b7ca288a478b3d5b307938b225b9d9066e7ea6619db2d4d","emissionAmount":1,"name":"Aneta Angels #3793","description":"Background\nLight Blue\n8.70%\nBody\nNinja Yellow\n3.31%\nFace\nEye Patch\n9.95%\nHead\nWarbonnet\n0.08%\nSkintone\nTone 4\n25.28%\nWings\nRainbow Wings\n16.17%","type":"EIP-004","decimals":0},{"id":"2a5b7e765e413ddc7654add52af27df5b3c0e61118b0ffa1b069ac50ccb15ab9","boxId":"1456a4a0455acfa90fba02c4195f7129f510e4499d9294eb3fa41fdf50b6b518","emissionAmount":1,"name":"Aneta Angels #5292","description":"Background\nLight Green\n9.64%\nBody\nFirefighter\n1.49%\nFace\nBored\n16.46%\nHead\nWarbonnet\n0.08%\nSkintone\nTone 4\n25.28%\nWings\nRainbow Wings\n16.17%","type":"EIP-004","decimals":0},{"id":"299226362edf63c0eae93112f2b79a7b1f510b7257f5dd465acc79bcc05283cc","boxId":"761ba5163118c0533c0bb0988763e87249f4518cc4a421b7df98ad5dad69f443","emissionAmount":1,"name":"Aneta Angels #4589","description":"Background\nGradient 5\n4.75%\nBody\nSnow Camo\n1.92%\nFace\nSad\n5.43%\nHead\nWarbonnet\n0.08%\nSkintone\nTone 3\n24.62%\nWings\nPink Wings\n8.63%","type":"EIP-004","decimals":0},{"id":"b798e1ebf898f63ee7607803009e5959db31550a49c7e2262dd8c8e9a94f4868","boxId":"8998d9fdc42f2dcf4ac763a17155901c812b301edbab806c529db00f775a202f","emissionAmount":1,"name":"Aneta Angels #2415","description":"Background\nLight Pink\n9.21%\nBody\nSan Francisco\n1.13%\nFace\nSmiley\n16.55%\nHead\nWarbonnet\n0.08%\nSkintone\nTone 4\n25.28%\nWings\nMetal Wings\n16.37%","type":"EIP-004","decimals":0},{"id":"5c145bc8392f3f19ba8cf636c811c01c053698160abb61c84bdb69fa95c96b7a","boxId":"88a46969a47d5492c7633103400d928b832ee5ab735bd8a8431cda4b65df6445","emissionAmount":1,"name":"Aneta Angels #1991","description":"Background\nTwilight\n4.43%\nBody\nViking\n1.32%\nFace\n9.16%\nHead\nWarbonnet\n0.08%\nSkintone\nTone 2\n25.19%\nWings\nAngel Wings\n55.46%","type":"EIP-004","decimals":0},{"id":"870c8fedd694d8c8c1290b09e8758a300d4b723224f69df86428049f6e0738d6","boxId":"8c0434995882aaa0446fa322f48ee12332fc21ada68bb7375f83abb4a93efcf7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1000.0, \"stakeTime\": \"2022-07-08 22:46:53.965000\"}","type":"EIP-004","decimals":0},{"id":"7faf2379644779710b0eab4db9034c87501617c2e82e0a4000e7ee9a011e5a53","boxId":"a93971dc9d84353ef58d6c643bd210c4649fc15c41993cadddbe8b3325c45ad8","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 186157.0197, \"stakeTime\": \"2022-07-08 21:10:25.369000\"}","type":"EIP-004","decimals":0},{"id":"b779561c7d1228ecd7c421114cd87016ff275b0a4614af2af63f980bbc542519","boxId":"b52294545d9f5eef5cfd256d75eaccd889ac20f1a1150c1f6a70510bbc158180","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 30644.4284, \"stakeTime\": \"2022-07-08 19:43:54.778000\"}","type":"EIP-004","decimals":0},{"id":"8cbf80621cc90a502ad24323e1fadb09e92af6ff1f81b83e6a3e3e01ff1f8d95","boxId":"32a1e96851b6ac9a08b0e429dfa7363bc183a99780a841493f70c3f5f25b3535","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 250.8497, \"stakeTime\": \"2022-07-08 19:24:49.138000\"}","type":"EIP-004","decimals":0},{"id":"fc54f0cadf866bf1f1c1fef973b6af191efb84c683570bc39cdf85d981623db1","boxId":"45a084b37b14b9f96e86b6247fd2fac08c3ee9ce8eabd52ceb8e1577d6fde76d","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 50021.224, \"stakeTime\": \"2022-07-08 19:17:42.732000\"}","type":"EIP-004","decimals":0},{"id":"d2ecd0b69be992537cbabae8f904bf0fdd5eef122e4f951814c707e4cd90ec72","boxId":"814c8b28d9115c148513ae336fffdc9041381bf05e40c967ab3bcd921e89105c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 37362.6373, \"stakeTime\": \"2022-07-08 17:02:54.050000\"}","type":"EIP-004","decimals":0},{"id":"a17f5fe5f6f8beb9fc0042b7cc8e0e4cee54e25cf566f85bfac164b275fd33e1","boxId":"ecd4e0d5cbbf633d2457df3bc3810bebf031f285ce79dd3c8b049b42c2b75421","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 148.35, \"stakeTime\": \"2022-07-08 16:24:29.084573\"}","type":"EIP-004","decimals":0},{"id":"115fa809492fbe950e033e7557d9a30a6c1d1ceeeea66ff14aeb229f8ce7c262","boxId":"727f1f0d3ec3213923036f0e7e94ac4aea47cba8ae25c86819273091e2df9167","emissionAmount":1,"name":"Super ErgoSaur #1","description":"His hump has tendons to improve his speed, but it mainly just makes him feel like a shark. Carnivore. Part cyborg. | @Ergosaurs","type":"EIP-004","decimals":0},{"id":"f47958cfb1d69e2efe5430ab1d124022ecd5ea0c2fdb4cafa95a9a06fafa6d75","boxId":"44b12ee8bbb613c80642821a7c0b092c1ec6b5509ac5063e76ed472dc0d608c4","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 4094.3877, \"stakeTime\": \"2022-07-08 16:04:15.661000\"}","type":"EIP-004","decimals":0},{"id":"801d185bbba2084821a8cded924a8ca02c86118f9ab45904a90cd0473506d746","boxId":"e34f3102afd10bb9df199b00560469c36028d0d3161dd45aad844b4ca768318a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 56891.548, \"stakeTime\": \"2022-07-08 15:13:07.418000\"}","type":"EIP-004","decimals":0},{"id":"5960b7a5a1d73b51d6208e08fa4423cf23fdfceeb2f9bdd6d4de41b691ddd2d1","boxId":"15d39ed62f59fe095d4117eca8c5daf1d60c73d8046c2bf9fd61f31fb69182ff","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 3415.3006, \"stakeTime\": \"2022-07-08 15:13:23.934000\"}","type":"EIP-004","decimals":0},{"id":"275480c7fef90e35b7d7a8ce9c6fe3773e84f5daaa3fd924ba9a43a7843e22c5","boxId":"89ad68480dfe9e17cf2e9457a4efac3d279979851e348d33ccbd3d28ef24542a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 144875.7358, \"stakeTime\": \"2022-07-08 14:08:20.771000\"}","type":"EIP-004","decimals":0},{"id":"2f615259676c24098d40a8a8c80cf867c1ab1236c2075d8e5401525ebc70eb23","boxId":"54eb982ee3e71d20d579898de93ce7cd228f15650bb11323b02e22d7027d908e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 35519.1256, \"stakeTime\": \"2022-07-08 14:13:08.444000\"}","type":"EIP-004","decimals":0},{"id":"424a9d5d8d5ddead487d02da926b9a67de3b54544a1c91d5e57351caed7b2c6a","boxId":"7552934c6624a664317f040df67873e5ee4666047b0d7edb2d2e3e1495767552","emissionAmount":1,"name":"Ergosaurs #33: Hero Aquasaur","description":"Hero #3 of the Ergosaurs Hero Series. @Ergosaurs","type":"EIP-004","decimals":0},{"id":"500ea7e82b32e431d0f7b91da65cda16545daf9d3c22c3462986955d61e84d81","boxId":"0fd079085e241faa0b1cd24b14a5c470a788c3f998f738622f469c87650aa978","emissionAmount":1,"name":"Ergosaurs #32: Hero Flame","description":"Hero #1 of the Ergosaurs Hero Series. @Ergosaurs","type":"EIP-004","decimals":0},{"id":"904a5bdd2135400f0916b791097580c8692e32e128cffea41d847d362f40cfc3","boxId":"3948e78859a9451b002f2cd8f5fee3ef35c594fec7996597afb20c35f7c33325","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 3278.6885, \"stakeTime\": \"2022-07-08 13:32:22.422000\"}","type":"EIP-004","decimals":0},{"id":"d5c2ab35b80008897a476d3030ef5684e615cc3165a8e923ca5fc4dacc6e60d7","boxId":"2bb58ff1ec0295bfd6d097937f56089e1f8d64ebf700896efea467ba016d6be4","emissionAmount":1,"name":"Ergosaurs #31: Hero Yugi","description":"Hero #1 of the Ergosaurs Hero Series. @Ergosaurs","type":"EIP-004","decimals":0},{"id":"1e604832258859b3f6b302cac3b28dcc2a7dd13a7756a76f37dd4a85fc77a924","boxId":"57292393cb304ed9082d1b6f57f277b9008635a66f219e6543afd331c82c7bf0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10233.8834, \"stakeTime\": \"2022-07-08 12:56:58.504000\"}","type":"EIP-004","decimals":0},{"id":"be1ff5aca84c85bbd162fae7753c3601e8c56fe238a32f6decea5e59edceb689","boxId":"10c44a6ebbeb58bcd2ecc6fc770072b235ac5bd148ae6534268e4bb5a9becafc","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 27737.2262, \"stakeTime\": \"2022-07-08 12:43:42.156000\"}","type":"EIP-004","decimals":0},{"id":"6e622e0bd30db16987ce37f129a9d74a0d6c0eb8f327a45b66b572012526ec28","boxId":"309ab4b9ca66dbfda69e6d19c4b4e624696d0849ec5f081a1d7ae30aa4fb7101","emissionAmount":20,"name":"Ergosaurs #30: ERGXODIA","description":"ERGXODIA rules with an iron fist. Deemed unstoppable until the Heros arrived. Carnivore. Part cyborg. | @Ergosaurs","type":"EIP-004","decimals":0},{"id":"1bd9cdf35ac21e9ada8e9fa5d81051ee9f0f678b4e95dd361e89dc4a2971716c","boxId":"419697a6739686e51f8af5b0c8fe1b0b250beea7159e97bd755396e47f566e36","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 373591.0599, \"stakeTime\": \"2022-07-08 11:59:03.622000\"}","type":"EIP-004","decimals":0},{"id":"05e0b6494aff3bcafd3985f4977751094e715f1ff749dafa16287ec1b5435204","boxId":"af059374adedc546f522120ba9624ba73669545366010448738e7e76590cb135","emissionAmount":1,"name":"Bubble Heads #22 EPIC Kokushibo","description":"EPIC 6/40 - Bubble Heads is a collection of animated NFT's that have different types of rarity. https://twitter.com/bubbleheadergo - The holder of this NFT during the snapshot will be entitled to the respective physical artwork for free (excluding shipping costs).","type":"EIP-004","decimals":0},{"id":"8d49adf696cc9b6b3e3de3927baaad6d23878bce3515e48111f00dac8d3a8eaf","boxId":"55e1b3a2b6162033bfb2094c02fbc462b92e28ff36a319e878586c4a4b115709","emissionAmount":1,"name":"Mahadeva - The Greatest God","description":"","type":"EIP-004","decimals":0},{"id":"9e4969771520b261f82ee19548efef17f5f36d3ae4f405541f6e6f0e6ad9cf7a","boxId":"f35c7490d51de8d5297227e27ba44df39c37459b2f6f72ff2e48cc698f85057e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 91530.0546, \"stakeTime\": \"2022-07-08 10:47:09.100000\"}","type":"EIP-004","decimals":0},{"id":"120dd2e072155de2db35afff2d936e9f4781c02a50396e109dbcb650ce244697","boxId":"a0588a939440fd464cdc9a0b92f6e6e9de707e060cbab0b1e230966f24cb6511","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 42901.839400000004, \"stakeTime\": \"2022-07-08 10:59:00.736000\"}","type":"EIP-004","decimals":0},{"id":"f9110ca2366434fb7a9448dd83abe441a80076793698d6b8d4873a2160ec51e4","boxId":"63971a83ddd933c348224bfc9e748951f6463e2fa50ac07ea186f6cb4176bfb5","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 25000.0, \"stakeTime\": \"2022-07-08 10:57:46.475857\"}","type":"EIP-004","decimals":0},{"id":"ab466dea2a54d1f9a532cd6fa4cc1ee1545978e2dd3ea3e946b936be46179907","boxId":"3a8f43742dc5ac0fcef8ae44f396514db502122fa9a4b6578cff89e605ffc414","emissionAmount":1,"name":"Head of ERGXODIA","description":"17 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"91a815f9ec0d49191fe40b65251112920938c7721a60f4b5203a03e6390d8301","boxId":"6f4350fdd069ed44f360dba843c221905ed326cf548665d2ad8b019af2011f79","emissionAmount":1,"name":"Left Leg of ERGXODIA","description":"9 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"b6c9e41e0951c3d424afb63fb5157f209185edf0936e682e6a130e54b0fa9295","boxId":"95f84af6ed354283fe16f49abe5985c44cd570c83ed27a6c8fba328958ffddf2","emissionAmount":1,"name":"Right Arm of ERGXODIA","description":"5 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"b55606a8ae6f6cc255c88de17ee98c49a6762d83777a7988ae96940114166865","boxId":"53350d986e9d03e6cc4dd5aaac8a056e5e080098cdfc7dd7b985945fc436ad13","emissionAmount":1,"name":"Left Arm of ERGXODIA","description":"4 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"9f317115399b39aaa24eb2a44d2765705c8ab7af8943501d8018ee1dc0917756","boxId":"6c6a0ebfc379735423fe9867c1be6322ce260b4a5d06dde81dd94203aafaa97c","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 12725.9284, \"stakeTime\": \"2022-07-08 10:38:57.366000\"}","type":"EIP-004","decimals":0},{"id":"d48fe095a243bfcd860b3734056af72b850ca70c79a7222f04c06b45faadef05","boxId":"03a6066fb3eb0d2709cb5822ab4164e0ce1d27db3c3a983bd61f9ad0eb6daf26","emissionAmount":1,"name":"Right Leg of ERGXODIA","description":"13 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"6b7499db2bf5a2cb3db0a3ec6560f23a95b2e883867a9e917df033c44be79175","boxId":"2c3736d3a9d2c8e2bd9e36780f8098ae9893f8f4c7528a2b78f50f91f8ea6071","emissionAmount":1,"name":"Right Leg of ERGXODIA","description":"13 of 20 for this collectible ERGXODIA limb.","type":"EIP-004","decimals":0},{"id":"d022d9eff29d13df1f0b53171a5d557a6b7c393bf3b1f8e4cc831bb72b2e625e","boxId":"e410cdec68d08ac158b39f35843627d0a652c8627304fd34ce9a0c60f9e189cc","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 37118.2873, \"stakeTime\": \"2022-07-08 09:28:18.448000\"}","type":"EIP-004","decimals":0},{"id":"90399ac7b0373be721e8c8168be63a4bc7e3c8f4431b8f38d42d449a02d907ab","boxId":"af107ff0424e5520bcc8b45df07347251174841338667de43dc4e9c031dea557","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1000.0, \"stakeTime\": \"2022-07-08 09:09:47.143000\"}","type":"EIP-004","decimals":0},{"id":"12f267d39e5cea7dff027242e55842e52bc9e7f7cc863e0a288d8dd8546b52ae","boxId":"612e7bfa7c373607201fa26950a4ffe6589e8af4624dc2135d66fb1ccd1a833a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 194.46810000000002, \"stakeTime\": \"2022-07-08 09:00:18.849000\"}","type":"EIP-004","decimals":0},{"id":"0a55bf579108c97fa6fa16619ea5977c0368b4ae2f3460f6cd85c41dbd7c9949","boxId":"9d32e65adbf5b5d15ff6176d07502c3ece51aaa6ecb3348b9f0d5c038b94f76c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 385501.50190000003, \"stakeTime\": \"2022-07-08 08:28:24.304000\"}","type":"EIP-004","decimals":0},{"id":"ead80bec6da63ff623a937282e31b9ddf26eaadff4c9918c7ae1b02d570eeda2","boxId":"62946c934a36b20a81ee5679e2a1deb734ee6c446b319ef7aff80aacd1d8eee6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 133538.3283, \"stakeTime\": \"2022-07-08 08:23:31.372000\"}","type":"EIP-004","decimals":0},{"id":"1753c2e04da72cbb9fb7931a00a08c0f6ee582165c1c67ba349e642c4753d817","boxId":"0d1b46153778dce0f30413c32034d69e82f98f33568fd6500760d76ad1df28fe","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 767353.6059000001, \"stakeTime\": \"2022-07-08 08:05:44.207000\"}","type":"EIP-004","decimals":0},{"id":"bde91aa85aa175262d0b2c6d510f5035231b30ca9dd3e8995a5d726c4ac24429","boxId":"b8dd72d4533cfed5e2d2464f8ebae343642f24d7025502e62519f0417099e0ae","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 15000.0, \"stakeTime\": \"2022-07-08 07:21:27.229738\"}","type":"EIP-004","decimals":0},{"id":"d966d1b9d88d9d628c5747f63356cc547b6300a9d5c25a46adc5dbd23e6a24e7","boxId":"ecbf1e171d4d327a2038353317b8d8babe5c900e49589ff327c970a0be508444","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 263159.9869, \"stakeTime\": \"2022-07-08 07:20:54.901000\"}","type":"EIP-004","decimals":0},{"id":"9aa313997e8db4b504464bc1fa74bc03ef97711ed38ab11ffd7b7cfa6b10432e","boxId":"215b7b3a0b77bbaa04dbb526da2972f274f1ee9084375cf219fe0901b1998a39","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 3457.2798000000003, \"stakeTime\": \"2022-07-08 07:04:31.995000\"}","type":"EIP-004","decimals":0},{"id":"2f5651739705c80111aea7f15cefddb59df4ed910d8eabea5f0490104252d17c","boxId":"061dfcbe948f978e82afb4f08240b29211d175231ef3fa1c3a1ebb85afd49c52","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 7100.2732000000005, \"stakeTime\": \"2022-07-08 06:55:29.165000\"}","type":"EIP-004","decimals":0},{"id":"122ac586e056051b3b9ba027da04e65b7554c16f7a9a8d2c51a7bd97e5b78c76","boxId":"20bf5fdbf08c458c793c9d959950247299c3d2cf80a109c45903e8f3f8d3b4fd","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1684.23, \"stakeTime\": \"2022-07-08 05:29:55.031415\"}","type":"EIP-004","decimals":0},{"id":"a2ab233e3c49d1a26ca6a78adcc452eb95210894cd9e4f9e3437ffd5c9a7202c","boxId":"94323ddc45ff85fc9dbf3b3b06c7f9be30ee935d2c8a0037f4c2b5f800484442","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 54143.9066, \"stakeTime\": \"2022-07-08 05:24:51.886000\"}","type":"EIP-004","decimals":0},{"id":"68a73ccbf1b5121ce1899f07ae7f19eea51ad7484b0c84bc79511e7bdd551417","boxId":"cdcf375c91c766ef954927d6c2610b3912dd54b2702004d448f6f62f660c3207","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 168356.4689, \"stakeTime\": \"2022-07-08 04:22:06.814000\"}","type":"EIP-004","decimals":0},{"id":"070db539aea75ac61e067122eca757628d3cb71ef0bfc1093b056758542767ac","boxId":"62c13fb6b3bda2c18420e80297da4c5055afaba72f2f4dc1adc4ccfde9ad1c95","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 6521.5302, \"stakeTime\": \"2022-07-08 03:39:13.713000\"}","type":"EIP-004","decimals":0},{"id":"d341a3a6d7a387c453b04a8a1cafe5aa06a9f7c04aaac83f0bd8dd70ca63f820","boxId":"5c37e9f41f265e5c97026bc4fe77f41906872efa613a3b01e42a0ce1248ea599","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 111761.3756, \"stakeTime\": \"2022-07-08 03:36:48.096000\"}","type":"EIP-004","decimals":0},{"id":"e1e87837714e366120c06fab689f704c7a07b79d674b8b15d41640f39b146d64","boxId":"8be5af3a0a7ec8de1ccf088e2829b30d412f4ce3cc44c6fff810611658a67155","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 15159.2693, \"stakeTime\": \"2022-07-08 02:39:08.585000\"}","type":"EIP-004","decimals":0},{"id":"cd576529aeef855e70ee7d71839cb9f7983e421f34e09558541b195b590b6fd3","boxId":"fa917f7e24545d6f54c2dc141b8ab58781cdbd9b40afa15ab6ea1cec33601657","emissionAmount":1,"name":"Holiday Dreams AsH #044","description":"","type":"EIP-004","decimals":0},{"id":"370a25cb8432423acf1485e05028a3a09bce06e4dc23d6372c2bc98062ca4c38","boxId":"aec2b0e78c9bad8500da8fdcccf4cebabf319e7f2a690139bf4544fe477f1044","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 3949.32, \"stakeTime\": \"2022-07-08 02:04:30.154037\"}","type":"EIP-004","decimals":0},{"id":"3b9728c55c5c11e599788ee90d276469db2a9448b5b38c9792103b037d119bb6","boxId":"eeebc9ff77bbce606b399d02d88abe19846b62b0d41c78c0c5dedf011b44ed88","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 893.4306, \"stakeTime\": \"2022-07-08 01:11:03.580000\"}","type":"EIP-004","decimals":0},{"id":"0f8a6f67676f78ae273b40101c5962e847a2e32305c78361ad960a0ae204e195","boxId":"6137b2e28bfb123e078631869eb2c60e0be765d6ec2eceb8e49c3052615deb8a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 327783.5962, \"stakeTime\": \"2022-07-08 00:59:37.006000\"}","type":"EIP-004","decimals":0},{"id":"2db7f8f658ab7d354a95e3459666919413fd19d95b93da93d38c5a907d1be355","boxId":"9ea5684bae186793f2de5f087e4f58c7502809c89ef4e1e832ad8ca86ed72f0b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 4036.7546, \"stakeTime\": \"2022-07-08 00:07:53.730000\"}","type":"EIP-004","decimals":0},{"id":"22b123df0e15557009d38677512155628b740f454aa7f79b87de311ff9a2d2d7","boxId":"035f38fe421c490a2d9a2e28cb7ac79b70b0fad82b734eea691224208021190c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 7267.7595, \"stakeTime\": \"2022-07-08 00:04:19.801000\"}","type":"EIP-004","decimals":0},{"id":"0a82e2674a0890ec3e6592709f31bbbfcd2e96fb3a7f8de9dc2e7b24fba895dd","boxId":"b539f2bcd3fa2ce5f1a6ec89700ee42aa4e7189cfc533d71702ed30b303cca11","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1154717.6555, \"stakeTime\": \"2022-07-07 23:44:32.867000\"}","type":"EIP-004","decimals":0},{"id":"ff52e0cc45cc5d518c5aaf547996d9b81b50898e642088c5533f46abb857b2b3","boxId":"44a11e886bf4d32688c3b8236aaab64b46712b1d7d83029552aa7c4efc4fec48","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 18797.305, \"stakeTime\": \"2022-07-07 23:38:13.768000\"}","type":"EIP-004","decimals":0},{"id":"fe35411cf1dcb994d10c596234e607a2546e660ebe4619c77afab7cb19604d59","boxId":"c1b42179cba96d558500afa2001b17579288420ef32e6712b66c9319acf5af32","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 85682.7964, \"stakeTime\": \"2022-07-07 23:23:56.313000\"}","type":"EIP-004","decimals":0},{"id":"c4b5256959c49718b7a0b1584380330b4d26bd54edd0b2baa6e93e125e12b550","boxId":"b698443efbee0d664903104282ecfc327afb1f4df446270ce8fc780841ca2f05","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 380872.8872, \"stakeTime\": \"2022-07-07 22:50:27.883000\"}","type":"EIP-004","decimals":0},{"id":"86762d91319aa30d206f1f57f868aaa59d4c8e73f0184dc2ddab88c0f93dc6bb","boxId":"b94fc9c89cadb26a7a9d7ccff18f164981e635e7e22c703ed348806f9927841c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1281725.2633, \"stakeTime\": \"2022-07-07 22:32:47.850000\"}","type":"EIP-004","decimals":0},{"id":"fd0aa90410b1663cb18e01dc06d79529477c551ccd60ced01de73a62ed67cd26","boxId":"17d95cc8ec58e814ec0155e5b64625c99b4c247e113e8d52b4d2efe8991bd858","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1001.31, \"stakeTime\": \"2022-07-07 22:15:07.550090\"}","type":"EIP-004","decimals":0},{"id":"590f2426ea8a72361bfad988f3eacf09c5295ce719f26d668de1e75eaff29bd8","boxId":"dcb54fd194f2114cb42374647e77491562d7e97897619eed22a8b7434954915d","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 15888.9873, \"stakeTime\": \"2022-07-07 21:45:23.877000\"}","type":"EIP-004","decimals":0},{"id":"353d19adcf1f607816f07d67976c5a95f39694944b849d09bb7d1bf46f95fedc","boxId":"31e6a975374cd90cb339248d1150574c2ae6c338313930c3a298c01dde3049eb","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 453465.0319, \"stakeTime\": \"2022-07-07 21:28:57.061000\"}","type":"EIP-004","decimals":0},{"id":"1783bf8313fcb2bd7fb11aff118f122cfd4386e4d20df6c119ac50b2b00e4190","boxId":"57a97c826173d01f1fcf53470c760700b53aada952f11d52d5ab7450192b9592","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 848606.5861000001, \"stakeTime\": \"2022-07-07 20:54:07.401000\"}","type":"EIP-004","decimals":0},{"id":"9e36298085d53aa3646a33c7e7db42992a6f875b5f9d203ad3d406cfd9136441","boxId":"0da3160435a36b3237b6cf83c09d243cee08e6b8a92838358e183bdb57af888d","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 3415.3006, \"stakeTime\": \"2022-07-07 20:49:59.127000\"}","type":"EIP-004","decimals":0},{"id":"3aac9e69888feb28da4f73bf11bb8a61edef56a6c57264d531d843bbdaaa5db3","boxId":"a006db151f4153606b6533934aa065c10e501c4fe51dcbfd6d6a99e794fe0430","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 164712.1269, \"stakeTime\": \"2022-07-07 20:47:09.409000\"}","type":"EIP-004","decimals":0},{"id":"1896261298c2c4eb3dae1b11173253b1dba4643bdd1f1cca409092933853eb4e","boxId":"824541a534b5bce4eb9ca962364d25be8b438c1c1e94c64a9bc52150f17a08bc","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 111693.6732, \"stakeTime\": \"2022-07-07 20:26:27.797000\"}","type":"EIP-004","decimals":0},{"id":"f7aea6f4fd655515166bf4d18c9727d6bceb9874afcdb159cb4b24ca186f715c","boxId":"c27522680b28b3ebba4a3cfdcdc3ae2e5991f79dfbb4f6f4470593ac7ce1438f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 602998.9963, \"stakeTime\": \"2022-07-07 20:21:27.479000\"}","type":"EIP-004","decimals":0},{"id":"76e576d93b9270ce41f93444dda22c572eb5135947f34b3c6d9a490a53b8cdd3","boxId":"2171dc89d0c983b9e1f7574f53161e8a0bf22aca335752d3a7398852683154cf","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 360401.9523, \"stakeTime\": \"2022-07-07 20:10:07.575000\"}","type":"EIP-004","decimals":0},{"id":"54cc1c3558911b7c8310f4e575d068b740c29f2d969ea5fb5111a95143b4ed3a","boxId":"b06f5f7d4a7e8c718a439274fcc4cbd08e25f3162991960558c7af9cd21d96e1","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 100000.0, \"stakeTime\": \"2022-07-07 19:56:54.444000\"}","type":"EIP-004","decimals":0},{"id":"818c7e906d0f091d6f57656ead18fba66d9e03f0b6a6951a54d3555ea6bbc542","boxId":"f3b5dd58ee540e15ae860eb6adea94b08aa1274aae595429090525be2d493f97","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 3025.63, \"stakeTime\": \"2022-07-07 20:03:16.220971\"}","type":"EIP-004","decimals":0},{"id":"b0f32b24baed6f4dd5c26db1c85d9e4ec268c65a863fc7d6f86bae0d4763adc8","boxId":"f46315c8e35a8df55ec46b64090fc2e6aed51fc9e1aef703f21ae3d1c150a54a","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 68779.3536, \"stakeTime\": \"2022-07-07 19:53:24.846000\"}","type":"EIP-004","decimals":0},{"id":"ff737352f7a22ee50a929bb3a9615769f1b58fd1d3f3c6790bf54d7bcb3f86d7","boxId":"98aebd581a224b7d6c399d18807302cd887407d8ee5c7f2d7f1d560157a86159","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 62420.007300000005, \"stakeTime\": \"2022-07-07 19:37:18.885000\"}","type":"EIP-004","decimals":0},{"id":"e7e878902424b5c4efab06a5c61777b92f0d4f5e822178e56a3a7d031f8760b5","boxId":"4dbc1b6110e668b6087019cab7e58da4bb5b33f0a152db901ec72c90f093d00f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 9237.7049, \"stakeTime\": \"2022-07-07 19:36:43.445000\"}","type":"EIP-004","decimals":0},{"id":"22c50c613da076e0e37c9bdb9018075c29688cc6926454ca749ff445a3539132","boxId":"f6a99c064a9505acec6e50e88b4fd5dfb50889a4417e719c002a5d5636401162","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 789479.9609000001, \"stakeTime\": \"2022-07-07 18:14:06.934000\"}","type":"EIP-004","decimals":0},{"id":"21141e8b5f0c8611473b7b902c00b9b6cec6b88b4675136bb6766dda521d0593","boxId":"bf990081309d8ab434f9c6d8b4cb4382ba96490ccaea212ccc640489cb4acc91","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 26081.967200000003, \"stakeTime\": \"2022-07-07 17:57:29.279000\"}","type":"EIP-004","decimals":0},{"id":"ef96958762ebecf4bf44e0638a58faf2fcb72b1d52ec5b0078ff85574adfb50c","boxId":"7ebcfcf963011846f9008ca8b18f22abd760aed49a59f528c2f8383a6fbbcce2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 18857.0, \"stakeTime\": \"2022-07-07 17:33:22.165000\"}","type":"EIP-004","decimals":0},{"id":"6387d8f20a0901707bab0b083b44e27888a576122fbfc879c21f0902ace296ad","boxId":"9d44ce36c32374fcda7ba91978d3515aadefbec41e906b54671aa752c94cf29c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 9178.0794, \"stakeTime\": \"2022-07-07 16:46:45.949000\"}","type":"EIP-004","decimals":0},{"id":"d0e7004e634ddf6f16469d96b1d19e889e34c0060de6dcb253f57c6e7c09a0e2","boxId":"89008b8582c71926505126653c006528805ed953383d2061bc9e9d68f08ae8d5","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 11234.75, \"stakeTime\": \"2022-07-07 16:33:46.871000\"}","type":"EIP-004","decimals":0},{"id":"12fd7e8da82e966e4fee697a076f4500115101ed8a99423e53660227dfecc5db","boxId":"1005584f38a1a0661b50e93274ac3421ac4e24bc6842e1d27a4f1c259960852f","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 2189.781, \"stakeTime\": \"2022-07-07 16:08:44.868000\"}","type":"EIP-004","decimals":0},{"id":"be52ad5f32a405ffce809956f44df49ea9243d5000672878aced275f1c694621","boxId":"a521d8ba53c2f48f5da6f1dfdc80ec34727ac90f714b9469f9bf94feefcb7584","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 223996.1558, \"stakeTime\": \"2022-07-07 15:57:04.156000\"}","type":"EIP-004","decimals":0},{"id":"721ef318796dbf7e576e69498561aaf2856510668e92156b09757f4b356d2ce1","boxId":"c2b8644e7a42be861a845bbb163b0266e0f2800254e1f692b39dd9776b967c44","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 319492.94820000004, \"stakeTime\": \"2022-07-07 15:48:37.509000\"}","type":"EIP-004","decimals":0},{"id":"a824094eaa42b6e69c1bcbea9c466d2895a09c07c320fe0cbd312b72f044d956","boxId":"c8e00db24d6666664cdd5586ff92aa36e50e6541b73bb818d2c2e8919293f2e0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2416334.427, \"stakeTime\": \"2022-07-07 15:40:06.495000\"}","type":"EIP-004","decimals":0},{"id":"ec4d78f688504b8a531d22e2682a0e2a22dab1956a031c5ca3f13417eb9059e7","boxId":"baf9b37cda5d32abae6daa219f4cbdf8ed911575a745ffc178f6d24fd9f9b76b","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 28151.663500000002, \"stakeTime\": \"2022-07-07 15:39:32.327000\"}","type":"EIP-004","decimals":0},{"id":"e40d59986ec056981001a3e0e19cf88b1e79125187fcc4711f708afd7ee8f464","boxId":"02e5730fd61c4b6d4ac99be927fb9b2d092a7399e4c43efe24ddafd9121b81bb","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 223565.2397, \"stakeTime\": \"2022-07-07 15:35:23.329000\"}","type":"EIP-004","decimals":0},{"id":"e4e6e7e2448125c8ea26493c9c7655ef70ce9e7988bfd40a0f4d8220485e308f","boxId":"59374712d0e3807c178a6c4b57fb06c8740ed16c91004753795adcb3ca0c00fa","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 3846.1539000000002, \"stakeTime\": \"2022-07-07 15:37:28.261000\"}","type":"EIP-004","decimals":0},{"id":"07c2d9e3ed5a16f8d0d11fa3afe763e223324eb1ff907e741f9569859b1a10f9","boxId":"73f383d29e057b5c59b819b5c3688f54e514eaa2c70aecaf112f31d254a6f50f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 11302.0691, \"stakeTime\": \"2022-07-07 15:26:28.129000\"}","type":"EIP-004","decimals":0},{"id":"3b3fdf7b424616efdac7f42c2c4bc01f327aa240ba1b293ee99cb2fe7be99ff0","boxId":"f456c9af08976fe595266cfa639f80759298c4ce84ea9aa1ee316f28341132b4","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 722535.6704000001, \"stakeTime\": \"2022-07-07 15:16:54.908000\"}","type":"EIP-004","decimals":0},{"id":"a0eb17b10dded603c68c5f8f8bed8649d5228c3a236641031cccc6ac25820de4","boxId":"b010d23949a391927e86cab2f5482fbf37b702da3e14fde1b55f11cc7e2d1aba","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 47136.601500000004, \"stakeTime\": \"2022-07-07 15:12:14.907000\"}","type":"EIP-004","decimals":0},{"id":"e0205547fa6c8b11b6ccdef31b116c81f741ba143c5aa788e5d2dd104feabb0a","boxId":"f57e1e194808f66585349cb1df9780fe7bbaf65507d3be702d5bff032f78b652","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 30000.0, \"stakeTime\": \"2022-07-07 14:49:28.416133\"}","type":"EIP-004","decimals":0},{"id":"d368020ab3f04d8a5fff0b9e220ff9944902cb635691b180d9716c36d8a3c75c","boxId":"2cbd2e1813ada9767342fe889fca3de4d8da643d8b252abe5649c98aa965b6de","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 25001.0, \"stakeTime\": \"2022-07-07 14:33:39.627979\"}","type":"EIP-004","decimals":0},{"id":"df4a2b684c51babc243f9454dd2c18614087689f5b3ac8b7cf94c0182e25e84c","boxId":"6060eeb1a9491c3fbf1a66b113ea36e72e6979dfb331192db5f898cb7de19753","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 43510.9187, \"stakeTime\": \"2022-07-07 14:15:54.584000\"}","type":"EIP-004","decimals":0},{"id":"a37574db78e193457bf8c197938727df3f37af552fcc3e68a8f5117b756ad6a2","boxId":"69da563e87488ad95d68574266fc5cc42ea461af6f9411960190313c463b2660","emissionAmount":1,"name":"Hash Colored Glyph #0036","description":"Hash Colored Glyph #0036. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"d3b01f924b433a76e5350d69026ba84880b0bf688b9378ec04c0d0d28b8dc2ca","boxId":"bf99541fd7cff73ccff4d72aaf39f9f62023347822f9c27159d859ac8d36fe7e","emissionAmount":1,"name":"Hash Colored Glyph #0035","description":"Hash Colored Glyph #0035. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"9cdb6449b8b3ee6ca8f61697247c22f08cbaf62ac301215b5e845fe2c459db4d","boxId":"9fbd4f166d0b866e7427be2594a8e46c62597f151a5900a49c3cc1ff362d27e2","emissionAmount":1,"name":"Hash Colored Glyph #0034","description":"Hash Colored Glyph #0034. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"1bdc4f198c73db98cbcdf90a16440f0c3810366bc4569b3e292b3db8e23d23d3","boxId":"c0f46642d4dd79a2d38da215d2a26d5abd3ca5500c6246190ffbbe586d023649","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1091.7, \"stakeTime\": \"2022-07-07 13:47:09.930140\"}","type":"EIP-004","decimals":0},{"id":"cbb211f8335c628868207b42d4291ab9865ccd60043688fe27326aaaba6f7245","boxId":"98dfca40b744bdc6bbb042dda70de7113af97195ff96b5e3d523e348e926a234","emissionAmount":1,"name":"Hash Colored Glyph #0033","description":"Hash Colored Glyph #0033. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"9ef405d20637b945b389026500b35a71d1343e759ddf96555d8fa8443302e1fa","boxId":"1473f57c3ba936846dbf9a787b44fcf645e7599254664156e2376d16980ec45c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 29593.6886, \"stakeTime\": \"2022-07-07 13:32:10.280000\"}","type":"EIP-004","decimals":0},{"id":"7db7575bbad2de61e13b560f3172ad2c80c5c1af45c0b73507c2402016e4ac4e","boxId":"b9ede73d01cad8d3e1e36b34ff48b2fe9e51a7f2fea5fa5688a8f6c9b22335ed","emissionAmount":1,"name":"Hash Colored Glyph #0032","description":"Hash Colored Glyph #0032. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"fbd938460b0d01757a6365065368f38fc6510c4412b552025b79c9e4bc5f398a","boxId":"86b417671811e7b728b4445867af1d114a2ee8db17b72f2bff82f0dee09432d8","emissionAmount":1,"name":"Hash Colored Glyph #0031","description":"Hash Colored Glyph #0031. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"b6f4f369f748be02ace3f44e96eb04607f8c07d41d88cc0311dd304596ee6e3f","boxId":"be77ea85faa4294b114d62175eaf14796479707f13d4f14eeddc3882debb16a7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 13749.0115, \"stakeTime\": \"2022-07-07 13:18:39.780000\"}","type":"EIP-004","decimals":0},{"id":"6d781ff227281a6131a0bcfcb3efc8ced5418abfa939b546033dab9954611f5c","boxId":"059643c872d5c7de44f01dba480defb380c01b8cf682e4676d5cac6f679bf468","emissionAmount":1,"name":"Ergoversary Sloth #PET_024_ERGOVERSARYIII [1 of 5]","description":"🌟3rd Ergoversary Special🌟The longer the sloth's owner has been holding ERG, the more affectionate the sloth gets | 1 of 5 minted | @ERGnomes by Foeniculum","type":"EIP-004","decimals":0},{"id":"8be22de486bd5532eeccd50d12788222b34567bceac9339f1ae1aa82ab569148","boxId":"7c794b762dba0a3ef47879bf945aedcd619caad9cf771fff3d7a465d2143586a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1739.0542, \"stakeTime\": \"2022-07-07 13:20:03.252000\"}","type":"EIP-004","decimals":0},{"id":"ff3759791781fe574f5f76cf477d41dd724065303f2253ed47ee54ae07b7f0fb","boxId":"53023da5f06024bf19e348c84c68fad131d27df5e07dbbc08918d0374f6cf403","emissionAmount":1,"name":"Hash Colored Glyph #0011","description":"Hash Colored Glyph #0011. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"e4b42e8cbd54b259f7783d7adbf8f70c4cab36c9e73ad74f632d613cb4e9f9cb","boxId":"89efef4472e57302ef2274fab198c0c6c370d943ff8ca0ca9eb495a4a55e5220","emissionAmount":1,"name":"Hash Colored Glyph #0010","description":"Hash Colored Glyph #0010. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"3e41ddfd98dffb4fb751dffb5b5feceace7bc2569f6afbd260cc0b3909b91e10","boxId":"d80355d6b84721e4d7349e7417ce6122b36db48e9e1381ddaa79f3cf424c98d4","emissionAmount":1,"name":"Hash Colored Glyph #0009","description":"Hash Colored Glyph #0009. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"a10639ef306b899715a1e807a3480733423a0713f199ce088ab4062376e2414b","boxId":"a86aade80939c57c27cab53392a2d61c5947da399a8c824d05d0870ad18a4903","emissionAmount":1,"name":"Hash Colored Glyph #0006","description":"Hash Colored Glyph #0006. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"895830913540c0c7c0465e8776cf3e6bf2d2d09ebb0f642d49f6868bc8a9072a","boxId":"4bd5c7b1ee9bb394766f81ade27aaae87e501b2279044dcbd56f527ca47e991f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 36714.1316, \"stakeTime\": \"2022-07-07 12:52:40\"}","type":"EIP-004","decimals":0},{"id":"dfd811cbfb75b8a2c9cbe819d4664182b6048906a89ecbfb17df036869c5a3f7","boxId":"3f6aa5fc7c7a21b316dbebee47f4f7c34f13b21bee5eda30eaa01e962e4f134f","emissionAmount":1,"name":"Hash Colored Glyph #0005","description":"Hash Colored Glyph #0005. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"f1e940c0c04e199868de82c1dd27ff95614684956383fe710575cae2596d026f","boxId":"2815585777efd38f719fca5dcb15dc3e98d76198532325cde4a17d7f012b6ce7","emissionAmount":1,"name":"Hash Colored Glyph #0003","description":"Hash Colored Glyph #0003. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"ed50a355feff609575206bebc3e1487a7ebf99d0f7e3a6ce520f70f9e78ea1b3","boxId":"f882ab4281486fdd6dd2c014378381cc0638d2d5e904f913c9b985dceb120e58","emissionAmount":1,"name":"Hash Glyph #0036","description":"Hash Glyph #0036. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"66a78b8df538b44be4bb4301a915b68886c58c1201c407f91902b5ae7f8df528","boxId":"ad1347072d056a555ad571ea7ce86d89d46242ccbda9ece2ed637d775c905165","emissionAmount":1,"name":"Ergoversary Sloth #PET_024_ERGOVERSARYIII [2 of 5]","description":"🌟3rd Ergoversary Special🌟The longer the sloth's owner has been holding ERG, the more affectionate the sloth gets | 2 of 5 minted | @ERGnomes by Foeniculum","type":"EIP-004","decimals":0},{"id":"7d35e6e64375216d20c10a27d577b4258403148a724a3bd90b1a088639bfa81a","boxId":"283d86818151f3df5ef1cc98234eedc32a7d2d1e8e8b817c891a680f69b0cfd1","emissionAmount":1,"name":"Hash Glyph #0035","description":"Hash Glyph #0035. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"0b22cd2e7b55f22f09e5eba9a2c3db747b80bea802ce104c7e435535465a76bf","boxId":"ad46f86d892a5b31cf642b44a459fb6581ce425eb51d572e5f45f749834e1a67","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 276.5084, \"stakeTime\": \"2022-07-07 12:22:28.373000\"}","type":"EIP-004","decimals":0},{"id":"a0d38ac82ce16cbdab7c139af99577589ee6aee1a82f071a39c459cad78f8307","boxId":"035171993ce062655f980e16f3126b5fb11f024a04150d8e85910cb9a00e7c8a","emissionAmount":1,"name":"Hash Glyph #0034","description":"Hash Glyph #0034. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"e304249f05f509e59ad0b4e7a678578193a00f66a80ceb24debe6d46dbadc8ca","boxId":"db660118245a5bcc798e20135b849deb318465db9219d67d18ff68333a782feb","emissionAmount":1,"name":"Hash Glyph #0033","description":"Hash Glyph #0033. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"4dbe680b703d0ac57c140a319fc0bc05aaef9f5a7fc438921c4af291a2bbe3dc","boxId":"515c186cfe3c1f7d7a0ba6990a2120c216eff49cb74264022b3993d24d8d601b","emissionAmount":1,"name":"Hash Glyph #0032","description":"Hash Glyph #0032. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"db80cda0f48707145415f973f5893ba19c8080c25bca5adac4391740caa6141e","boxId":"07f26d3e97fd410fb357edd9a96d3bda058d48de3583216c26081f8543b56963","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 752.5492, \"stakeTime\": \"2022-07-07 12:03:24.270000\"}","type":"EIP-004","decimals":0},{"id":"b1ecc924d0cdc3e48a470b67697915cbb18e61cf938b8b089db6a3f7e854b06f","boxId":"81d7e84a535e2961c071b56020830de32535ccd031d82fe0d5f1194cb5a655ac","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 6402.27, \"stakeTime\": \"2022-07-07 11:50:30.108521\"}","type":"EIP-004","decimals":0},{"id":"e83ade310cd840f944808060bd52d1be0144d54cd47031aff2dee2f8d33e2815","boxId":"0a3737fbbcd039bc699e286073fe8677e61b3d07cf75b5ba0d36d11a102b50c4","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 28688.5246, \"stakeTime\": \"2022-07-07 11:50:05.593000\"}","type":"EIP-004","decimals":0},{"id":"32ab7f7a16d2e0e05086d8f5df7f375753857e5febea8b25c05962bb319349d1","boxId":"23a5d374aaad7ea71d50ae2a7eb1cc77136cebd918c66cc924122826b89d7d47","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 136872.9791, \"stakeTime\": \"2022-07-07 11:15:35.336000\"}","type":"EIP-004","decimals":0},{"id":"19e73c0e81885251d904c0d0fd5d563a274557c9fd50bd603e14396f62470f38","boxId":"e96fd71abb3a1acc97807a79e9e8fd1400c35c2bb66df0e4273b10a1cd7e0a90","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10279.6794, \"stakeTime\": \"2022-07-07 10:50:06.708000\"}","type":"EIP-004","decimals":0},{"id":"684534e1c100314b6153223c55a0913fa84b3aebf4d4fcda6b9b56687e0d064f","boxId":"ae29ba209b8e878c6f1eb89c0e7cbd6169a9be597cf3253103d9f5686566884a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 633021.8578, \"stakeTime\": \"2022-07-07 10:52:04.373000\"}","type":"EIP-004","decimals":0},{"id":"02575a14b21d78c5bbab821299ebaa907df1ec7780f963330c0515f603db8db1","boxId":"64da162608fb0ed932bda7443f5e607a8c004570db78b22f6b039af9e25e2abe","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 379333.3767, \"stakeTime\": \"2022-07-07 10:52:27.935000\"}","type":"EIP-004","decimals":0},{"id":"35e61d0f2618346c3008c79928c5201b7ffff01b6493a38cca21a7151fce400d","boxId":"9ace3b798f912ddbba1642294f579860fd4c58e37f464fa93778d65329c62260","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 24739.572500000002, \"stakeTime\": \"2022-07-07 10:44:58.047000\"}","type":"EIP-004","decimals":0},{"id":"eca84c9957dbc1962725602cae20879267138d3646f038c498ca1e4b29a5a9e6","boxId":"a50b14f5af973ebfb44c9bc2c55573f6f7b490e8b36d6ba67c0c92fbeeb12817","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 117577.85500000001, \"stakeTime\": \"2022-07-07 10:44:14.587000\"}","type":"EIP-004","decimals":0},{"id":"239f0a7b34e147cbe044a2a902f685cef78f13d65cd5c4f7d77b36f5e77eb7a3","boxId":"fa47fd19b430b243c2b8570423c97eca2ed516d39c176ec9ba643cf93e4d6670","emissionAmount":1,"name":"$COMET Oniric 3D Collection 2407","description":"{\"$COMET Oniric 3D Collection _2407\": {\"name\": \"$COMET Oniric 3D Collection _2407\", \"mediaType\": \"ipfs://bafybeidfgjwyox2im32dnbwmrtcxrm7hmwoktiytys6tlevmpjsvs2hxa4/$COMET Oniric 3D Collection _2407.glb\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Moon Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"Gold hat\", \"Items\": \"None\", \"Main Body\": \"Pink Comet\", \"Tongue\": \"Gold Tongue\"}}","type":"EIP-004","decimals":0},{"id":"ab5b4874e4f3d403a90017889df8c0b3cc608754b7e2f41b0323b953747364fd","boxId":"740dfe10907961901e23ee42c69a55b4a034b24b0cdbca8916fd82c07256ff67","emissionAmount":1,"name":"$COMET Oniric 3D Collection 918","description":"{\"$COMET Oniric 3D Collection _918\": {\"name\": \"$COMET Oniric 3D Collection _918\", \"mediaType\": \"ipfs://bafybeidfgjwyox2im32dnbwmrtcxrm7hmwoktiytys6tlevmpjsvs2hxa4/$COMET Oniric 3D Collection _918.glb\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Moon Background\", \"Glasses\": \"Dark Glasses\", \"Hats\": \"McD hat\", \"Items\": \"None\", \"Main Body\": \"Pink Comet\", \"Tongue\": \"Red Tongue\"}}","type":"EIP-004","decimals":0},{"id":"b20d2419b776315f041066ab1a752909215f8c77585b87c74d930d51bf424ad4","boxId":"7c4d2b6ee19409b04a9ecdb551a3361b5d409815cade8e5cb01dbe36be2705e8","emissionAmount":1,"name":"$COMET Oniric 3D Collection 2791","description":"{\"$COMET Oniric 3D Collection _2791\": {\"name\": \"$COMET Oniric 3D Collection _2791\", \"mediaType\": \"ipfs://bafybeidfgjwyox2im32dnbwmrtcxrm7hmwoktiytys6tlevmpjsvs2hxa4/$COMET Oniric 3D Collection _2791.glb\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Teal Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"Ergp hat\", \"Items\": \"Gold Axe \", \"Main Body\": \"Pink Comet\", \"Tongue\": \"Grey Tongue\"}}","type":"EIP-004","decimals":0},{"id":"dc6360c81e9b479eee22387e68f6b264a6beb5a2dd55af8187a4935cdd10db33","boxId":"6faf65472af0c0436f374ff1e3f67e02f97a4e85c8afe90ffcf4bb45fb058798","emissionAmount":1,"name":"$COMET Oniric 3D Collection 442","description":"{\"$COMET Oniric 3D Collection _442\": {\"name\": \"$COMET Oniric 3D Collection _442\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Pink Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"McD hat\", \"Items\": \"None\", \"Main Body\": \"Deamon Comet\", \"Tongue\": \"Gold Tongue\"}}","type":"EIP-004","decimals":0},{"id":"7039e718d6fc5b09d8a7eda9b07d0d4f9ae2ae6882173f74a76f831e6988ca56","boxId":"610f435138c2eecb04c44e7cb1ae987b5bfad9aee631f10284a951cf5312c5f6","emissionAmount":1,"name":"$COMET Oniric 3D Collection 2323","description":"{\"$COMET Oniric 3D Collection _2323\": {\"name\": \"$COMET Oniric 3D Collection _2323\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Green Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"None\", \"Items\": \"None\", \"Main Body\": \"Cyan Comet\", \"Tongue\": \"Gold Tongue\"}}","type":"EIP-004","decimals":0},{"id":"8af6ef5cc10fb700642c68b81c91ea284d3561f78a2acead1d9f5aade087bc2e","boxId":"d647e2c30fa659d3bac75966c7b21620b19fec75d1152a26f16727798a2de00b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1003.3989, \"stakeTime\": \"2022-07-07 10:18:34.639000\"}","type":"EIP-004","decimals":0},{"id":"37fffc7daba245ce284fb8cb224020b0cdf1875aec2e033048064e8f25ff4045","boxId":"5f7f3e537a2df801487cef467d2d8e600d16901289d5195dd482bde0a3b03651","emissionAmount":1,"name":"$COMET Oniric 3D Collection 1987","description":"{\"$COMET Oniric 3D Collection _1987\": {\"name\": \"$COMET Oniric 3D Collection _1987\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Green Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"Ergp hat\", \"Items\": \"Axe\", \"Main Body\": \"Deamon Comet\", \"Tongue\": \"Red Tongue\"}}","type":"EIP-004","decimals":0},{"id":"c96fe2031fa928b31f213d897d486f903e4b33f26feb7ebd577fd380fca76d50","boxId":"2855c5f53aacab0fd831ed8bbe7a92f8df883e0d4cad5ae5dd8b6ceab0f19ba2","emissionAmount":1,"name":"$COMET Oniric 3D Collection 1298","description":"{\"$COMET Oniric 3D Collection _1298\": {\"name\": \"$COMET Oniric 3D Collection _1298\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Teal Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"Ergp hat\", \"Items\": \"Gold Axe \", \"Main Body\": \"Cyan Comet\", \"Tongue\": \"Smoking Pipe\"}}","type":"EIP-004","decimals":0},{"id":"d155e406968fbd1e4640cd4a8f7b9df5ecda69648a4e39f23b36057b65129bcf","boxId":"36dc334d535d50217d77c9775e345a694ad816b153a680ad4dc8f38aefc82db1","emissionAmount":1,"name":"$COMET Oniric 3D Collection 573","description":"{\"$COMET Oniric 3D Collection _573\": {\"name\": \"$COMET Oniric 3D Collection _573\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Green Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"Worker hat\", \"Items\": \"Gold Axe \", \"Main Body\": \"Original Comet\", \"Tongue\": \"Cigar\"}}","type":"EIP-004","decimals":0},{"id":"03ec058230d744e0fec875194954dfeb93e751964e4b5bab8e46f6f1eac9123f","boxId":"4be485ce958f68fef910f2c945a4d7576def5f95f1499132086fd918097b4200","emissionAmount":1,"name":"$COMET Oniric 3D Collection 217","description":"{\"$COMET Oniric 3D Collection _217\": {\"name\": \"$COMET Oniric 3D Collection _217\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Teal Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"Ergp hat\", \"Items\": \"Gold Axe \", \"Main Body\": \"Cyan Comet\", \"Tongue\": \"Smoking Pipe\"}}","type":"EIP-004","decimals":0},{"id":"97527fac0bc481dd91e97f074097a70fda68f0d54dc00866cd173db71d8a2a77","boxId":"b5ea556bc5ddc28a69ebdf44b19288f6489e76be2d5fe71b23af1164038bcd78","emissionAmount":1,"name":"$COMET Oniric 3D Collection 1214","description":"{\"$COMET Oniric 3D Collection _1214\": {\"name\": \"$COMET Oniric 3D Collection _1214\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Gold Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"Worker hat\", \"Items\": \"Axe\", \"Main Body\": \"Cyan Comet\", \"Tongue\": \"Red Tongue\"}}","type":"EIP-004","decimals":0},{"id":"92701f4d91e696241c97397931d3721258784da27f1a21eb7ede8e11d67ccc58","boxId":"0ad476c7f3e83bcdef28d68b15fe971226e030a6bf5f20bd1c510fd131dad7b6","emissionAmount":1,"name":"$COMET Oniric 3D Collection 638","description":"{\"$COMET Oniric 3D Collection _638\": {\"name\": \"$COMET Oniric 3D Collection _638\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Green Background\", \"Glasses\": \"Dark Glasses\", \"Hats\": \"Burger hat\", \"Items\": \"Axe\", \"Main Body\": \"Original Comet\", \"Tongue\": \"Red Tongue\"}}","type":"EIP-004","decimals":0},{"id":"6b4e76fc118d9a958d86b0aec5334a4d15e4ea8d50156c2dc02e2a237e23f546","boxId":"0ac50a3373f6c9bfa2ac9aa8b2195f680eba1cdafccf8689e1d5dcac4d534193","emissionAmount":1,"name":"$COMET Oniric 3D Collection 2854","description":"{\"$COMET Oniric 3D Collection _2854\": {\"name\": \"$COMET Oniric 3D Collection _2854\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Teal Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"Worker hat\", \"Items\": \"Axe\", \"Main Body\": \"Pink Comet\", \"Tongue\": \"Red Tongue\"}}","type":"EIP-004","decimals":0},{"id":"65afb8aeff5b03a2e4af17456a3baa79d9e525488ce84234909fd0509b0691d4","boxId":"ea1182cbd7a9e91ba85fcc52d7a54c77f856a2f712da97e2109ae69e66a41c79","emissionAmount":1,"name":"$COMET Oniric 3D Collection 1952","description":"{\"$COMET Oniric 3D Collection _1952\": {\"name\": \"$COMET Oniric 3D Collection _1952\", \"mediaType\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Pink Background\", \"Glasses\": \"Moon Glasses\", \"Hats\": \"None\", \"Items\": \"Axe\", \"Main Body\": \"Original Comet\", \"Tongue\": \"Cigar\"}}","type":"EIP-004","decimals":0},{"id":"93172a163b15176ae11b6e4076a4d92054263a51e160cd5ab0c57c4f64f8c97f","boxId":"f1d7fe401a8c4cbfc7907d89116d29d3165022be783b34d09e1a28923f448c04","emissionAmount":1,"name":"$COMET Oniric 3D Collection 515","description":"{\"$COMET Oniric 3D Collection _515\": {\"name\": \"$COMET Oniric 3D Collection _515\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Gold Background\", \"Glasses\": \"Gold Glasses\", \"Hats\": \"Burger hat\", \"Items\": \"None\", \"Main Body\": \"Deamon Comet\", \"Tongue\": \"Smoking Pipe\"}}","type":"EIP-004","decimals":0},{"id":"0da89bb0e5e9a78f6462b276f652ebf8684f581d9b49d1c14f73d028b068da63","boxId":"7254a327574a23f7550ca6bf8c13eecf4e4bf11893cfbaa60bf122c4530a5138","emissionAmount":1,"name":"$COMET Oniric 3D Collection 2861","description":"{\"$COMET Oniric 3D Collection _2861\": {\"name\": \"$COMET Oniric 3D Collection _2861\", \"image\": \"\", \"description\": \"The second official $COMET NFTs, because doing 2d stuff was too mainstream Leonard decided to make it 3d and give it some utility. A percentage of $COMET lottery profits will be airdropped to NFT owners.\", \"Background\": \"Moon Background\", \"Glasses\": \"Dark Glasses\", \"Hats\": \"None\", \"Items\": \"Axe\", \"Main Body\": \"Pink Comet\", \"Tongue\": \"Cigar\"}}","type":"EIP-004","decimals":0},{"id":"543fae71858cb903bcf07f5a5e613a61850e709f104c1bd16012f3cc9a654a6d","boxId":"8f63bbaa7b454915e79dcbcc4e0370bac93ec64533ff12156409e7bd6f0e13d2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 3703.4446000000003, \"stakeTime\": \"2022-07-07 09:55:31.398000\"}","type":"EIP-004","decimals":0},{"id":"3f67774f4fb3c8e47591efdae05418bf970733fccfa732f6d2369382f2104b16","boxId":"d63f975d73f0a0a39f9e832606c9628b213ee685be08138623585fb842c89290","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 12766.995700000001, \"stakeTime\": \"2022-07-07 09:52:48.234000\"}","type":"EIP-004","decimals":0},{"id":"b10c5a680957a3e29196a7834b18fad7d4ab89bb483b861c48b4b031ce94b3d6","boxId":"98c8d177cb45d9ba2a9ca17b2f99cff049134e25e90baeab94b94aa54bdfb9b6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 351363.0, \"stakeTime\": \"2022-07-07 09:42:46.815000\"}","type":"EIP-004","decimals":0},{"id":"8a7a54c0c0583cb48bd7dc5959cae25cfc3b136bdfd408c83523f9659ec23523","boxId":"dc1eb95beea2916ea3d4dcc632cdc49bab92ca48ad923f583cc94d1ed34d7585","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 29640.846400000002, \"stakeTime\": \"2022-07-07 09:31:30.187000\"}","type":"EIP-004","decimals":0},{"id":"4cb2c1937aded6b50de4dae66d7c75169eb312ef89567287468054958e9c0120","boxId":"73a7726d1c1cd59cc6aca0a47744b178369c55a9915aa808ae4487e6b066721d","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 294716.8016, \"stakeTime\": \"2022-07-07 09:31:50.271000\"}","type":"EIP-004","decimals":0},{"id":"e5a2a3be425aaea295f29f8ea4aff05ec85241c52785409d7825168adf7d4748","boxId":"1baf097ec9b343482ec905c6526af246015df4967e9631039d9cc39774a458e9","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 62712.5985, \"stakeTime\": \"2022-07-07 09:32:10.079000\"}","type":"EIP-004","decimals":0},{"id":"6d46115d041521bd6650696cbc8e08f8c2a541afde3363fe2bef761fb34fec7e","boxId":"dfe0c6ceaf025582d6efea768f137fce2aeab477cb4b5a07181a200950a1c67c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10181.4783, \"stakeTime\": \"2022-07-07 09:20:40.913000\"}","type":"EIP-004","decimals":0},{"id":"d282d2b0962d9616619d0e78fd88adb831f8f03820c3cc5f456b07e8e691bc7c","boxId":"742f11ef7e066e622fff755360da7f0363c9f0d4e38b81802490faeeed8c3ad2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 367141.75340000005, \"stakeTime\": \"2022-07-07 09:18:18.842000\"}","type":"EIP-004","decimals":0},{"id":"42441465e2e6b76c40b88075503d5466ba9ff74e6bb5aca36134852875dbb06e","boxId":"0227f13a172045f3f50857c840bfd432f84fc6f78927677c72f132e679cb74de","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 3278.6885, \"stakeTime\": \"2022-07-07 09:09:10.001000\"}","type":"EIP-004","decimals":0},{"id":"0146c1fe70ebecdf9a6ed94b25c1a5e8e064475e76f91deff263d0c4ef9c2c03","boxId":"58284c710ce18b014e881e49d58f9e5771def235e620cfad379b206ce7b99200","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 140580.9457, \"stakeTime\": \"2022-07-07 08:59:55.442000\"}","type":"EIP-004","decimals":0},{"id":"dd7be3d72edfd6c4c9809d4f8425b99f1406a4b6c0ce04ce61e604479beef484","boxId":"a0657cebf3fbbc568e7e8fbbeaafc2e81ab973270e5ea625cee1c939e05ca68b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10928.9617, \"stakeTime\": \"2022-07-07 08:26:19.349000\"}","type":"EIP-004","decimals":0},{"id":"e68a0fbd0ab3a68cd0a092a8378c39d37a53928bdf63fbb6ee0d78be01a35ec6","boxId":"c7241d19606205cc25132c58204ca1dbfd31bfe8a703cfd91f1f7783753c83af","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 77868.8524, \"stakeTime\": \"2022-07-07 08:16:51.867000\"}","type":"EIP-004","decimals":0},{"id":"818c42a30f7148276223c1b9a8162d67943a2e23a993146b4e5ad0c71b2939c2","boxId":"f6ee67b5ecb12d2e43fb1267c46f8642e17611577e86244234ca8f363a1f32b0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 251370.0215, \"stakeTime\": \"2022-07-07 07:50:03.729000\"}","type":"EIP-004","decimals":0},{"id":"3cb5348e1df6ab9996657b592b0b1b821d2efc09d472e1d0cf4a0868e29fb3d3","boxId":"9e0fcde07cb6850b903623e4ef03bfb56965c166ce0576dc5b67745c9aa7f4e4","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 60335.1491, \"stakeTime\": \"2022-07-07 07:22:48.945000\"}","type":"EIP-004","decimals":0},{"id":"ef74df62b7f13425d046baab7ecb3259cad19da94ab09281ca7e8ef0cb71b7e9","boxId":"040c551b9c31713e4b7859a22d98dda89858b51a9fe92fff906b0b59e24760ef","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 309345.0811, \"stakeTime\": \"2022-07-07 07:21:47.511000\"}","type":"EIP-004","decimals":0},{"id":"916bbf02546886fb2e70171ef658490b0293512ca62202077340fe028f69e32b","boxId":"b2ee016709f086a34949a7d197ff8ab5d764b32242dcf7555edac3298d867f37","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 39344.2623, \"stakeTime\": \"2022-07-07 07:16:24.826000\"}","type":"EIP-004","decimals":0},{"id":"d0ee593b83258dae2b14a3af853059653075e3a8d33d90378de77fdbbfd4d8ca","boxId":"c67d395631982bac3c784e704c9075f239e34dd567810fd8f67c4820d0ceaf01","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 11571.0383, \"stakeTime\": \"2022-07-07 07:16:00.723000\"}","type":"EIP-004","decimals":0},{"id":"e4389665544e9ea84ea8f95e27ad18f090c4c954db230029f86db7b18a425cfe","boxId":"0763958ab62ccc8b91ffb1d8b4e49c99374764aa70d418f1673a2b197a5e4174","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 39344.2623, \"stakeTime\": \"2022-07-07 07:10:44.122000\"}","type":"EIP-004","decimals":0},{"id":"8bda24f75ebf8f6dda6375dccf632f6692b2e85ec621a4f1fec2a10483fbfff6","boxId":"5f9f8253fcb2c88c0915292292d652a702da9d8475dae979e640376b47ac1012","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 424600.7647, \"stakeTime\": \"2022-07-07 07:04:28.205000\"}","type":"EIP-004","decimals":0},{"id":"bcd44ce4417ade995363d1db0fd5e75d49396ec4097a0407712fdce06665dd09","boxId":"94bf0adea9b97883fe672f7ef8dca3145f34ebffb7d5440808f11eeb4fa6aa0a","emissionAmount":1,"name":"BWRod Art#08","description":"","type":"EIP-004","decimals":0},{"id":"e218aa045b4997b8cf69caac50a3fb0dc0e466dba0ef2afd87f59e45ae21245e","boxId":"d4b28910b17d20591599d4090a8f6720509ce269287aa7c760a4d5e73770453f","emissionAmount":1,"name":"BWRod Art#07","description":"","type":"EIP-004","decimals":0},{"id":"803cd4b3c875fcc8cd6ae574966522f51aa5cbdaab46ae88b99c934c78283725","boxId":"bdc8c5c844c9c9c1f1f4303cd5d618ff47c12339eb2864cb85a5e8dc02f797be","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 159255.4068, \"stakeTime\": \"2022-07-07 06:43:28.602000\"}","type":"EIP-004","decimals":0},{"id":"9cfcc396cdc4ad77de3be5bee6cf745a113a9f2d906ee904319974b79556e937","boxId":"63c3e8e57fc7b07a6c372b4dbcf67592b03ee4301a8971e2ce4b4ca51f0e8d78","emissionAmount":1,"name":"BWRod Art#06","description":"","type":"EIP-004","decimals":0},{"id":"cda08483bf1148c5989b40323e8dd01b7a745260b7179af4c897d0b797fc9ccb","boxId":"44f27ea007a6843f98ec6049c75d1ead1dcb0c3448e8d77ecd6ae3539a429885","emissionAmount":1,"name":"BWRod Art#05","description":"","type":"EIP-004","decimals":0},{"id":"0cf59b1e1c64eaeba9c0a7ca668063e842bc15f1a76307f9e0296ca97af9bd71","boxId":"ed55615bff76303a4ef57bf742492e32e3b01c87e27ff3a839813a0a40712596","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 81601.0928, \"stakeTime\": \"2022-07-07 06:40:06.979000\"}","type":"EIP-004","decimals":0},{"id":"4faaf60bf962440a14486a3f671f202d1811f5cf8027437c8be59d4f93e0427c","boxId":"aacdedebd94bc41998d0063faa0cfc276572e6e65bef0d79808f36b056ebc67a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 346585.86590000003, \"stakeTime\": \"2022-07-07 06:35:55.298000\"}","type":"EIP-004","decimals":0},{"id":"8765db2e505117d995038e8a1af763215515ff4baf20467f27f2533989dfab97","boxId":"3b597f8faf8b51aa8d05dbb8ef89c8f7cc6ccd74e3243865d5768cc7e8480c7a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 50612.9398, \"stakeTime\": \"2022-07-07 06:28:17.921000\"}","type":"EIP-004","decimals":0},{"id":"8da00b0d962acf0dd5bbad45fe78a7a49b230e21f3b1c19b4b0072ef62a31c09","boxId":"c667d568b1b4c53283138bdb79489a168a65ecaed8ced4c1dba74305a03c00ef","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 57843.772800000006, \"stakeTime\": \"2022-07-07 06:12:51.421000\"}","type":"EIP-004","decimals":0},{"id":"77f818b49f91f9b55a053bcef15ce84091a29b51e8d9522c31321f449a9909fc","boxId":"0c65762824829294382dbca41256f5d09b277c7a0f597dbeca6cf9a8e3bcf2b0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 63484.5368, \"stakeTime\": \"2022-07-07 06:09:32.953000\"}","type":"EIP-004","decimals":0},{"id":"a7c9f0a1dec2f870cc8b91e685e678e1a8cd404b47f5ed0e72b4754bf58cebc8","boxId":"55c4dd8f19a39f275b16c72bd5d59a8065c950a11044a0fc1afbfda2ce1de4e2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 76237.6538, \"stakeTime\": \"2022-07-07 06:05:44.408000\"}","type":"EIP-004","decimals":0},{"id":"1f5ae157afa325f4dd66bb5f8a540fc1d1e8130634854625403e24a0c59a2149","boxId":"85b61861b3f358dec82a5ee1b48098decf3c3b586d3cb21afa525776767e6b47","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 571404.7541, \"stakeTime\": \"2022-07-07 05:57:24.399000\"}","type":"EIP-004","decimals":0},{"id":"329776436d8b796c4f1a7fb7a447abe8ac56db88f8561d3b160783e95801db5c","boxId":"c49115ce462f309e5f056fe82c10601ed51c1db6b7f3c35461a8211d6231c4fc","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2133601.2653, \"stakeTime\": \"2022-07-07 05:47:22.225000\"}","type":"EIP-004","decimals":0},{"id":"dfe947631c9b669a8aaeea1fcc25c175104891e5e6dad8279a9daa1ab548f77d","boxId":"7c618872587aeddc3b2d7a0fb855fe66690ddf27fb0b5a9c46e48ee101b33bfc","emissionAmount":1000000000,"name":"Raffle_token: Exle (ErgoLend) P2P Microfinance to Kenya Endeavor ","description":"Raffle_token: Exle (ErgoLend) P2P Microfinance to Kenya Endeavor ","type":"EIP-004","decimals":0},{"id":"4553dbc189a4de1db152147838019cd10218ccb4969a446e57ad60f4231c23fc","boxId":"522617786616603812631c2466f7bd89d3b6a998679121c67f4a6f10fb2313f0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 147540.9836, \"stakeTime\": \"2022-07-07 05:28:03.228000\"}","type":"EIP-004","decimals":0},{"id":"e35c2668b11ddf4ede2341aa987ec70871862ae83dba806b7e7a201a59a9ff18","boxId":"2e38a5abdae088459f9ac4c3a58081a08b306e349be51b4bc3ae1ab63f49df1f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 177650.9572, \"stakeTime\": \"2022-07-07 05:07:35.217000\"}","type":"EIP-004","decimals":0},{"id":"22f3326f54bc1d3488b2bfb68194e3e2ddd28ce2d9a8f1223f63536c52f08a7e","boxId":"64f012fb98a5555391fd42a321b5844a8d894b271f4c3f19a33c6118275633f9","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 32105.866100000003, \"stakeTime\": \"2022-07-07 04:59:28.021000\"}","type":"EIP-004","decimals":0},{"id":"0b71853e4eb52ab66abf6b918e9664813e8a513a8fa352a9fef59056470848ae","boxId":"fec5bf17219f23e6b16b1361c0e9f116af187e4834d1af83341117612ffb3086","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 15375.0125, \"stakeTime\": \"2022-07-07 04:51:24.883000\"}","type":"EIP-004","decimals":0},{"id":"61f97a88efc235f0678d11b5d44b69a198d1b6518e84164247ecb86949a21f8f","boxId":"5b30d5665c21b330efe1e25978938f26249e9d637819acb1d71bb5a71305295b","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 16.0, \"stakeTime\": \"2022-07-07 04:32:07.963734\"}","type":"EIP-004","decimals":0},{"id":"11aaa8e151bf40f3abfb294cda7df63c2bddbc2a5b5102adbde05546a316266e","boxId":"4a0c74fb6cdad0f84d0044b6ccb0d817a26718f5d44cc3eb468e1d85152b34dd","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 5027.0, \"stakeTime\": \"2022-07-07 04:30:22.806000\"}","type":"EIP-004","decimals":0},{"id":"b95260aad423d40767607bac2e45e1c1b5fc77265a5f57fc896b1fc6c266ea61","boxId":"08223804542a215d926222d1faf3240586213ffe194ab3de8898191e072d42be","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 147477.9822, \"stakeTime\": \"2022-07-07 04:25:11.676000\"}","type":"EIP-004","decimals":0},{"id":"984dc7d9e68a915a923aa175b5dacb5c6454baef52e60febdb81d67b0507c47f","boxId":"fffcbb9cfb4ff16739544ea28b965f695620405969093381ac5d96a16516ee68","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 8000.807400000001, \"stakeTime\": \"2022-07-07 04:22:38.435000\"}","type":"EIP-004","decimals":0},{"id":"fdfac7b0645e700aeb3919907e143cae81b96b2bb589437161ab65c2627edf1a","boxId":"7389324f04120e07a2f27598aa9ea69c2d94053d0fe88887299c9893daedad39","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 83269.4339, \"stakeTime\": \"2022-07-07 04:21:15.421000\"}","type":"EIP-004","decimals":0},{"id":"e5dcfcdfbd94432159d42c6cba8e1ef410a0e964e9643630b9b84b2d1e6f27f6","boxId":"4699339e422090f6a9f85ea8b417258c04b626a15f7ba8e78c1b38e809c89b4e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 30701.6505, \"stakeTime\": \"2022-07-07 03:53:25.794000\"}","type":"EIP-004","decimals":0},{"id":"833f7e90c8c5145faf2ae30580574a0d410aa90abd9175bcfb29cebe0d26a46e","boxId":"3df554b8c0217c6225c5bbcb0883641682b46e958325aee2fcf2d13ad4dad8a0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1092116.8517, \"stakeTime\": \"2022-07-07 03:49:47.626000\"}","type":"EIP-004","decimals":0},{"id":"2100da866f96c93f359cda28ebaaae0a7d132dc48c085e6f516ba15c152ea9b3","boxId":"42df44ed098f2607decce90dfe3245890358e89a784c11d14fe5c1f5489f4ffc","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 100473.10160000001, \"stakeTime\": \"2022-07-07 03:22:23.086000\"}","type":"EIP-004","decimals":0},{"id":"ab15fd469074459b20858bdb97f5da28c5992d81b45bf53a16487520f8ae7c8a","boxId":"c17c600eb1c3ef24cbcc7437ea89aa8139c890445a48ef40a76c204fc9adcc5a","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 363906.9851, \"stakeTime\": \"2022-07-07 03:19:20.051000\"}","type":"EIP-004","decimals":0},{"id":"589d00a63a3805c01b9b8c4276e3451f91fe8120cbf731e442be62a59cf2c0a3","boxId":"aaee4fef35e3716d464ef4ee61dee9d89b19ae0608073f77b20618171f4ed609","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 7010.8577000000005, \"stakeTime\": \"2022-07-07 03:15:54.122000\"}","type":"EIP-004","decimals":0},{"id":"4eba364de303ed9537167cb638d50819e4dd7d9a105e818f0e4dba4cd195af51","boxId":"ce01be5fa3e582ccb633eae61b69ea0c3f5f69b5b68c8acc8f3a8b4e68e28a6e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 50516.4836, \"stakeTime\": \"2022-07-07 03:09:06.244000\"}","type":"EIP-004","decimals":0},{"id":"121c5a7ce49d1b716f040388796b20a46dda060ef4fd4329b96c782f5aaefaab","boxId":"765130708fdb7e4cc4ac67109409671a5be87fba699bea6bec87921df7c1c482","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 307448.2512, \"stakeTime\": \"2022-07-07 03:07:58.806000\"}","type":"EIP-004","decimals":0},{"id":"fc583f76283ef3b7511ebf87a5c0427668383d913ab541a5f38270715b4692b3","boxId":"6b74cbebc5870cc9ea94ac6d25cb70e0bfacdf4734b37cf77a98f0ee41a56216","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 188492.92940000002, \"stakeTime\": \"2022-07-07 03:08:12.801000\"}","type":"EIP-004","decimals":0},{"id":"e24da393e394b380221f1fd974bb7f6439ad109c998fd16e4ccd383b87e581bf","boxId":"1521ede3044536fc4c1e935dfa9e807e792648ff3eea43868cc13ffcf63846c6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 41054.567500000005, \"stakeTime\": \"2022-07-07 03:00:08.666000\"}","type":"EIP-004","decimals":0},{"id":"53f3383504e11a40402405ccf1f906e153ce5d40d6e7d97f3328ed0e68abb732","boxId":"adf6973162574ce7504b9c705826f4784ea995112fe76748f7646708ab028ee1","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 13736.0, \"stakeTime\": \"2022-07-07 02:54:19.995000\"}","type":"EIP-004","decimals":0},{"id":"eca5bd99796439c9f5a71feb4673567e1ac925e15c03a6769e6a4db56c260316","boxId":"aedd3f287522b52fe0876c8d36bb9aa268bbb0c3a328c47b07b48b62f56b30fb","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 117921.6668, \"stakeTime\": \"2022-07-07 02:25:13.992000\"}","type":"EIP-004","decimals":0},{"id":"c2c203a34438e3c6c3debcc269fefb64b964f9652b472ea7bad4f44ec19aace3","boxId":"9ac8607f5ede99dbf7775c2e0ef01e82358e4471a582acb23eb4437692261541","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10033.9892, \"stakeTime\": \"2022-07-07 02:25:24.953000\"}","type":"EIP-004","decimals":0},{"id":"fa350ea33a32216ddceb1c5feed8478b055e6b0748ece9561b77c77cdd671e82","boxId":"b6b72ec41c46d8aa535d2915319175925c07b0807ef0cc6227ec7aab7d47e46c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 199000.94, \"stakeTime\": \"2022-07-07 02:18:06.461789\"}","type":"EIP-004","decimals":0},{"id":"b0f92565fa90bb221b17d3d7adea6c5666045076971d3f709cee8504f462566e","boxId":"0e96d6636cadb6c9ae6bfe1884ab2ced0f073915aa65e1f40f006238510a24c7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 282170.1145, \"stakeTime\": \"2022-07-07 02:12:57.243000\"}","type":"EIP-004","decimals":0},{"id":"f383439eb1464b9da1f9cdf00ea7501a16a1695c622ac88b49f53eeb3806f828","boxId":"9427f20b67384be30c23a33075c0d9f34f18ed4d1d844364285dad016d010fa5","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 110098.8784, \"stakeTime\": \"2022-07-07 01:56:39.644000\"}","type":"EIP-004","decimals":0},{"id":"5c736a6fe99094cb9b2a18a60d111b2c7187858c4241e26fafd85d76c123d3fb","boxId":"732923160042557ca8301658c3c19c3838eb46943bc7028d545da6f76d314b62","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 4098.3607, \"stakeTime\": \"2022-07-07 01:48:42.660000\"}","type":"EIP-004","decimals":0},{"id":"ea032675c0c7be2c972cd37156bedafd947929cea75f8deade0111d61880fa5c","boxId":"a0453730dd4b90b5525eb3e134639734a4c0739139cbe3b7cac286797c31a419","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 151317.3714, \"stakeTime\": \"2022-07-07 01:44:44.881000\"}","type":"EIP-004","decimals":0},{"id":"4adaba2b404048e844458107f2f345d524482a94ac4f1d48867ece79daf2bdae","boxId":"5806d2cb6ce84e25841969500807e821accd0e4960ca61e4bf7a600d08be6125","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 131000.0, \"stakeTime\": \"2022-07-07 01:26:13.352000\"}","type":"EIP-004","decimals":0},{"id":"b35ec0a0317da8d9292d05ddef4f0c11b13bbdd55070d3c8ca81dbb1185442dd","boxId":"792999d5afdbcb9bca95c9addfd21b63fd34beb9a90af73983bd92f6fe285784","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 26209.0073, \"stakeTime\": \"2022-07-07 01:22:31.447000\"}","type":"EIP-004","decimals":0},{"id":"5b822647e18edd18d870015a01a3441e5a3846cd813000531c6cfa75658a51ef","boxId":"6a70ccda35e0f077fb5aaaf8a9e46f87078de3eab7c41412d35c89f313536585","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 527623.1824, \"stakeTime\": \"2022-07-07 01:20:30.454000\"}","type":"EIP-004","decimals":0},{"id":"0e7f44c0733ed474bb1609ceee1696067ec1cae9cd4d3f26398d40d7ca60f0e5","boxId":"b9a4e1bc1731e236568921452434a15c172486d2ac05e47eec31b2eb51c200f6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 183561.58990000002, \"stakeTime\": \"2022-07-07 00:53:49.471000\"}","type":"EIP-004","decimals":0},{"id":"886506f73639c6fa17908976c1a3f1395215676b1ecdf20c5ee7078212d8c484","boxId":"dee20776e9c364ba54bf3fb02f2f069496b31a53d383834108470680fffe7b57","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 7513.6612000000005, \"stakeTime\": \"2022-07-07 00:42:28.866000\"}","type":"EIP-004","decimals":0},{"id":"cd736f0464bad8dba5e8a4320fdfb3b32f2611a45b9dfd526371e87aa73b6d8d","boxId":"636a606db3cec5ec6d82727e53365d746b71f3abd6635246277d040f4c45d146","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 733240.4371, \"stakeTime\": \"2022-07-07 00:36:31.793000\"}","type":"EIP-004","decimals":0},{"id":"ad5f0377cb796a3581d30c366254a8297c981b7a26df4854c3ed31a799cbdbe3","boxId":"32f1bfcf86e6221f79f24f175a9d3e7a6fc5b4c61f029a5096e52e04328c6d02","emissionAmount":1,"name":"Women","description":"xtra.digital.art@gmail.com\nhttps://twitter.com/XtraDigitalArt\nhttps://www.skyharbor.io/collection/xtradigitalart","type":"EIP-004","decimals":0},{"id":"f3fc4527def11fc1836cbcf560572a5a97bca2983b5ee7eff7ebb22cfb9d841f","boxId":"c30677766e3e75fb834ef030b009462c7ac21ed7bbdf64a017143a0743b6d449","emissionAmount":1,"name":"Bubble Heads #21 EPIC Finn","description":"EPIC 5/40 - Bubble Heads is a collection of animated NFT's that have different types of rarity. https://twitter.com/bubbleheadergo - The holder of this NFT during the snapshot will be entitled to the respective physical artwork for free (excluding shipping costs).","type":"EIP-004","decimals":0},{"id":"27723a4f9386fc0decf731e15515bdd4e4da8111d629379555c0cb6f5360b9ce","boxId":"26969c4d4b6517c6b34a71778fad8b863107354a723c646e1877350a11c9d425","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 10828.0236, \"stakeTime\": \"2022-07-06 23:41:47.093000\"}","type":"EIP-004","decimals":0},{"id":"c7d3921c36272cb0bfe40cc5acdff25f402fe47088800ed7010f9de4b86603e9","boxId":"80c7bff92cce3044f497fdcc297dd6fa6025517187af422e7bfea8f7123db0a6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 12381.8611, \"stakeTime\": \"2022-07-06 23:40:54.543000\"}","type":"EIP-004","decimals":0},{"id":"a22779cdc8d029008f88ab4f9caf0c200737e3269c7070edafbfc3ec26863a0e","boxId":"b2d25abdbebf48f61bed7d57d8ad0d892000eebb2fdd388b87483957ede55ccb","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 27459.016300000003, \"stakeTime\": \"2022-07-06 23:37:24.486000\"}","type":"EIP-004","decimals":0},{"id":"66b78effdd7e4ead1cacf316f0001eef1f14fe2df238131a1dfcb2f973a5247c","boxId":"eb724f200a1f6ede512f2a2ee49ecdce77a23c6018b1a69f6ddf0531ae49c9d7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 65274.2318, \"stakeTime\": \"2022-07-06 23:34:34.804000\"}","type":"EIP-004","decimals":0},{"id":"fd34b1099bf5b91be49010bc0e9f436b4e7cbedb32638164cef204f045672ceb","boxId":"cfb852bcac56e60241611c491ecff004ca64ecddda21ae539a07254d74426d04","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 49450.5495, \"stakeTime\": \"2022-07-06 23:21:16.667000\"}","type":"EIP-004","decimals":0},{"id":"9b353ef98c32cae07baa374de40a5144008636f4a4447a6b29a1a3be0f820217","boxId":"19bf6d19b5f872c080090e0dac741c22fa79caebf4fef74296a57367623ec19f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 131342.59110000002, \"stakeTime\": \"2022-07-06 23:10:57.401000\"}","type":"EIP-004","decimals":0},{"id":"98fe4d6d277b89e8b74aacde66e2035e66758aa14143340df6d6b7a3b627ab22","boxId":"424afd1f05b62a50a60d2b2f26a470fc918b979db2c0a0d2effba789d6a22b82","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 83942.1265, \"stakeTime\": \"2022-07-06 23:02:59.523000\"}","type":"EIP-004","decimals":0},{"id":"4334da2e847489cbecd184e24b82e4d5404509b0e2c76bfb865356645edcc7a6","boxId":"f9e1efcfb2c0fea8ce575f03c95015fe19cf8afdd0d66ef793e80146d3b2e7b8","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 43024.5648, \"stakeTime\": \"2022-07-06 23:00:40.844000\"}","type":"EIP-004","decimals":0},{"id":"74a781b39b41780d1bca1cc4914160be2c6fc093a8d202440789bc9b793423fa","boxId":"4f214519333b32d922159b5799426a5cfcfbf4bac07c9b7d8203efbac33e1c7f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 149045.56720000002, \"stakeTime\": \"2022-07-06 22:47:21.783000\"}","type":"EIP-004","decimals":0},{"id":"4848915038d7fb1d699d1e7282ba4ece9a651d8ba77df7e22b40ab6604d74113","boxId":"94875cc09927443772bce292e61ef97bd35359ccb1e51da6ae449e214de11d47","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 288927.1475, \"stakeTime\": \"2022-07-06 22:45:31.965000\"}","type":"EIP-004","decimals":0},{"id":"83cd0125d45bfe4a7529e131a59480dc03756c8586e7d15541241a6c395c8503","boxId":"e7a7b64195357bb8b63a2f3438c93a561b8bfdfb1ee9eb81a6f7f3c9e96838ae","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 352408.0, \"stakeTime\": \"2022-07-06 22:42:41.641000\"}","type":"EIP-004","decimals":0},{"id":"84733be21236dcc9232d01027e44512b54c781ab0f196301bf142e85dbe5e9a9","boxId":"0db49026d8a5574e712980eff05ca12d07ccbbc5e2d62825ccbba75dcd78f2ad","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 18103.825100000002, \"stakeTime\": \"2022-07-06 22:34:05.699000\"}","type":"EIP-004","decimals":0},{"id":"df5160647213a229e0e59700ea9aebb359330e129a477e96b17882a7b1160be4","boxId":"006d86515b0e188235a06f2fc212ca818a561a0683a03b995ee2de9833733cf2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 54830.542400000006, \"stakeTime\": \"2022-07-06 22:32:37.703000\"}","type":"EIP-004","decimals":0},{"id":"2abb6e79f60f520c69e49f2b357b08600bfe430fe8f7ab536214dd04ea4f4b61","boxId":"f798800090d3bba43a6e02363891dd4e5564f09c855e4eb1947d7ccb39d7798c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 361677.2726, \"stakeTime\": \"2022-07-06 22:28:10.601000\"}","type":"EIP-004","decimals":0},{"id":"21af09dec8282ac9369b3d30a8bb46eef34b63f29e3a4999f0b80cb844599075","boxId":"fb4c45863d47e9e0546a46fc1c199d26d6f9e1e22bfde34662216b646520b7ee","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 19359.5579, \"stakeTime\": \"2022-07-06 22:24:31.653000\"}","type":"EIP-004","decimals":0},{"id":"c96ea88e0ed5d1ad8b70ff91b790f11a5ad14b86ff63bcfddf48adb4fd1f1647","boxId":"33c7b43791123d6fa12ed7e10a29e56404f4f04ca1b043aebfb7144bd913cfbe","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 297827.935, \"stakeTime\": \"2022-07-06 22:18:46.439000\"}","type":"EIP-004","decimals":0},{"id":"9fc01079992b2f6dac59b082b71292519f71679650effd5b1b91ddd25856bbbc","boxId":"377b075ac5a0192c2bf610d426adc2c91249a3986e24e1e38430f033bbdc759d","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 590268.9382, \"stakeTime\": \"2022-07-06 22:00:13.358000\"}","type":"EIP-004","decimals":0},{"id":"6276c7c161711f643498e18c3963e1fd27566ab0d9fdd2dd5a99c96c5f10ca10","boxId":"71faa53413b3a1666701bb2ff7e7eca2f26d2206a5c2916f41d1895803af0900","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 35250.7283, \"stakeTime\": \"2022-07-06 22:00:07.373000\"}","type":"EIP-004","decimals":0},{"id":"cf66a78555dd97eabdd976636edcb46020db1213dff288ab21482aa07bfa8ac5","boxId":"349e53391ab29c50458d777715bd88c8b7556906e668f8b831848c5aa4366d85","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2006.7978, \"stakeTime\": \"2022-07-06 21:59:41.415000\"}","type":"EIP-004","decimals":0},{"id":"3f042202bf07e4d11ad460fd82b19a4e662c04c5958ee80fb6665dca3e88df3f","boxId":"88961ee3d4063f49455d4cf00610e7882fb5bdf37921b7fe0c2dc6a99bd0df84","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 61741.758200000004, \"stakeTime\": \"2022-07-06 21:57:17.845000\"}","type":"EIP-004","decimals":0},{"id":"11d789a333bfe6d727cb4247c25b8cfba84cda045162c57ca1b003ad58e5ab9d","boxId":"9b076e3d5337fa0622f145de8c6f0f7459ce34266cb747a6b5e3ac510e6a0e3b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1497.0805, \"stakeTime\": \"2022-07-06 21:51:09.258000\"}","type":"EIP-004","decimals":0},{"id":"9e225c5763c2d87db834606eb8a7ca790900a6c1da42ed731b49fff1c6e177ae","boxId":"fc610a382f11872e03b832f8008eae3783ae956bf2a6290e8402b341c8a4bb5e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1008144.2584, \"stakeTime\": \"2022-07-06 21:53:33.743000\"}","type":"EIP-004","decimals":0},{"id":"52c6efe33141576a0b7eb9f0b0942c3bb346a1765a04b2b079fd9cf8f8bac2db","boxId":"909429737f578556f9131576ba7c2a13a2f4feeaffc4473c4a318112ecf1ed8e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 4251.0, \"stakeTime\": \"2022-07-06 21:50:13.486000\"}","type":"EIP-004","decimals":0},{"id":"01d40821b387fff69d753d5a46ae8fb7070ed2dd718dd15d9c90e540dba2bdc2","boxId":"3c115088e16690c37aa1188381a8770ee4c6ecafed20a1bc6f303b120187a912","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 165353.7849, \"stakeTime\": \"2022-07-06 21:39:44.958000\"}","type":"EIP-004","decimals":0},{"id":"d18107aeb76bb76fa4cabe3a9915764c107276bede3b86d12f697585bbbab751","boxId":"3cd4fc692db907ea17ce346273602103e252b8b80abdafc48825c100ae40cb6e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 42145.985400000005, \"stakeTime\": \"2022-07-06 21:39:10.019000\"}","type":"EIP-004","decimals":0},{"id":"e4064b5be5541b1c8f85b82f4e1746e4fb56add1afbc6a57dd8c8fb3afad0f5f","boxId":"e2a28e27742f43a1bfa32bb52c18c09835821a6f8828cfd73f6614efa1d74fb0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10655.7377, \"stakeTime\": \"2022-07-06 21:38:07.852000\"}","type":"EIP-004","decimals":0},{"id":"790b5b9185374f8e229e7124f625cf9f113f60a9bc3aa840357fc03d126f337d","boxId":"dad10baa65e3416c9dedcd69c9886c7005c10129525787bced98ef0af709a248","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 14233.5766, \"stakeTime\": \"2022-07-06 21:37:52.765000\"}","type":"EIP-004","decimals":0},{"id":"c71c8c9e0f52efb56d44d8de55bf30042a415a349f2dbd992a7eae6151acebd8","boxId":"593f4873275eeb8958b9c1cec1580aa03a738054c45751acbacc4f6688d1feda","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 297081.9672, \"stakeTime\": \"2022-07-06 21:27:07.160000\"}","type":"EIP-004","decimals":0},{"id":"9506dece3e90df28232bb18db2fc8ebeb2cc294a6428ecd20ee6d8dafffb78cb","boxId":"285bab712bf7157c14bbe290e50cd5e06145ea981f9152043095b883dbf736a7","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 20200.0, \"stakeTime\": \"2022-07-06 21:27:31.449745\"}","type":"EIP-004","decimals":0},{"id":"506c7ebef1096e65dcb02000578706af01acdc28b41d624466ea057463559a63","boxId":"2b93408589a2be19e5e0d22aad5d41c27a0fc3dbfa17462356c66d8a926f5f9f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 357505.52890000003, \"stakeTime\": \"2022-07-06 21:20:49.120000\"}","type":"EIP-004","decimals":0},{"id":"cd19202aa0a3d61527e8123559844ce145af070e742a6e142b1cbda442d3f6cf","boxId":"46bb71680ff43985a7db42e42d7f767267ca4c428c8141af0d9b43ee0fd46547","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 14712.1437, \"stakeTime\": \"2022-07-06 21:18:16.056000\"}","type":"EIP-004","decimals":0},{"id":"7f4932c8cd83784db5729c2d1ce2ea8b50509a407106c2eb463b591fa0234b43","boxId":"fa279990fa53be56bdb591fb01a17f57cc07ccf8595f9f095dfa8bd643116a6b","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 100000.0, \"stakeTime\": \"2022-07-06 21:09:26.971000\"}","type":"EIP-004","decimals":0},{"id":"d4f0c0fe4921c53691e40f037c17c6ead9e80acf22a2678b6ba2bf0d8a0c76a2","boxId":"fc674ea6f02a7e71542d69d6ddb6617e62accb15bb079462f7b6094d05d245c7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 276072.4839, \"stakeTime\": \"2022-07-06 21:04:25.873000\"}","type":"EIP-004","decimals":0},{"id":"464ff3038be8c13115468688db305525da4c5ce6cb9073fbabf776d97d240ad8","boxId":"81c81dd366b5bcd9b8b2b966c963cb94ee554ff84ac47420f0be27db71b51354","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 114080.0604, \"stakeTime\": \"2022-07-06 21:04:02.359000\"}","type":"EIP-004","decimals":0},{"id":"b9f953e479b0a67cbbdd4c63eb9eeebfbe7da495b7344dd15156c22f9300edc5","boxId":"24b91e485df8993db7c927371af2a68cec7858ebc58bc511e30de0c2e7ef7058","emissionAmount":1,"name":"Lazy Snail #5","description":"","type":"EIP-004","decimals":0},{"id":"baa606d89570ae49a631ff80738aecdd49763d445e717036e7235895f8e34613","boxId":"501ae312e450d7b5d86315312bbd5918a1f8874b4262a43d756ed6986a377f38","emissionAmount":1,"name":"Lazy Snail #4","description":"","type":"EIP-004","decimals":0},{"id":"29edf2ffd887618b866a4ba5418787baa866b3a634f0b3556782940cacb493f3","boxId":"6a6590e950500b8afc151ad226afaa02fddb5a84f44da852fc1e784765fd943e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 9091.1458, \"stakeTime\": \"2022-07-06 20:06:18.944000\"}","type":"EIP-004","decimals":0},{"id":"a1004879540634026ebc7ac3971af920bf9cc53f687a0e24fe2f7737f3fed839","boxId":"cb9e655a1073ab54d3a0831500d3e66a536b5e99770d56d9cba9527f2996e5a3","emissionAmount":1,"name":"Lazy Snail #3","description":"","type":"EIP-004","decimals":0},{"id":"2c535739c97b5a3229c50283ff0ef01fb9a6d4b7e7d45bf857c42fe16ece54db","boxId":"f567ae803a4b976052d9b6994867f6cd7f32bdfa3b4fffbce0af0f3f38d24708","emissionAmount":1,"name":"Lazy Snail #2","description":"","type":"EIP-004","decimals":0},{"id":"d369805e1832d1448cc7be9926f137fd38b2f5834c1870e67a407ee5f8b6d628","boxId":"57171b2b27959eb8b4cacb1f340c5a3492d20c1efd54796613364ce0840ccacc","emissionAmount":1,"name":"Lazy Snail #1","description":"Collection of Lazy Snails.\n\nLazy Snail #1 Snoop Dog inspired ","type":"EIP-004","decimals":0},{"id":"e053a4dbc8f7d99f7520225e874679788c5d474b61df667b5ff962dbbb742d68","boxId":"0813cb7dab67f4a57919ac87476f5ccddf61c805c828a6759dade5d5e2d2c570","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 251638.7451, \"stakeTime\": \"2022-07-06 19:03:21.730000\"}","type":"EIP-004","decimals":0},{"id":"d3b1de25086ee93b1ba8e60115b3c2bbd4fbcbafc14a273c6a4a1b08fcd4b423","boxId":"c4e10d33112566c4f160d7d0fe135a4e3ff0053c3b4c0cfddc694cfe5f5d1ab7","emissionAmount":1,"name":"Hash Glyph #0031","description":"Hash Glyph #0031. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"17619a748964ae74b72f23d450d8cff4023543e3c6a33a90dceb8a9088eb56ff","boxId":"7681c741f83cb6aa9f02444731d8da70ebefb1d98ece46ffea61bb59d8d84f92","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 37169.2681, \"stakeTime\": \"2022-07-06 18:54:40.930000\"}","type":"EIP-004","decimals":0},{"id":"6ce400a7c831e1b6bc2cf52a2d0ad6a615d1595069bd95bff0f0efb2953cac10","boxId":"5b834f01bb1302db94b97d06e4c0673a5b89892b046c79f7271a730ab583fef2","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 29771.1768, \"stakeTime\": \"2022-07-06 18:57:41.037000\"}","type":"EIP-004","decimals":0},{"id":"b67ea8c379a80773ef2cddc13f951889e74c4ef29ea132333fb36f31d597feb0","boxId":"fd04a20021b56a9e5825c69d89fb3477d91edcfd3f2cce31e59579dcea71fe68","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 69672.1312, \"stakeTime\": \"2022-07-06 18:56:41.361000\"}","type":"EIP-004","decimals":0},{"id":"0d9a8548fbc11756e2b7f01ce53f5dfcb50346889400644639d1ccd23d078b24","boxId":"fca4068404c23602cd750ef387a972e13c97fddc53d50b0fd9f756fcf7e7bddf","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 54720.2724, \"stakeTime\": \"2022-07-06 18:50:04.303000\"}","type":"EIP-004","decimals":0},{"id":"bf8bfee75184430b40d800977b584b80367359d9a1e72bf2a1a48c4f540d8f87","boxId":"ffd45f41c9d7dc54d8bde5b480363eefd035803039d5bc370555377eb3395f0f","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 8930.76, \"stakeTime\": \"2022-07-06 18:52:55.646767\"}","type":"EIP-004","decimals":0},{"id":"776ad6cce799f1dd7a7a5bd0881bb22475dbec983eb70eaba9d0d4d4f93f9769","boxId":"dd42ff26fb802c5605c0a18174059c9a5e2f359f3de29cab26bdfe5a2b7cf3bc","emissionAmount":1,"name":"Hash Glyph #0030","description":"Hash Glyph #0030. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"10b0c537454226d1fcde6a78e93baedac7925ba2fb110b37bc1df572bc73bb1f","boxId":"c6013317334b5bd86e373af3eda1b3488bc2086827f3737c5a3d19cfa4a4fa40","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 27000.0, \"stakeTime\": \"2022-07-06 18:44:52.914000\"}","type":"EIP-004","decimals":0},{"id":"b247c3792b6d8983c1fa666e53e6ce762035472e95f36e9990e73a466cc64408","boxId":"92dbae8b5be502f4e72e2d1c3621081f1a1c943a8a6b51cf6b2d3e5bd18eef3f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 101351.51580000001, \"stakeTime\": \"2022-07-06 18:33:59.097000\"}","type":"EIP-004","decimals":0},{"id":"f6921f2ac9a7e14ac3dbf7d07cd35b4a121e9c1c077cb839f5673e702ee8cee1","boxId":"168cd66602e33f1b7a63da06bdc922f46ead7386c9674dac9cbb5d32d9171b8e","emissionAmount":1,"name":"Hash Glyph #0029","description":"Hash Glyph #0029. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"be6d3729d55dd9181fc9421bf9aa82feac96ad39dc667a0102aac1a35049b2aa","boxId":"c30ac855b7c359792686b18d11d9a592cf72598449deea372057e690fe806951","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 22553.4065, \"stakeTime\": \"2022-07-06 18:39:20.832000\"}","type":"EIP-004","decimals":0},{"id":"cce64f401d8ab7e0bae57eb1faf0210318a2694d3ec8963ccd2878aade8440f4","boxId":"b826fa8478defafa7523f1ca1895c6bd0ff4c644f4213407f7d617c8cd7037f3","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 101574.55380000001, \"stakeTime\": \"2022-07-06 18:35:18.198000\"}","type":"EIP-004","decimals":0},{"id":"23b5c150ef8bb808abe094a76759398b9a1fa3a19976b6fbd65c330334092891","boxId":"375699ccee52570535bbe4885e212fa85d80d731922463e1f7acd03ca3e1e8c6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 5994.3485, \"stakeTime\": \"2022-07-06 18:30:59.797000\"}","type":"EIP-004","decimals":0},{"id":"73896431f784b21bbe9bba2951a3bf2153b8376f4ab8664af16b826ad1858763","boxId":"2513a2806d31b36c7f057006ac9fb59dd9114f6c2c411372a1df32177efa222f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 122853.84700000001, \"stakeTime\": \"2022-07-06 18:35:10.568000\"}","type":"EIP-004","decimals":0},{"id":"088074ab4cb6334f863d8c05fc0b7f30cb288a87efb52c7a0a8e0aa87dda1c89","boxId":"d4a278c6f50efa0dad6a9eac81b581f1a98009d85ffa40f466681b77ff3c7b98","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 101521.6213, \"stakeTime\": \"2022-07-06 18:31:36.144000\"}","type":"EIP-004","decimals":0},{"id":"855f827bb303fdefa719288cb88fd8dbc42b9bcb0176516ea67bc24b3fc0f4b9","boxId":"bdd21fe3d5d0828b155b21e8e201d4ff07be1f1c6d863b4e53abf995c8a06e4e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 271230.0943, \"stakeTime\": \"2022-07-06 18:31:21.869000\"}","type":"EIP-004","decimals":0},{"id":"7ef2e57fae14545f8794f924a61325b8246b25068f4c9aa3c704d5e9d2bca519","boxId":"19435901a59d36bfa564b3bbeafdf06ad9b5d5abc5fa9dd357307fb358e65ae0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 4000.0, \"stakeTime\": \"2022-07-06 18:28:05.356000\"}","type":"EIP-004","decimals":0},{"id":"1bbf25841596394a77629b6c8a2eed58ce21787fee56723de3430136392497ff","boxId":"2a754dceb2b8b75b22528697d7f7001b1638ba2554887d04a3ee2ec2977945ea","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 92421.47260000001, \"stakeTime\": \"2022-07-06 18:25:46.786000\"}","type":"EIP-004","decimals":0},{"id":"467a935f03453158b95cb2bf3ed64b789ebc4153d46bb83606102c44bb61fc1d","boxId":"2a947c36f3a4ddb3bab3987699a748026d37f86dccde6aaed053b0328e3bc16e","emissionAmount":1,"name":"Hash Glyph #0028","description":"Hash Glyph #0028. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"8e3574b926047dcd4c798082792a62c71e9c0851f9f3b8c79f3d144c4c8dc5d6","boxId":"2b89be79cc721fc45f17354757b154fc5931723f1eccef67d3f72a8060d7f6dc","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1003.3989, \"stakeTime\": \"2022-07-06 18:23:15.952000\"}","type":"EIP-004","decimals":0},{"id":"e1ed3fed550bf900199fa77f1ba50d9667acb52fe07588d3ddfaebf08d22cab2","boxId":"966c7a207d6b62499248d4950b9a895c6f7286b6e20860ebe36c36060cf0d28c","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2050.7097, \"stakeTime\": \"2022-07-06 18:23:17.880000\"}","type":"EIP-004","decimals":0},{"id":"bd9daf8d9d0ba1c75f86e7c32c35d3f6aa7f7e486454c8a684cbde9bf9f29587","boxId":"22be3906b3c64f141c936cb4a3b7852b90fdf262188e964ff5cbc461215fa2f6","emissionAmount":1,"name":"Hash Glyph #0027","description":"Hash Glyph #0027. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"5583cb2d554c19b7d195c4e965f281653eca46425bfdb88c1a330836c81abbba","boxId":"4bddc293c03c0a04b78dfb61f3ae4346a80c402912467bc57b7ecb8185568ab5","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 250840.4406, \"stakeTime\": \"2022-07-06 18:18:16.184000\"}","type":"EIP-004","decimals":0},{"id":"4a06b2e2591ce09584a27d0d885b2b47000498fb0cd6687c54d8024a2a713d2b","boxId":"1c2d9dba1fe9a2e3ab9495ba987c477415bd100f9c0df99a30e48ab9aee77ef3","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1000.0, \"stakeTime\": \"2022-07-06 18:19:20.664000\"}","type":"EIP-004","decimals":0},{"id":"0014a0e09be4fbbdda8fce4f965c3ae1438b7beb8c9a547f1d41556aa877f8f0","boxId":"e5ada688a94b4a4f43608b7e564495f514cb26998a259b8ce8c7e3c5b2a8e647","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 695045.3964000001, \"stakeTime\": \"2022-07-06 18:18:22.573000\"}","type":"EIP-004","decimals":0},{"id":"9b8497eaf8609a0a9c6163deddeb295cec3cc2ed3790d4e02b3f5e8ab4f24389","boxId":"13844eaa402a458ab6f11510ec663ca28825a8778c1ec7dfb2180b156434baa0","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1002995.7575000001, \"stakeTime\": \"2022-07-06 18:10:59.871000\"}","type":"EIP-004","decimals":0},{"id":"707a22836f052f02253df8fdc4dba7719fead19ed6c92f983bdcca73195b2fe2","boxId":"73d3230306fa5996adeae949da55bcc66853b98ceaf3f676f6cfd3d8435f287f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2130.0287000000003, \"stakeTime\": \"2022-07-06 18:06:10.240000\"}","type":"EIP-004","decimals":0},{"id":"2f974c4c72a4ea3dcc6f50df35840c158a3f354f26e7030ad242fb9b0fbd1027","boxId":"3acfd360c247e94461eb68f5b8a84b7ebc0efcebc06af798943ef353e23a9441","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 90163.9344, \"stakeTime\": \"2022-07-06 18:05:07.336000\"}","type":"EIP-004","decimals":0},{"id":"acb73c88a64f4f4ef5fbb7b1a1b2f375cfce5c7673a4f265aa41f90c69b96b20","boxId":"cf97ca9eb8bf2ffd0e69ad634459c2af7a6ccbdfa6c69be87021452f3b0a84ad","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 207953.752, \"stakeTime\": \"2022-07-06 17:57:55.128000\"}","type":"EIP-004","decimals":0},{"id":"a56658e6f4794a7915265db0a526ca1ceea7737da286fe78a97bdcfe3bf6204c","boxId":"ed424e1bfc301d13556e9f9effc418bfe5a33e14485ece3a612ec0e7befdc426","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 246670.78300000002, \"stakeTime\": \"2022-07-06 17:58:14.757000\"}","type":"EIP-004","decimals":0},{"id":"62bfb8a99f8c4f7b3c5f0cf27474509a66c7ee17d4e912794feff1e07f60ea89","boxId":"f3956ffb422547253b43ea15a2c79a081fe382582d0e45b83e618bdf47161de6","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 339433.6047, \"stakeTime\": \"2022-07-06 17:55:59.895000\"}","type":"EIP-004","decimals":0},{"id":"6208fda2385712a3e11ed64ed66da7f928b98f6c3c4943b4c5fdfdc909fc2bec","boxId":"ee18b88a446468c5d9ea70cd699430ae0ab400345d2cfffe35b1be788a438cf7","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 10371.8397, \"stakeTime\": \"2022-07-06 17:50:02.403000\"}","type":"EIP-004","decimals":0},{"id":"8cdbd2fa2b2c8b6aa5f20e637dbab6dbed57f5bc0221895191f479d09319be02","boxId":"4ca58a554fb859570cfa77f20a8d34862a3c7bd0499b90e480ceca93dea8c618","emissionAmount":1,"name":"Hash Glyph #0026","description":"Hash Glyph #0026. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"11d29662c01d0dcdb7ede214bc39a1021dd7cb1fc88dca23f5b4cd43a2f9f226","boxId":"47984d4b9b85e4765844878703da1c543583d017530c257d535dd831761c0f16","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2000.0, \"stakeTime\": \"2022-07-06 17:39:12.590000\"}","type":"EIP-004","decimals":0},{"id":"8379bc56fb5a7de6e6095de7e227f225eafeb9074336ba2cf673785b3606a154","boxId":"55dbf923c0652f5db2b185a94d60ceb77bfbaaac09632afc40dd5cd5d2a8ff03","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 1854.9676000000002, \"stakeTime\": \"2022-07-06 17:36:00.754000\"}","type":"EIP-004","decimals":0},{"id":"606bc444430442b927fda601bb6e0c34be053fad9354471099cc55118c56834a","boxId":"d7548c379b472bd3199158f90c236da9bfb56bb7d8389dae1758944ce199c8cb","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 20460.6368, \"stakeTime\": \"2022-07-06 17:34:18.775000\"}","type":"EIP-004","decimals":0},{"id":"63dee9fb3cfe595a0d32ee4736993b4b18d46bdddf9cd430cb48c8fa55a544aa","boxId":"2333cf9a6303ff79be1da637fed6d75fb74a73de5aac7f245a55ad81755ce007","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 13507.4848, \"stakeTime\": \"2022-07-06 17:33:44.485000\"}","type":"EIP-004","decimals":0},{"id":"6e55dae158cc171bbdf836c5a89b2cbf963a60e79c859e9ca6763fa608bf0c90","boxId":"4356ab252fdd1cc46bf55d147433b9df7b54c3ae0dd1367540731b16f6f50572","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 6392.983, \"stakeTime\": \"2022-07-06 17:26:21.146000\"}","type":"EIP-004","decimals":0},{"id":"7647ca1154c72891d5114104ea74e5e6904aa1db7f39ae800b714b77ac652650","boxId":"aa62d672562487c1c6166b27d508ac0b82c0419e0fef849c5963c737d60008c8","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 81091.5749, \"stakeTime\": \"2022-07-06 17:18:41.731000\"}","type":"EIP-004","decimals":0},{"id":"d393dfa8bd1949f0e5cfce457562f063e37d5d174bb29156d463e5c6983c1443","boxId":"4cf17d4cf557ced51d3920265821ea60ea77c812ce9536870ad1165cac798d64","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 102474.7822, \"stakeTime\": \"2022-07-06 17:13:19.215000\"}","type":"EIP-004","decimals":0},{"id":"d4a41e057c164c168850153cfde92241a36f6577d6b701d5b946cbae37b28426","boxId":"5c6010d825408606c9f350f83218d9c6133ca0487b0d14e22cdd3b1e51a7d93e","emissionAmount":1,"name":"Hash Glyph #0025","description":"Hash Glyph #0025. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"f37956ad35b650406cffae7aa085e3b537fb29db3c2ebab537ba4da9231ad08c","boxId":"f78c8216b5e4c3afcb19aa3b49aa953d4163ba431d9274fef80ef3b6377debd4","emissionAmount":1,"name":"Hash Glyph #0024","description":"Hash Glyph #0024. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"886bbe89602890bf68e7fc5de4962a793095fdbe6b37029b8c07169bf0cdea90","boxId":"f68e8543a4dab912e7ae1fee4d16d468e5effde907f48a019de29caa2beb4f2f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 154418.96480000002, \"stakeTime\": \"2022-07-06 16:57:10.674000\"}","type":"EIP-004","decimals":0},{"id":"24711c7da36c626c24235bce36fb1f0ad3b46e9ef3835d9a3f7a09a12bd0673e","boxId":"1fb8f0ece42f1437240a8227d7af5e2be875e28b99cd733da31110ca5cefd489","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 32311.0, \"stakeTime\": \"2022-07-06 16:52:57.821000\"}","type":"EIP-004","decimals":0},{"id":"8d2f8899fb587fba1e3e7d4175eccb0d5c58335cd296266b32e679fac84fefd9","boxId":"1d65861ef2c78a5f223a45b6f406f1d641141935c361075a1f1ccd7b1ff2ac8f","emissionAmount":1,"name":"Hash Glyph #0023","description":"Hash Glyph #0023. Seamless print. 2000x2000 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"e611b8ef9e460a17769221d84452522ab7dde2b0b2e77daef3e3ecc40c2cfc43","boxId":"391cd964628d6a63e666e9f87b701853598f34b1fee29527079837326de92c46","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 103422.5588, \"stakeTime\": \"2022-07-06 16:53:21.268000\"}","type":"EIP-004","decimals":0},{"id":"509b4a956de4e16141c27619a93c79816bfbea4c4b59cc99c07546371cea6a19","boxId":"665cbb7865d2871dc80da37a8ba1127e85bacf5334b7d687dcac65a4def96b3d","emissionAmount":1,"name":"Hash Glyph #0022","description":"Hash Glyph #0022. Seamless print. 2000x2000 px","type":"EIP-004","decimals":0},{"id":"81bc2866d7ef0c37546b2d7b481741f539bae95c58f45baa1dcc62358e5edabe","boxId":"282e03fee3f2a893f5e997d3434923aea4e5dd4d53cf0f1dc608b16d3996901f","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 233900.2606, \"stakeTime\": \"2022-07-06 16:32:43.532000\"}","type":"EIP-004","decimals":0},{"id":"f4ea75ef05ec8a9ba568dc189736ebc60178b6bb0cfcb9ad52ef30d0e4f0d18d","boxId":"33f7788e9db83146bd1c9df0a896bd786913f37a7eec72c44a690ac2c3aed697","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 10187.43, \"stakeTime\": \"2022-07-06 13:17:13.647983\"}","type":"EIP-004","decimals":0},{"id":"add034b683a4252af476fe08c9d60eab0a8fc2b4a373f9f4b812e1319d44dd82","boxId":"4b58bc8a5e0a94bbf2f581c0951d8ad023ffe1f5be9fad9f1c0fa1b386d8005c","emissionAmount":1,"name":"ERGO TOYS #47 - CREATURES SERIES","description":"30 FPS / 120 FRAMES GIF 1200x1100 pixels https://twitter.com/ERGODLIKE","type":"EIP-004","decimals":0},{"id":"4fb7cb3736c35fa50724379a550e87b89cf71c5acd88cd287f8edb6e25a426e0","boxId":"23ecb4b92b9134b0c451316975d3a1fafdcf8b6506df907309e1652e975b20d5","emissionAmount":1,"name":"NutHead3D: NutWomen 2","description":"{\"721\":\n{\"NutWomen 2\":\n{\"Collection\": \"NutHeads3D\",\n\"Name\": \"NutHead3D: NutWomen 2\",\n\"Description\": \"NutWomen created to fill nutheads heart with love and help Nutheads to raise together their BabyNuts\",\n\"Series\": \"3\",\n\"Items\": \"Ribbon\",\n\"BodyColor\": \"Mixed\",\n\"Background\": \"Flower\",\n\"Head\": \"Nut With Heart\",\n\"Rarity\": \"Ultra Rare\"\n}\n}\n}","type":"EIP-004","decimals":0},{"id":"494cdafedfd765ceb6891a2e17ed6442d03b01aa774c1bc024e3571fa1fa72a2","boxId":"4c6bc07cd95cf8b648f33408048f9f8eb4843c0b9d52ad7993c2e9f60d3b9303","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 51.08, \"stakeTime\": \"2022-07-06 12:33:52.557694\"}","type":"EIP-004","decimals":0},{"id":"af60a5720079aba62af7ebd873a14f8ffe755745d2d858c51c813053127255df","boxId":"fb760a6fa356631ea50dfe99660bab329e189ddf62819d7b1f01c99141883c16","emissionAmount":1,"name":"IIAB - Deep Dream Bubble #42","description":"Deep Dream Bubbles \nTitle: Purple Bastard ","type":"EIP-004","decimals":0},{"id":"8cac9cf0a60c8b3637122b398035fb72d3f49e68f890502786c6b29f8835f36c","boxId":"1f6b545c45b004e94b23c1fe6e9606d0b77971a1e61bbf22b3b3be76815ad996","emissionAmount":1,"name":"IIAB - Deep Dream Bubble #41","description":"Deep Dream Bubbles \nTitle: Rainbow Shower ","type":"EIP-004","decimals":0},{"id":"681eedcf46dc7bd11eded80e9d30de3e80b00bd4ab653393bca431fe8d44b64f","boxId":"bb69b68a5f8448e61b161ba3f3194bc13e57396d64b16cc74b00a1fcafc4f092","emissionAmount":1,"name":"IIAB - Deep Dream Bubble #40","description":"Deep Dream Bubbles Title: Digital Melt","type":"EIP-004","decimals":0},{"id":"3d2bd3da36658a226ba35928de8e318e573d6bb0d1f28584f99e9fc578ea43db","boxId":"93ae31aa1a3a88e717fcac2fb0fdea5ae7f2ad13d98f647f7891b1664b1e08a4","emissionAmount":1,"name":"IIAB - Deep Dream Bubble #39","description":"Deep Dream Bubbles Title: Bird Watch","type":"EIP-004","decimals":0},{"id":"b964156c3b0337467b55007c1eee611c71967e9f08ccd94cb40ff8970605a02a","boxId":"3d6c45c9bc8068c3b062a466729005e4d86b16df9de08f5083833eb3a230abc4","emissionAmount":1,"name":"IIAB - Deep Dream Bubble #38","description":"Deep Dream Bubbles Title: Flip It","type":"EIP-004","decimals":0},{"id":"5d467de0a8fafb8c30131ea4014785a63d517a886231de4016431548fab8f103","boxId":"a707beeb814921c705687703a018d1de16bf5c8ff2fced8b2a6b4408e45be5a2","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 13371.584700000001, \"stakeTime\": \"2022-07-06 09:15:20.796000\"}","type":"EIP-004","decimals":0},{"id":"0b42aec432466b98421df428c163fad77a3d9645d5a9321c872b0e2dd8d1b25d","boxId":"0d8b2df677f92e55f1018a21715057a31cd8469931a03a485e8c66b7ca01295e","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 1000.0, \"stakeTime\": \"2022-07-06 08:12:45.069000\"}","type":"EIP-004","decimals":0},{"id":"d29d05ce15a2733fa71eb67802327cc1af0e31374db0b3c42f1572dc4e00a8cc","boxId":"c875e39ff19fbdf61ac0bbeedda43accdf7951e19820a5142159f8b6b98819e4","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 19603.2161, \"stakeTime\": \"2022-07-06 06:58:05.203000\"}","type":"EIP-004","decimals":0},{"id":"0ce3097abf48e0df02a7be50f4e8b084178055cbcf9807bf749caa62ee6d3e11","boxId":"ce4b8e9869c650fb643bc0e8e2193b32575a69cbd5f80dae239d08d0000ca4b2","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 15710.382500000002, \"stakeTime\": \"2022-07-06 05:36:40.714000\"}","type":"EIP-004","decimals":0},{"id":"0d67273c46f374aeee5a0371c962f6c7f0db9aa5991f44bfbae67f4e836edcb2","boxId":"a78cf50a011986d36a973d757f659f8c24010e3d27c753aed5b506d1a2216bfe","emissionAmount":1000000000,"name":"WLL","description":"A token for gaming.","type":"EIP-004","decimals":6},{"id":"53ac87304709dd4a697e38b52ea0d2e862e3827415809230f20bc580baee9586","boxId":"2ec382f7d976afda57c3f8d365879c42d04988c295f3d987b70ab8ac0483fd93","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"fdb2f0c5f92d0df29b98ddfd69e139da71917095344122030bef14ac2835c886","boxId":"53ac87304709dd4a697e38b52ea0d2e862e3827415809230f20bc580baee9586","emissionAmount":9223372036854774807,"name":"ERG_NETA_LP","description":"","type":"EIP-004","decimals":0},{"id":"b9766554016e7548886c85f4979fbcf0ffe6c41f17f792a3cddc62e3d7179ddd","boxId":"f784ad450b9e9e9bbbd0fb143140ff52f554afe01e5300780fe33729c2b0f313","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 1532.8467, \"stakeTime\": \"2022-07-06 01:22:53.317000\"}","type":"EIP-004","decimals":0},{"id":"92c0f5a0f73e2661710750153be7d7c5866e5ca9317dbd0db67e3056388ea433","boxId":"a29015f5414d17766ee1cedb982fabefec7ff4777511c2c02d89607eaf75c92b","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 9343.065700000001, \"stakeTime\": \"2022-07-05 22:27:49.346000\"}","type":"EIP-004","decimals":0},{"id":"93dc18061feea497598e7c3b986e4ff206474f2d940a2c82115394d8700c8ff7","boxId":"1aaf194e4a5a37d9f251d3854a45398c8f82333cacd4500115efaea1c67d088d","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 16393.4426, \"stakeTime\": \"2022-07-05 21:49:45.381270\"}","type":"EIP-004","decimals":0},{"id":"b8614db81ffb4bf04433553233c63f4a61e1c27da6c3e6ea84094eb9c04d9e97","boxId":"c7e8f13ef8b1802c6a4fc4e769906ec813f98d7678d38894ab9dd7d103651d02","emissionAmount":1,"name":"NutHead3D: NutHouse#12","description":"{\"721\":\n {\"NutHouse_12\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_12\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cyan House\",\n \"Roof\": \"No Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"uncommon\"}\n}\n}\n\n\n\n\n","type":"EIP-004","decimals":0},{"id":"33d5f13f26091c43bc4d3bb50bdd3ba1d4b43511718b228306bbe97c8c2805ad","boxId":"64a7924302c439150bacda29a58f62e62a268a6a374a1c0becdd4d6b8435efd5","emissionAmount":1,"name":"NutHead3D: NutHouse#14","description":"{\"721\":\n {\"NutHouse_14\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_14\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Green Roof\",\n \"Title\": \"Nutheads Sigh Green\",\n \"Rarity\": \"common\"}\n}\n}\n\n\n\n\n\n\n","type":"EIP-004","decimals":0},{"id":"d52e08f43ca49df891e8c6441177bb79201629271e59ac57500787bfa65e36bd","boxId":"c8c5cc90df880dad1c81cb1b5bb1be0b7191b085eb8ff48aa2b666d52db1feee","emissionAmount":1,"name":"NutHead3D: NutHouse#13","description":"\n{\"721\":\n {\"NutHouse_13\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_13\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cyan House\",\n \"Roof\": \"No Roof\",\n \"Title\": \"Nutheads Sigh Purple\",\n \"Rarity\": \"uncommon\"}\n}\n}","type":"EIP-004","decimals":0},{"id":"692fb2563db2b58ecc2656b6333cb7ae596e5d034f725c113d06d688df920475","boxId":"2b1e5d3824590043bcc1485608eb604c0f7f03a325e0af564d5d4985803f6eac","emissionAmount":1,"name":"NutHead3D: NutHouse#11","description":"\n{\"721\":\n {\"NutHouse_11\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_11\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Gold Roof\",\n \"Title\": \"Nutheads Sigh Purple\",\n \"Rarity\": \"rare\"}\n}\n}\n\n\n","type":"EIP-004","decimals":0},{"id":"63632d71e8b2b27812aa5eda017f84aed7d2d4e33a3512f4fda64d1b6592a9a6","boxId":"33d22f0ada4083a01c5db7610145dd6bf29e27652359020ab4739a02801aab37","emissionAmount":1,"name":"NutHead3D: NutHouse#15","description":"{\"721\":\n {\"NutHouse_16\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_16\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Green\",\n \"Rarity\": \"common\"}\n}\n}\n","type":"EIP-004","decimals":0},{"id":"be7d05d2b152192caf5752d40a527e7a2cd0a51ef987f2e873ac188d3ebdd4ea","boxId":"48219ef3037bed6f9474193d0be4e4487e2f366f2d9ba2d4ff7bc7820fb36c29","emissionAmount":1,"name":"NutHead3D: NutHouse#17","description":"{\"721\":\n {\"NutHouse_17\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_17\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Light Green House\",\n \"Roof\": \"Red Roof\",\n \"Title\": \"Nutheads Sigh Green\",\n \"Rarity\": \"common\"}\n}\n}\n\n","type":"EIP-004","decimals":0},{"id":"915056a797d069e70c7c265adfef114ee7c5c9e284764387d38d76af18b00123","boxId":"affaf3fcf9f3a8734dc2811ef51e8cb43fb40b92ff1039e28436a51dcede3ffd","emissionAmount":1,"name":"NutHead3D: NutHouse#15","description":"{\"721\":\n {\"NutHouse_15\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_15\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Pink House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Purple\",\n \"Rarity\": \"common\"}\n}\n}\n\n\n\n\n\n\n","type":"EIP-004","decimals":0},{"id":"24a0729f8ce4e3720fca461760c418455e2642e66fe842261e87ed600db4a9e5","boxId":"020d797e01fc83837e137b0bad472b2b2d9e7a3affa8964bf42063b6294437f8","emissionAmount":1,"name":"NutHead3D: NutHouse#16","description":"{\"721\":\n {\"NutHouse_16\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_16\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Green\",\n \"Rarity\": \"common\"}\n}\n}\n","type":"EIP-004","decimals":0},{"id":"0105236a6c4a63f44d1067bef33c2c665e35f4614095872fe8a7b2bf39192a96","boxId":"5ddf79932df44561910624ed7c6d9ab7a9c89c6f22a07bc93b33d5de2f389a2b","emissionAmount":1,"name":"NutHead3D: NutHouse#10","description":"{\"721\":\n {\"NutHouse_10\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_10\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Pink House\",\n \"Roof\": \"Green Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"common\"}\n}\n}\n\n","type":"EIP-004","decimals":0},{"id":"eb259599d821bb93a980206e8c7b6be6c24841ab6f21565edcbb22c73ed561ae","boxId":"d9877e26148ec2403d61be6aab75d12d81412e0886431a4c72bdb44f0157ccd6","emissionAmount":1,"name":"NutHead3D: NutHouse#9","description":"{\"721\":\n {\"NutHouse_9\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_9\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Green Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"common\"}\n}\n}\n\n","type":"EIP-004","decimals":0},{"id":"467d1c1853d7cfefa50aac1c5603478e97459faf9bfd1b6a5fd6b874e3bb4323","boxId":"5704fc3a9709534dcc586d63f178b7d41eb67c1248b071306adc6580845c0b07","emissionAmount":1,"name":"NutHead3D: NutHouse#8","description":"\n{\"721\":\n {\"NutHouse_8\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_8\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cyan House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"uncommon\"}\n}\n}\n","type":"EIP-004","decimals":0},{"id":"282ec0229b12eddd71b262dc89700fd50ca8bfcd1d44c63126061366dbb420df","boxId":"5ec8723507ee3bd9d94cb4e8ff31f07fd4c4bdeacca21b0af973b114df2bdb9b","emissionAmount":1,"name":"NutHead3D: NutHouse#7","description":"\n{\"721\":\n {\"NutHouse_7\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_7\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Pink House\",\n \"Roof\": \"No Roof\",\n \"Title\": \"Nutheads Sigh Red\",\n \"Rarity\": \"uncommon\"}\n}\n}\n\n ","type":"EIP-004","decimals":0},{"id":"0e4202196f6030ab1986e39012dc95ea10f034b13d90a70c0b1f86d986106ff6","boxId":"95c98972d974c5852929fac83ee41f53d92f963ae5b74b1920c57401bda429b3","emissionAmount":1,"name":"EGIO Emission NFT","description":"Emission NFT for EGIO staking setup","type":"EIP-004","decimals":0},{"id":"dc22db903e5ac54da5d4b6f33dd13b2330b79a9ae473f9dd3ea0d796c1179443","boxId":"4b8db28d6bb41221a47512c7f4ba36cf4ae801e61e04eab872ba07c9b4263d87","emissionAmount":1,"name":"EGIO Stake Pool NFT","description":"Stake Pool NFT for EGIO staking setup","type":"EIP-004","decimals":0},{"id":"097fd281c99588269d672e1b686bf6bcdce04102e183b2242f6634d93869fc0a","boxId":"1b5e6451dccf4e9b90abd53eeb434dcd2174ee373cf0f7cfd2513d86579c1e81","emissionAmount":1,"name":"EGIO Stake State NFT","description":"Stake State NFT for EGIO staking setup","type":"EIP-004","decimals":0},{"id":"436f8f48a3650c7be728e2a331e9a6e818c31f27163ee6e5257fcfd2d8423dc3","boxId":"6303f9ae0ffe6492cbd59a43f207f2cf9067aa129ad618b027e13e1e0948e246","emissionAmount":2,"name":"EGIO Stake Pool Key","description":"Stake Pool Key for EGIO staking setup","type":"EIP-004","decimals":0},{"id":"012d649686deeef606d253146bec0cf623f9b84574fbfa0fd0d1091393923613","boxId":"e6640a92a2dd7cce73d31d833a03652230ae234c77fb557cad23f3c58ab714af","emissionAmount":1000000000000,"name":"EGIO Stake Token","description":"Stake Token for EGIO staking setup","type":"EIP-004","decimals":0},{"id":"13224d0ad96acc5a5a9dc53bc8320f7c53ef0ee79dde53a52e2c746926ac4681","boxId":"726794157d04d477c2f4eb5a1412cb05701e374da441572748c2a28afdae27ba","emissionAmount":1,"name":"NutHead3D: NutHouse#5","description":"\n{\"721\":\n {\"NutHouse_5\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_5\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Light Green House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"common\"}\n}\n}\n\n\n","type":"EIP-004","decimals":0},{"id":"f6b4612b2aced469978e5ad93027ed7721f7d565f9e070c1f6fa7aefff427978","boxId":"bcf446aaf855b1ffed2409e8307f7f9f2cfb4bd19746ef45e990fa6cf7e5887c","emissionAmount":1,"name":"NutHead3D: NutHouse#6","description":"{\"721\":\n {\"NutHouse_6\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_6\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cyan House\",\n \"Roof\": \"Green Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"common\"}\n}\n}\n\n\n","type":"EIP-004","decimals":0},{"id":"0ff116113b793e0c640b30dd8918d6e1dd0ad52a931e36b9e51eb114ed29e620","boxId":"fbf930ac912dad57bffe476fae656d25935dc3617784a3ee04b6200d115e4aaf","emissionAmount":1,"name":"NutHead3D: NutHouse#4","description":"{\"721\":\n {\"NutHouse_10\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_10\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Pink House\",\n \"Roof\": \"Green Roof\",\n \"Title\": \"Nutheads Sigh Gray\",\n \"Rarity\": \"common\"}\n}\n}\n\n","type":"EIP-004","decimals":0},{"id":"eb00a80e02158af64a21ac768e3a548d3360651099d5daf867a95012cfbc50b3","boxId":"db91ff344ff7641056f259535e4c2ed1b5e730329b64217e59d8427c8ff3b92a","emissionAmount":1,"name":"NutHead3D: NutHouse#4","description":"{\"721\":\n {\"NutHouse_4\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_4\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Cream House\",\n \"Roof\": \"Pink Roof\",\n \"Title\": \"Nutheads Sigh Purple\",\n \"Rarity\": \"common\"}\n}\n}\n\n\n","type":"EIP-004","decimals":0},{"id":"2ee4395a4b504a91d3bd43a9248f9922de88c2c94088f6f19eb08b3adc73fb12","boxId":"bec634e1c1c02d0dfa9745a315d3a0f72b3c3998a0316acbd549c9e68c777d73","emissionAmount":1,"name":"NutHead3D: NutHouse#3","description":"\n{\"721\":\n {\"NutHouse_3\":\n {\"Collection\": \"NutHeads3D\",\n \"name\": \"NutHouse_3\",\n \"description\": \"Nutheas after finding love, they build a house to live a good life. All Nuthouse are actual 3d models and can be deployed inside SigmaValley.\",\n \"Background\": \"Valley Background\",\n \"Main House\": \"1 Level Pink House\",\n \"Roof\": \"Red Roof\",\n \"Title\": \"Nutheads Sigh Green\",\n \"Rarity\": \"common\"}\n}\n}\n\n","type":"EIP-004","decimals":0},{"id":"ec1ba7f12e4558abcb3065bb7dc60d592e8a51a484c5e5fe2c54475b2b113b14","boxId":"0fd67d9c06e68acb57bb5d6935f12b8108f2ededfaded7b6958c00e7154a3eff","emissionAmount":1,"name":"C3W3_v2","description":"QR code pointing to presentation, minted as an NFT","type":"EIP-004","decimals":0},{"id":"c031c99e55b14b17e30713d6d2cfd03475c5164e63244c0c74c8a0f766eff96e","boxId":"9bf9ef1800e9ebb9ea536e4aad675934065044a5fec4e7548f1c580dfda451fb","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 843.0699000000001, \"stakeTime\": \"2022-07-05 17:20:11.455000\"}","type":"EIP-004","decimals":0},{"id":"bbfde72548124fb0c741bf9717640aafd698ff3f97f3c695acd09f332b101c82","boxId":"3c610d862695e612b9b0aca6ad94b19a63c7513d378aec298baa7d8d349bc92c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 40000.0, \"stakeTime\": \"2022-07-05 16:34:39.330546\"}","type":"EIP-004","decimals":0},{"id":"e28b410d6a5590019e6505ce3db0e3eb482836f6901fcc0f7f18099db9cab69d","boxId":"5a9427416558be7fb6c9da5f3f0ada036c2c061fc76cb467c597b09ee4f65d75","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 3814.9, \"stakeTime\": \"2022-07-05 16:30:37.976926\"}","type":"EIP-004","decimals":0},{"id":"4d13a4158c6f6cb8b25f7e0586f2fd8d44d21e03f844f17b5d8ff16639da7f7c","boxId":"c945014af125224e006176d2171a7151321f494087cbbee89597e431497a7ee5","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 25202.100400000003, \"stakeTime\": \"2022-07-05 16:21:49.320000\"}","type":"EIP-004","decimals":0},{"id":"953f34a7d2408399af5827f05f1303634f77c23ad15df070592fa8562f58b381","boxId":"4b802ae6f70e5e2587e07ef9f4b439b2de71a5253902d7c2ffbcf9044d5f9f0f","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 2313.72, \"stakeTime\": \"2022-07-05 15:10:07.674063\"}","type":"EIP-004","decimals":0},{"id":"6e55937e9b6fc4b6bae36726eed3f44c47e705aec1e0acdf01876eb0198fc075","boxId":"97f93638a408a37a6b205641811048b795ddbed029a28fc8e6bdc0597bc6c0a3","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"337bff9e2156ac5d0c6da727cf74bacf49486097c3b237b6c45cbb010f25dd61","boxId":"6e55937e9b6fc4b6bae36726eed3f44c47e705aec1e0acdf01876eb0198fc075","emissionAmount":9223372036854774807,"name":"ERG_ERGCREAM_LP","description":"","type":"EIP-004","decimals":0},{"id":"177e61f256b4c53c9913278f5a75e0c57c3ae81449a0fdd5622bba77abdd16bf","boxId":"7207d8d0e38b4191ea516368da7b1424288d8ac59cce1b688a234acd4e688202","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 761.05, \"stakeTime\": \"2022-07-05 13:19:27.112465\"}","type":"EIP-004","decimals":0},{"id":"d11b7202fe07908d80262958459532981c83876ef88a94bbfb3601ceb164d73d","boxId":"268806ba0346c5328ea46aa0f9166dcc3236c46d8f90d6d1ce65b4f3ba3ea0bd","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 15.0, \"stakeTime\": \"2022-07-05 12:34:08.733594\"}","type":"EIP-004","decimals":0},{"id":"81b925041d70fae69c2f478a6196f3c715ef57a752b32c4e5d9a78082016a2ce","boxId":"cf197b7862f1b4f703b510c3fa76b4983fdb5662d41741e0546d93658aacaf32","emissionAmount":1,"name":"ERGO TOYS #46 - CREATURES SERIES","description":"30 FPS / 120 FRAMES GIF 1200x1100 pixels https://twitter.com/ERGODLIKE","type":"EIP-004","decimals":0},{"id":"7cab4c64ceb9573a8701fefb79c1bace5bb57ad5ce596968278c631abff930b0","boxId":"299027ff9ade6195205d0540dec9cd409a5b3f5a759e86ac29929231260d274e","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 57024.639200000005, \"stakeTime\": \"2022-07-05 09:35:54.572000\"}","type":"EIP-004","decimals":0},{"id":"e4b39c318392413ceacffe1a262ef7c0f8e0ab6848da52e7ea6349af75690e65","boxId":"fb38445cabe8dfec7d73517c3aa73efcf2e51d978f5dcb4ac8cf9a7cbfdf4977","emissionAmount":1,"name":"BWRod Art#04","description":"","type":"EIP-004","decimals":0},{"id":"b21a6faade3d26a6c1e8e57a834a67c1c2bf3c6c6d2936ee6c8ecee7e3968ca2","boxId":"e781bda138663b3c1050d99816aa52c7e4c0e89ddd7965742dccb3ccb345b5e8","emissionAmount":1,"name":"EGIO Stake Key","description":"{\"originalAmountStaked\": 2197.8022, \"stakeTime\": \"2022-07-05 06:41:35.568454\"}","type":"EIP-004","decimals":0},{"id":"677d82f2aa3c29d695bfaca2297dc55799710464a0ff1ae5931d9bfdd1fc213a","boxId":"d72c2c81db408476ef14caad8f41a974c874b421eba5eb9abc4a743630de99da","emissionAmount":1,"name":"Ergoya Blockchainis","description":"xtra.digital.art@gmail.com\nhttps://twitter.com/XtraDigitalArt\nhttps://www.skyharbor.io/collection/xtradigitalart","type":"EIP-004","decimals":0},{"id":"81a42b8e1424ef7f9a231bd4a405a01c3e14d0c2a0798cd58ce2ef08d7e21a0d","boxId":"7af154512c1de08a11552762a1cbec1b5209a0bf7e993eb411137f61a154ea2d","emissionAmount":1,"name":"low rider 55","description":"lowrider albq.N.M.","type":"EIP-004","decimals":0},{"id":"df8e4ec1783bf8f761a9af00a16ad761354920c4cd692191d34da2d6526198eb","boxId":"35b723f4a5f073099828142a85efeeda046c89241c475ab286ca4c94315e44d1","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 32361.3421, \"stakeTime\": \"2022-07-04 17:38:31.244000\"}","type":"EIP-004","decimals":0},{"id":"cddf695ac81c11a99bb4ac3633eb6f84f553e6882ba9bfed492fe811653f6785","boxId":"ffdd6c604a4bc2083ce0d589f7d0080415f72028a34c53d67fa89d2d79e80cb2","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 11985.088600000001, \"stakeTime\": \"2022-07-04 16:20:19.026000\"}","type":"EIP-004","decimals":0},{"id":"ff06980016509a79e4d525ad8a606657d8357f86b5aa5b8a613e9e5d60452fdb","boxId":"19b885415e728a66ee33abe021174476af39d917fcf6c76367016b03915b1ce0","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 12294.7683, \"stakeTime\": \"2022-07-04 14:32:01.565000\"}","type":"EIP-004","decimals":0},{"id":"05ce2ebda131aa879b3f28bb7b9a082791079c6e46ece0080a488e9d66f5507c","boxId":"765467d9b6875a2341532c8adb1a998cf7957520b1ecc3124fa234760f09d337","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 155.1588, \"stakeTime\": \"2022-07-04 13:49:23.408000\"}","type":"EIP-004","decimals":0},{"id":"31bebbff6205f8b983bf9dd12f383add8f2a670e21cd44e391d1bb23a3c53a8d","boxId":"74eb4eefc3fa71bc3300c1f8341d0d0da45536886cc2f5dbb739222a9b71f099","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"b039a6fbd61e0f03f56d49f7bd168bb1975f3ffd388c07bc284389b60a1cc78a","boxId":"65027842cbdae30550643e2dbb094c62f6825ca7b5f657e315257458360b02e3","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"b7a2b5f0d0a2450542c012472c4c830d5d5cde2b4e56a3b1a5c78c44f3a8c05f","boxId":"e56618ef7eb45c0469f03bcfdb31f0adf4873ff0d0d7dd1d10f7c8c574d76794","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"f108fa01471023b6ff8716c2ae9f1fba7fe40dafdd9ebd716ab5d214c7691669","boxId":"7a86e3ed798973ad2de6150aae5eff4174163c76233dc2cb1d3f628034e3b75b","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"36aa305f998b0a1d2307441a7211b39476555ee4b52b4c9c5a1c151534808cb8","boxId":"3274f0ff90218dc9d9ce72baedba813c328aec63e171ea8e26720fa84a427be1","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"e4968c800d822acb3dc59dcba50d376595abcd4e8cf32773d844c27d25fbd591","boxId":"257664f883f01cfefb4dac493b99bee00d5a61f0d8c7077075cbae094f95bbf8","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"3e1286d6771c88295fcb99a4d41f5e32e8a94db860936fb1190d69115a6ec3cb","boxId":"4da72ee9c452696b4e4c0021c0730020b05c44ff6999f393fd2d1d7102c08051","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"df66dfb7913076afa2fc93f571904b0ad8d51dd61d6bb0c7e2ee2d09b35c362f","boxId":"1eef3ecf33221718e29b1ab382b683bb2e49ecb06f4e708b43ec75d65c66919a","emissionAmount":1,"name":"EGIOStakingV2Test Stake Key","description":"{\"originalAmountStaked\": 1.0, \"stakeTime\": \"2022-07-04 12:00:24.603000\"}","type":"EIP-004","decimals":0},{"id":"db22393fe6f707ffb89bc61f846c092be9f067cdda3642616b0fd9c13215c774","boxId":"eeb668bb35f1c1cf55618bdc5b20005596b4654a15aba705e3ee1bc9e7b247b4","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"8b22896a877d27bfc1ef6b1b016366ccb2220b7dc5726efc43adf6805b5d2a3c","boxId":"dcbc29ebbce8e0cb8d22b3ff6dff2867897fc7c9a3718226c1e97ff7016a3d2a","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"df90d2764ab0d8ee5c669ef47ba01f18920bd83345eafc2500e940e43e2f80d4","boxId":"350851ce3f75cb7f70e70087ecddd44db61b00951deade2cc2bf77361406a33e","emissionAmount":1,"name":null,"description":null,"type":null,"decimals":null},{"id":"1f74b83758ddbd4866372373750e52125ee6d5a2b41762817d091fd4e2be1f98","boxId":"138f031983780a5ac46172459195491e20ab1e9b928ef9e8440da00ce0fc4bd7","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 7375.4386, \"stakeTime\": \"2022-07-04 10:15:19.314000\"}","type":"EIP-004","decimals":0},{"id":"33f0d914bededc9ec8ce78c85c5718b8bce1e871e68667699aa2e0c5acfa4eb4","boxId":"37d4184cd4590279e0a52c7a31afa2decab44149135fec5799cd7499cf905208","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 8880.0, \"stakeTime\": \"2022-07-04 09:49:06.491000\"}","type":"EIP-004","decimals":0},{"id":"23e00b8ba57b5e6948e3952b4be061aad43066c092374814c2ce9ae0f2faebf7","boxId":"f98fb3da6e0e24ed5434aaf7913ee51bdef49075208a2fa3c16fa1b1905d46a4","emissionAmount":1,"name":"EGIOStakingV2Test Stake Key","description":"{\"originalAmountStaked\": 1.0, \"stakeTime\": \"2022-07-04 09:38:58.378000\"}","type":"EIP-004","decimals":0},{"id":"df25d36072be22e6e52e65a17f5924f94e6c35ecb26bd4418f610e8f6915fc8d","boxId":"e1f4cb7c1ca84737c9697964ccd657119c48a0038b5c71762add5638e0811217","emissionAmount":1,"name":"EGIOStakingV2Test Stake Key","description":"{\"originalAmountStaked\": 1.0, \"stakeTime\": \"2022-07-04 08:39:26.434000\"}","type":"EIP-004","decimals":0},{"id":"cc0c26623795a019ac832df6b01dc2aac0ead375ec5e42a103dc0daf9406c228","boxId":"8df46dcbecdf4b5327599f6c179ecee54241d1253d852a4e6141509d9f8208b6","emissionAmount":1,"name":"Petroglyph #06","description":"Petroglyph #06. 1000x1500 px. Author @maritsaart","type":"EIP-004","decimals":0},{"id":"5f4b945ff16a70f760810797b307289bb6b0e120f2afe82d84e97fceb276f9ae","boxId":"bc525a2640d34e70a55afb537ec2801341e202bc3b6e6b064e70f80efb77e683","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1149.19, \"stakeTime\": \"2022-07-04 06:51:34.249354\"}","type":"EIP-004","decimals":0},{"id":"6f0a679b42fb61cc1edc69031fcd295a29aa49d5fe99f433c96e52a646e5a82b","boxId":"368c97ae52500b19cf454f5c3401fb6b072fa4ad0d99924e77c5cf72d0ba91c5","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 5803.2787, \"stakeTime\": \"2022-07-04 03:57:11.939000\"}","type":"EIP-004","decimals":0},{"id":"62bea5cad6937598d08feba381a37371ccbe761262eba7982917c325be7a24e2","boxId":"150a188a903a91b20d718883e2635c84305c67ab39cf71ef3c3c6d6581b18c6c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1777.52, \"stakeTime\": \"2022-07-04 03:27:39.503359\"}","type":"EIP-004","decimals":0},{"id":"554712fb3acc673e272d398d1905c52aa836e5850c5665878196e96fa1b45f5a","boxId":"2d88d58d7e001b6dfdab078aa6ec23973723e5a98c05d3bb03590f840353ee77","emissionAmount":1,"name":"Bubble Heads #20 EPIC Rick Sanchez","description":"EPIC 4/40 - Bubble Heads is a collection of animated NFT's that have different types of rarity. https://twitter.com/bubbleheadergo - The holder of this NFT during the snapshot will be entitled to the respective physical artwork for free (excluding shipping costs).","type":"EIP-004","decimals":0},{"id":"b35a26250795d0ff4a965db8ee7f42fd91306af52ae784bd167ff4fa66c0f369","boxId":"da1891d993508061c0bd21969f69024ddb67b3d528ea43bc4e5183d0a8ca2207","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 1896.9071000000001, \"stakeTime\": \"2022-07-04 00:15:45.740000\"}","type":"EIP-004","decimals":0},{"id":"9eafb51a2b6a7c842a6ebe428a5f2d617deab27c3b557f972f81d225b5e54b61","boxId":"f0fcfb5fd774128b68dfc93dd1d9bb0b1606ae53454137fb36ef2f7178144d40","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 364.94530000000003, \"stakeTime\": \"2022-07-03 22:49:26.089000\"}","type":"EIP-004","decimals":0},{"id":"34861c4e8ccf013af8dc75ec9e0830ac31ff98095cfcf816139a21ea452a4787","boxId":"c777a829cd1b0724a7cd70060edefac27f5178220b30e526fce2f435940bf64c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 30000.0, \"stakeTime\": \"2022-07-03 21:07:41.966205\"}","type":"EIP-004","decimals":0},{"id":"092e7caa6486cf8578a3f728373c76e08e045c04c781994777d7107300375ae1","boxId":"eb6e2be68c1bb5aad4d6bb662cbcc21af0f738b6b5c855831b6ab7fb5d6b326c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 621694.82, \"stakeTime\": \"2022-07-03 15:17:43.687929\"}","type":"EIP-004","decimals":0},{"id":"4f9da186d986dc6367392de30b5a4a95064e5026b945db58167fbfe601b9bfa9","boxId":"54b20ebce02281a90dd41802715dc0e383c6b85400865a77cfa1c0f958db3c30","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 6147.541, \"stakeTime\": \"2022-07-03 14:30:02.496000\"}","type":"EIP-004","decimals":0},{"id":"7c51709ab0327694d17a5ab5e1e4e96a124b2a170bd57f38c08f5fff43a7b541","boxId":"8d5f10838946fc437050db1d3fb9d129edfbc729825a11ccc386fa03dc65bf4a","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 21000.9741, \"stakeTime\": \"2022-07-03 14:04:26.417000\"}","type":"EIP-004","decimals":0},{"id":"5cc65ac9367a374a2ff49ecfebeb41a08034f209c5e53a4296b23bd9d8ca86ef","boxId":"78793d0910d4aa3f2ff240d227ecd9e278129520feac21e0c6ce1c99905a3b4b","emissionAmount":1,"name":"Euphorius III, the Overachiever #GN_044_ERGOVERSARYIII","description":"🌟3rd Ergoversary Special🌟In health and in sickness, in bull and bear, His Majesty rules his Kingdom inspiringly with indefatigable passion | @ERGnomes by Foeniculum","type":"EIP-004","decimals":0},{"id":"a712f3dddce46fb9511a1cd130e3602a5a50aa1d8cf79348e74daa1c00ff7fb4","boxId":"67941b079c0e19126e2d3e6ace1ecf78f30b9afaf7239053730e86b91d91f264","emissionAmount":1,"name":"Bubble Heads #19 EPIC TOTORO","description":"EPIC 3/40 - Bubble Heads is a collection of animated NFT's that have different types of rarity. https://twitter.com/bubbleheadergo - The holder of this NFT during the snapshot will be entitled to the respective physical artwork for free (excluding shipping costs).","type":"EIP-004","decimals":0},{"id":"922f682dd0930957ac00b4243df77841f18deb650ca2fe2f4cb51bc11c5e8c09","boxId":"4111642ea31c8b17e65a22f75e4c47b06453bc25790307424f01df71e0f7d35e","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 13854.4475, \"stakeTime\": \"2022-07-03 10:50:18.316000\"}","type":"EIP-004","decimals":0},{"id":"74132d946eef63bae94fc7f6444a1e43dfa6d9d45f2f956fccf182fdc5617460","boxId":"83854aa62c7d9498a5717f306e057a41f0035209abedcafc63f46973043bc3d6","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 20833.35, \"stakeTime\": \"2022-07-03 10:35:52.901946\"}","type":"EIP-004","decimals":0},{"id":"a02b50a0bb7ec300a25b81b29b2bc950601c6545397ae7c3df6a38495a8b3cf1","boxId":"1f8d25f04222ca4ae31b4559eee2ea317d4c3436fb824e715b67e59424206c3c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1011.91, \"stakeTime\": \"2022-07-03 08:36:36.969276\"}","type":"EIP-004","decimals":0},{"id":"ad8045049c78cd8843f5591f47ca306b66570c2962a06462b22df0bac4f7368c","boxId":"0a5ad47f3a7421e9d8a55985eafd1a578eb7837c671ee8dc9ea9516cd19a769c","emissionAmount":1,"name":"Ergonods #4 - Slick Jones \"One\"","description":"Young Slick is a man on a mission. When you feel helpless, and your car has broken down in the middle of nowhere. Have no fear! Slick Jones is just a call away! Wherever you are, just dial!dial!dial! and Slick will be there before you can say cheese! Slick Jones making the town a better place, one repair at a time.\n\nSlick Jones \"One\" - Slick looking sleek in a black leather jacket.","type":"EIP-004","decimals":0},{"id":"3f01acb618f08937f7ee7b22c14e6a337bba1aa1b6256aa05d7f68084d6c78bc","boxId":"4c128d3551ffac174f602deb2852e4d574511c2d7305173748ee6cff47be182a","emissionAmount":1,"name":"Ergonods #10 - Sam Woolie \"Two\"","description":"Sam Woolie, everyone's favourite neighbour. Enjoys the simpler things in life. If you're in the mood for a summer barbecue. Good ol' Sam is your man! Just don't tell him how to make his burgers. \n\nSam Woolie \"Two\" - Sam in a totally chill gray T-Shirt.","type":"EIP-004","decimals":0},{"id":"79b9efc0235a4a426de7e0c7e7f52c52e1aea3f08c6b6aa48589ab962e0a7cfe","boxId":"6ecd97aab0c03206033bb1c28350e7d6abf3b7c586fc7a7897b58fef02c12e15","emissionAmount":1,"name":"Ergonods #9 - Slick Jones \"Two\"","description":"Young Slick is a man on a mission. When you feel helpless, and your car has broken down in the middle of nowhere. Have no fear! Slick Jones is just a call away! Wherever you are, just dial!dial!dial! and Slick will be there before you can say cheese! Slick Jones making the town a better place, one repair at a time. \n\nSlick Jones \"Two\" - Slick in a creature of the night midnight blue cape.","type":"EIP-004","decimals":0},{"id":"f8156a06db17771475947b65a243a8a2f86ffd3466c806e54da7471212cd27f7","boxId":"01baad98476da0378f66bdd82318c100af84b625a0a15c1b7fc9724a5effd961","emissionAmount":1,"name":"Ergonods #7 - Zak Rivers \"Two\"","description":"Zak is a natural athlete. He loves the sun, and whenever the seas are high, you can count on one thing. The Zakattak! \n\nZak Rivers \"Two\" - Muscle calls! Zak in a pink gym vest.","type":"EIP-004","decimals":0},{"id":"2397f9ffa57f8fcdbb58e3f12e0b34dd63d0adf393d6a217bdd104e01378a3d2","boxId":"ffad6961dee3d062b5bf8ecb9181ef545906a9e9a7fb681066300c84a6fd57af","emissionAmount":1,"name":"Ergonods #8 - Mack Yolo \"Two\"","description":"Good ol' Mack is a bodyguard for hire by day, and when the sun comes down, you can say hello to the Mack Pack! The town's favourite dancing crew. When you're feeling down. Count on the Mack Pack to dance your worries away! \n\nMack Yolo\"Two\" - Mack in a trendy green muscle shirt.","type":"EIP-004","decimals":0},{"id":"44e392261cd85a197463c302cd9bdac5ad964006ff24d768edd7f75791cd9b43","boxId":"f8cebfb9a3b74586537a1f8bc5e542d4cef14ef4b83e523584dcba99fb2159fb","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 3415.3005000000003, \"stakeTime\": \"2022-07-03 07:24:21.952000\"}","type":"EIP-004","decimals":0},{"id":"d9ce519baec6b67999adde3d9f95d568b1b04ab62973f32e13f13c3c19a46e27","boxId":"ee37be6118431de6fd946e1943ef32a00b5941b4755b10c8ef5d607eea4aaca6","emissionAmount":1,"name":"Ergonods #6 - Rob Tickles \"Two\"","description":"Rob Tickles is an entrepreneur. He owns ActiSeasons, the biggest grocery chain in town. He might not look like it but he is a good guy. Well, he has good intentions and means well. \n\nRob Tickles \"Two\" - Rob In a gray T-Shirt for a casual Friday.","type":"EIP-004","decimals":0},{"id":"b6de10f053e7bf57a1de0897e0387391c40bae528d7a07df84d6fe65c4d59004","boxId":"d021e3309b4812af92c9b5ea9830e7e8fe0edbd1729beb48a0514f6b8e6a2032","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 12500.0, \"stakeTime\": \"2022-07-03 06:49:09.086110\"}","type":"EIP-004","decimals":0},{"id":"dda261e51387c27436454b7a9b42310ec58a335bd1ea431973a423a0b49af6d8","boxId":"d847b422d51ca28358edc730022c8b7736ddc4a22a1e8800b18fa0af15599896","emissionAmount":1,"name":"BWRod Art#03","description":"The Rose","type":"EIP-004","decimals":0},{"id":"5faa277d84c1fadfd6e968ccada239a3babd89e722447ff1d6b50d783fb7cc03","boxId":"494b38b585ab4a69340979de1555235cc13c446cbdabdd002a3de423a65b82f3","emissionAmount":1,"name":"Ergonods #5 - Sam Woolie \"One\"","description":"Sam Woolie, everyone's favourite neighbour. Enjoys the simpler things in life. If you're in the mood for a summer barbecue. Good ol' Sam is your man! Just don't tell him how to make his burgers.\n\nSam Woolie \"One\" - Sam in his Sunday best gray suit.","type":"EIP-004","decimals":0},{"id":"93cdad53b916887c6b7d4b768960cc1578492d2baaf29d37e525e415a5409994","boxId":"459109c12af57f9ed2b127260bf22cd8b9fd59fcba05e83325c4aaddb3238536","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 7833.35, \"stakeTime\": \"2022-07-03 04:28:44.193186\"}","type":"EIP-004","decimals":0},{"id":"21b9266cc23f67d9819c9540f92ced84141db87b1f4476954fc3a7eb8d1c23e3","boxId":"f95f89b7ea51e29bbeccb9caac1d1edf90bdd8cf8d186d92408d48309cd4b06d","emissionAmount":1,"name":"NutHead3D: BabyNut#52","description":"\n{\"721\":\n {\"BabyNut 52\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 52\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Blue Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Clouds Pink Background\",\n \"Ergo Toys\": \"Ergo Toys & Blue Wheel\",\n \"Main Body\": \"Golden Twins\",\n \"Rarity\": \"Extra Rare\"\n }}}\n \n\n\n","type":"EIP-004","decimals":0},{"id":"b5254f727fb7141e9f6064cba4c33222cb6314bc38537f38f4bf58fbfe44e491","boxId":"8ada86f4a2c08d614c51e1d1f60dc8c6b88952496b3476e8ab8ccf53baadb677","emissionAmount":1,"name":"NutHead3D: BabyNut#51","description":"{\"721\":\n {\"BabyNut 51\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 51\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Light Green Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Clouds Blue Background\",\n \"Ergo Toys\": \"Baby Wheel Pink\",\n \"Main Body\": \"Baby Girl\",\n \"Rarity\": \"Common\"\n }}}\n \n\n\n","type":"EIP-004","decimals":0},{"id":"81689770a0bc6668d4a3394966c8566d597248b39fd008c95f1f3d680fc82258","boxId":"2951b61890dc76a504771b24abdb98c5eca7fe6c75141e5c7516609db810eab9","emissionAmount":1,"name":"NutHead3D: BabyNut#49","description":"{\"721\":\n {\"BabyNut 49\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 49\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Blue Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Clouds Blue Background\",\n \"Ergo Toys\": \"Baby Wheel Blue\",\n \"Main Body\": \"Baby Boy\",\n \"Rarity\": \"Common\"\n }}}\n \n\n\n\n","type":"EIP-004","decimals":0},{"id":"63cc65b141b084947357c499fed0d71c5b1fa18e0f1b1e3c82b43f3b7f2ef8aa","boxId":"082bfcde4b8b8607768a4e267dfc3ba8e59616503c07638da318ee4e6e065982","emissionAmount":1,"name":"NutHead3D: BabyNut#48","description":"{\"721\":\n {\"BabyNut 48\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 48\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Purple Baby Cot \",\n \"Baby Toys\": \"Pink Pacifier\",\n \"Background\": \"Elephant Background\",\n \"Ergo Toys\": \"Baby Wheel Blue\",\n \"Main Body\": \"Baby Boy\",\n \"Rarity\": \"Common\"\n }}}\n \n","type":"EIP-004","decimals":0},{"id":"2f4a9c698ab38862bb7a671059fa1f00cd80d4d18bd899b9edfad94499690d0b","boxId":"038015527a061a7198c2db9c53ab9810143989ff7f2976cc662ad59417f09afd","emissionAmount":1,"name":"NutHead3D: BabyNut#50","description":"{\"721\":\n {\"BabyNut 50\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 50\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Light Green Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Elephant Background\",\n \"Ergo Toys\": \"Ergo Toys & Pink Wheel\",\n \"Main Body\": \"Baby Girl\",\n \"Rarity\": \"Common\"\n }}}\n \n\n\n\n\n","type":"EIP-004","decimals":0},{"id":"31256f86322f6c979f5397a3bca7967c1d54fab98dc6bcaaf0f38509b31f1e15","boxId":"344fe80ab5b0380d374d8bbb819ac9b77d4e3782d5bb3ad273d6294eacddb14f","emissionAmount":1,"name":"NutHead3D: BabyNut#46","description":"\n{\"721\":\n {\"BabyNut 46\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 46\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Blue Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Clouds Pink Background\",\n \"Ergo Toys\": \"Ergo Toys & Pink Wheel\",\n \"Main Body\": \"Baby Girl\",\n \"Rarity\": \"Uncommon\"\n }}}\n \n\n\n","type":"EIP-004","decimals":0},{"id":"c8d91667a93a1a37472948ec77770bacdd72faac2fc2e2116a522178704a6a97","boxId":"3ef1db54295d62080b0412ebfc264d264068e4a5bf5b5578c0e16c1c0fea7cd2","emissionAmount":1,"name":"NutHead3D: BabyNut#45","description":"{\"721\":\n {\"BabyNut 45\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 45\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Brown Baby Cot \",\n \"Baby Toys\": \"Blue Pacifier\",\n \"Background\": \"Clouds Blue Background\",\n \"Ergo Toys\": \"Baby Wheel Pink\",\n \"Main Body\": \"Baby Boy\",\n \"Rarity\": \"Common\"\n }}}\n \n\n\n","type":"EIP-004","decimals":0},{"id":"7a6870ae8299e66d3250f03399ac5115cf761684556df26df9762906a5cc21a1","boxId":"2acdc202b5bd5add925b5814ed97e7471dd5473a4a23f3a5c0af6ac012203865","emissionAmount":1,"name":"NutHead3D: BabyNut#44","description":"{\"721\":\n {\"BabyNut 44\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 44\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Purple Baby Cot \",\n \"Baby Toys\": \"Pink Pacifier\",\n \"Background\": \"Clouds Pink Background\",\n \"Ergo Toys\": \"Ergo Toys & Pink Wheel\",\n \"Main Body\": \"Baby Girl\",\n \"Rarity\": \"Uncommon\"\n }}}\n \n\n\n\n\n","type":"EIP-004","decimals":0},{"id":"69881743c46c06eff2301b61c96b723641de680ce7bdc342d13d7233a952eac4","boxId":"98d7cfc6f091fbc46e6b852f6c464976e84c83c58b5522ed7e3f1d632cac200a","emissionAmount":1,"name":"NutHead3D: BabyNut#47","description":"{\"721\":\n {\"BabyNut 47\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 47\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Light Green Baby Cot \",\n \"Baby Toys\": \"Pink Pacifier\",\n \"Background\": \"Clouds Blue Background\",\n \"Ergo Toys\": \"Baby Wheel Blue\",\n \"Main Body\": \"Golden Twins\",\n \"Rarity\": \"Rare\"\n }}}\n \n\n\n","type":"EIP-004","decimals":0},{"id":"ab50b5b378ca34844fca860eab489025ae76ff953d97bfb7ec5b23e9240f6d23","boxId":"6054c91334954704f230739be4e39e8b5d9d0aace10b422307b5241109554155","emissionAmount":1,"name":"NutHead3D: BabyNut#43","description":"{\"721\":\n {\"BabyNut 43\":\n {\"Collection\": \"NutHeads3D\",\n \"Name\": \"BabyNut 43\",\n \"description\": \"The Nutheads after wondering in the valley trying to find a cave to mine they find something far more important, Love. Now skyHarbor storks are delivering their babies\",\n \"Baby Cot\": \"Light Green Baby Cot \",\n \"Baby Toys\": \"Pink Pacifier\",\n \"Background\": \"Elephant Background\",\n \"Ergo Toys\": \"Baby Wheel Pink\",\n \"Main Body\": \"Baby Girl\",\n \"Rarity\": \"Common\"\n }}}\n \n\n","type":"EIP-004","decimals":0},{"id":"acd4eaf5534742b75b26d3ea2064b5174b15235246af29bfd2d830b44ddd7bf1","boxId":"36c2a80015bf36ab87dd1afcad0d2ca6da9765233e8c78beb2b8683a37cf90d4","emissionAmount":1,"name":"A portrait of my cat","description":"A portrait of my cat named Midnight using pastels charcoal ","type":"EIP-004","decimals":0},{"id":"48e47eaac2c87234ec4f50d9b095ca9c779aea40f2ca346522077c2700ee9530","boxId":"b81d3174d7e4ebd992773bb825d4a2a57c80bb345ecf06a9f6503573079582a4","emissionAmount":33,"name":"Screaming ERGoat Gen 1 Membership Card","description":"This card represents the holder as being an early adopter and owner of a Generation 1 Ergoat. This Common device screams CHILL. Keep this membership card with you always as a signifier of your ERGoat devotion and pride.","type":"EIP-004","decimals":0},{"id":"b499e01e2446071e4aa155536878af50449eaebe4d97f96c6ff7bc5e7f38d39c","boxId":"5ff1d10487d5f93361a0fccdecd3771852c146a3c9d0742ae85cb939ee7f8ba4","emissionAmount":33,"name":"Screaming ERGoat Gen 1 Membership Card","description":"This card represents the holder as being an early adopter and owner of a Generation 1 Ergoat. This Common device screams FIRE. Keep this membership card with you always as a signifier of your ERGoat devotion and pride.","type":"EIP-004","decimals":0},{"id":"fb7f62449b8faf496c4b0e6e0f80a3d8970527bbbf17ce5809ab8527d1add85d","boxId":"14d564aa3647da1cd083f87cacc4f3961cff8d2034b52d9ddd47f0b3200dee3f","emissionAmount":33,"name":"Screaming ERGoat Gen 1 Membership Card","description":"This card represents the holder as being an early adopter and owner of a Generation 1 Ergoat. This Common device screams FABULOUS. Keep this membership card with you always as a signifier of your ERGoat devotion and pride.","type":"EIP-004","decimals":0},{"id":"c8084b0f4ec7058dd972959bc95fd3062035623ac0d5b1a4a6bcfec8b0487da4","boxId":"e034cca0b3bfe88df62c8435ed08c1ad1dc28e9943b5742fbb613d9f6040914a","emissionAmount":1,"name":"Screaming ERGoat Gen 1 Membership Card","description":"This card represents the holder as being an early adopter and owner of a Generation 1 Ergoat. This 1/1 Rare device is pure gold. Keep this membership card with you always as a signifier of your ERGoat devotion and pride.","type":"EIP-004","decimals":0},{"id":"cb11f86017fabba2411471547d618dd117ab87b839869501e5676008f302579f","boxId":"561e1c24ad9ec9dbf0eddacdcc489e38f5d12b40c5ddedbd6118b703b5a1bff2","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1606.08, \"stakeTime\": \"2022-07-02 21:50:47.496059\"}","type":"EIP-004","decimals":0},{"id":"45d46da0149e07e3fb1407b07922b7c08e8902d5a495babf9569e7a65e8bee6d","boxId":"5695fbea88f163dbf1a333faaab7acc0819ee6c9451bcdde8f928ce61fa3f5f6","emissionAmount":1,"name":"Screaming ERGoat Gen 1 Membership Card","description":"This card represents the holder as being an early adopter and owner of a Generation 1 Ergoat. This 1/1 Rare device will forever remain glitched. Keep this membership card with you always as a signifier of your ERGoat devotion and pride.","type":"EIP-004","decimals":0},{"id":"4d4517c67eecf81aaf3cbd42cd4fd6bcb65544317f6a0f19f39a2d6bcec0419f","boxId":"f2503dc67a31e748cbb46d84f4a807a9d36bde028944a9b32fcea51f196e6108","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1250.0, \"stakeTime\": \"2022-07-02 21:12:01.993008\"}","type":"EIP-004","decimals":0},{"id":"d5c3d5c836f5ddc89c830e3817ab8f8f1ed3ed412a014078ee22b82973a8b675","boxId":"746e6bb790b8d92d5aee8df5a490c44c5e5d4d7120589dd0dfa166fdc3f0bb72","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 5765.002100000001, \"stakeTime\": \"2022-07-02 20:59:56.340000\"}","type":"EIP-004","decimals":0},{"id":"8dba0dd0683f90acd771f405528c5a8e45097ccb1a0be3e8dcde65d9ab9c8229","boxId":"15a4962ad14067ba5d9dfca55399d5c7c51b0f8fe450a155c49887e514623deb","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 572.61, \"stakeTime\": \"2022-07-02 19:16:19.171408\"}","type":"EIP-004","decimals":0},{"id":"2e960ad1a095a8bacd7fd0f81d9581f99ea376a034501249b8eeec100bf11eb7","boxId":"d689ef1099502713c5a3a1e1b33268f74576be6bd23aa8cf401f3238cd1d8cc2","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 182.3725, \"stakeTime\": \"2022-07-02 17:28:36.653000\"}","type":"EIP-004","decimals":0},{"id":"29f33bd523843e83663d673e28af5f01d5f3cef0985bfbc442c0cb01e05b9551","boxId":"a83670b3c7ada233c92e890fac3bfa76f802f002d79c2e8312c6bd97c6a997a4","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 4098.3606, \"stakeTime\": \"2022-07-02 16:08:02.978000\"}","type":"EIP-004","decimals":0},{"id":"b031082bde2e8af0b469ed09ab9a898bac52555fab129fb0d9ecf6cadc1ffb74","boxId":"bc8da31b802770c7e1d318300a5f287722b1d718d08953ff9d515ada0d9e4e85","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 26277.372300000003, \"stakeTime\": \"2022-07-02 15:57:19.483000\"}","type":"EIP-004","decimals":0},{"id":"b07c0b0df65488788a74d618a02317a0fa912a70fae57efe6ad9529eb67ca4b8","boxId":"cab3e224e4d6ccebd7843307d50ff01b0208cc51835bc2f0f2e44190c3460f08","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 333333.36, \"stakeTime\": \"2022-07-02 15:34:29.470834\"}","type":"EIP-004","decimals":0},{"id":"c1f819a8d01543e63e4cacd27631f5b9124c4efcd52143fbbc5e5a4143a1d2f9","boxId":"8dc54d07636bd56dd7d95036805abaf1216f41e080499a50681f2e5244374396","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 7267.609, \"stakeTime\": \"2022-07-02 15:31:29.667000\"}","type":"EIP-004","decimals":0},{"id":"85a6d0bfc0c6ed05f92dd34a30b6440afaaab97c0f5d76dcd99b73fb53b758d9","boxId":"e6f8e8a600d53109144f5e624e223546d6c9c7d39821bf82db8ef143ee6c5fdf","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 496247.43, \"stakeTime\": \"2022-07-02 15:25:33.474915\"}","type":"EIP-004","decimals":0},{"id":"1dd94a5f1917bb72f8dffeb89851a83d7cadd52cd78a5b13e8ed2e9696d4532c","boxId":"a0fecd56935f8c729c0810174e67c7e329b414192c5e4b1c668356ba1ad4d965","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 2702.89, \"stakeTime\": \"2022-07-02 15:22:03.047981\"}","type":"EIP-004","decimals":0},{"id":"bdf84104b0bd6900eb13e52f121cae142b1f289970daec4f35cf829ba081fb70","boxId":"333c2e4d60f95de4274c772fdfd277bc92b0e2313a55c7d3f42ca8f849619de2","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 54.57, \"stakeTime\": \"2022-07-02 15:17:16.746548\"}","type":"EIP-004","decimals":0},{"id":"64481389f19ac27696694384592a6205b2d34b2983a8fe5cbbd9a09dd797612f","boxId":"398a948f1356a7dc0914ad00a47e4f863827de2cc29470316d33ec5cd74ab58c","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 17500.0, \"stakeTime\": \"2022-07-02 15:16:23.576166\"}","type":"EIP-004","decimals":0},{"id":"326915b2c54cc496d7ca3eeda8bd6d1319f4549de4be7517a4eed8c1b3019c49","boxId":"95ebfe61abf6b5f28ddb23e6224fd6594d7cb9dbe22f2b8f316add886bf37689","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 146.22, \"stakeTime\": \"2022-07-02 15:12:45.331619\"}","type":"EIP-004","decimals":0},{"id":"a46561959810b76b8339a5d6bbefc0781935bcb386fe671149831128134c27ec","boxId":"c5536fefbb1d49ade590f86d909ce1a844387cfb1cdcf906090709eb8f240ab1","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 5109.489100000001, \"stakeTime\": \"2022-07-02 13:48:34.774000\"}","type":"EIP-004","decimals":0},{"id":"3ff2373758ba9eaf8aefe16fbb001591fb1b1c8780ef5c275c701ad6bf3d0aec","boxId":"dd3ecac9a1d54cbd0febd17a7017941ef458874a138efbe5571bf620eb430ce7","emissionAmount":1,"name":"Bubble Heads #18 EPIC VENOM","description":"EPIC 2/40\n\nBubble Heads is a collection of animated NFT's that have different types of rarity.\n\nhttps://twitter.com/bubbleheadergo\n\nThe holder of this NFT during the snapshot will be entitled to the respective physical artwork for free (excluding shipping costs).","type":"EIP-004","decimals":0},{"id":"55e5d9f23cc23503f2b71be884f7663a90ab7421d3c9a8b7037c3bb36dd97b1c","boxId":"b2fc3cb0796e4bcca07a46bbe82645b8186fb10fbc8a5a2dca1984d14cfe639c","emissionAmount":1000000000,"name":"Raffle_token: Win Ergosaurs #29 : Kushtina","description":"Raffle_token: Win Ergosaurs #29 : Kushtina","type":"EIP-004","decimals":0},{"id":"899bbbcf958a78ea91a4d6056999bc5b6df1321ba3cd939505da1d9687bcce3a","boxId":"82a95a5d367db465e05ca8363ee093a1a49d43d980010d30da438b94286979fe","emissionAmount":1,"name":"Ergonods #4 - Slick Jones \"One\"","description":"Young Slick is a man on a mission. When you feel helpless, and your car has broken down in the middle of nowhere. Have no fear! Slick Jones is just a call away! Wherever you are, just dial!dial!dial! and Slick will be there before you can say cheese! Slick Jones making the town a better place, one repair at a time. \n\nSlick Jones \"One\" - Slick looking sleek in a black leather jacket.","type":"EIP-004","decimals":0},{"id":"26a1acbd43f4e2a0406145ca3338447a0b8c6a32c6c48fe5e3016c5c3741c32b","boxId":"0a2661d3cfdedc217ff3d732a2743a0fc3cd1263a45a73c1a949d354f21036e6","emissionAmount":1,"name":"Ergonods #3 - Mack Yolo \"One\"","description":"Good ol' Mack is a bodyguard for hire by day, and when the sun comes down, you can say hello to the Mack Pack! The town's favourite dancing crew. When you're feeling down. Count on the Mack Pack to dance your worries away! \n\nMack Yolo\"One\"1 - Mack in a striking red suit.","type":"EIP-004","decimals":0},{"id":"72c2a0059a46ffd1ee29ecd97645cb52796f65e4e5d05288f7bea8e72aa29299","boxId":"0050fe7b5f9f08c9b3dd764582868a9ef1aa52bc9e21bcf6722d6bd144477d92","emissionAmount":1,"name":"Ergonods #2 - Zak Rivers \"One\"","description":"Zak is a natural athlete. He loves the sun, and whenever the seas are high, you can count on one thing. The Zakattak! \n\n\nZak Rivers \"One\" - Ready for the sun shirtless Zak.\n","type":"EIP-004","decimals":0},{"id":"8fb395340788cee276f6f9931f3703534448fd5cda051ae9839bcfb6edd7faa7","boxId":"6971b74b5038aba28bbfb77cc11c62e7dda3884fe243bea00ee6f9a6b8a4b78d","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 31923.74, \"stakeTime\": \"2022-07-02 10:06:44.535777\"}","type":"EIP-004","decimals":0},{"id":"8f768f6062db57d48f781437dcda8fc1f65a3c3dc4678b10eaf3ab51e270ee4e","boxId":"b1ed98cf6b514bc95e2ea80d5dc546f055f4cb2bae2b6b5f85177108974391b9","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 1077.18, \"stakeTime\": \"2022-07-02 09:52:15.218240\"}","type":"EIP-004","decimals":0},{"id":"06de634c547531f3b160af56e50893f27f012a4c55fde25d7076690e8f449348","boxId":"0d31b1f1867bf4314ce6e053264cb74dd96f54874c3b079f90315d4bc85ee346","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 11678.8322, \"stakeTime\": \"2022-07-02 09:20:45.664000\"}","type":"EIP-004","decimals":0},{"id":"91cf285ca60ff9e53e18894e47f9ccd93edb96f4faeec6b2f883efc7c1715184","boxId":"d08d966a8900d9a4188cb5167f625145a3a3727d7341e5e34a24dcf0f718b87f","emissionAmount":1,"name":"Ergonods #1 - Rob Tickles \"One\"","description":"Rob Tickles is an entrepreneur. He owns ActiSeasons, the biggest grocery chain in town. He might not look like it but he is a good guy. Well, he has good intentions and means well. \n\n\nRob Tickles \"One\" - Rob looking elegant in a yellow turtleneck.\n\n","type":"EIP-004","decimals":0},{"id":"67ca007696b2d9bc26ca63e5d14ec76c965948f20b2310e9f629fa72db4591f7","boxId":"cc7de067ad6f9ba28b2a584a7fdc061ceaef2b8bc4d30731a0396d8a6e089fbe","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 12000.0, \"stakeTime\": \"2022-07-02 07:44:51.110747\"}","type":"EIP-004","decimals":0},{"id":"59db6f3ca9957de7228686d08e24c8fece6847706874cd0339fac5026c13fb07","boxId":"caa77dbf1c95b1e568e74ee0bfaadc34b4489742fe6773384f6146fb8e195351","emissionAmount":1,"name":"Paideia Stake Key","description":"{\"originalAmountStaked\": 3503.6496, \"stakeTime\": \"2022-07-02 07:14:28.517000\"}","type":"EIP-004","decimals":0},{"id":"0eaa927fa60d82fc642ee33fcc111f7c2aa6bf8e0671ae625d57d8d8d9307aea","boxId":"818de97fdc8590c5aa0a7a31d4a17138801513a9784d1d2ebca9d74688b55a91","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 599.42, \"stakeTime\": \"2022-07-02 06:43:19.303191\"}","type":"EIP-004","decimals":0},{"id":"db6b08cb33ac25edca4d829a2036c01898bb871e4d7501b421b5c1f174dc146d","boxId":"709a8e28bfd4eb5ab366cc80915064934ab3d1635705b494253e88612b937b69","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 10416.7, \"stakeTime\": \"2022-07-02 06:40:08.608219\"}","type":"EIP-004","decimals":0},{"id":"5ba0864540607c9ca01d079c56bd1a882c79cd5f19b2464b8e0ebe27a93966c1","boxId":"2ca64e6103ce2b514d409dec5bb5610c8ca575cdbdf475f8af9f8d8607c18329","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 10000.0, \"stakeTime\": \"2022-07-02 05:05:53.777620\"}","type":"EIP-004","decimals":0},{"id":"d7da4ece2462a4689759a70b6c97f96a9d1b31abe9f61f73573bac908855c650","boxId":"fbe114454adceb053f757a9d127762d8efe0b2cbd9795cda188abe8034d5f574","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 10876.45, \"stakeTime\": \"2022-07-02 03:09:37.228742\"}","type":"EIP-004","decimals":0},{"id":"e340a83fa91b89c3fd118521d0ff32c1ac8a5ca3047f11ce6366d762b48c1571","boxId":"6a10f04a35c46713d7458c7693884314b3918f0644e35960ebe1aeb42593607a","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 491.27, \"stakeTime\": \"2022-07-02 02:53:05.171567\"}","type":"EIP-004","decimals":0},{"id":"238807be9778bb478626553673e618d763e379539c9d8adbdeb51cda05bcc3fd","boxId":"484de8a51cbfafbef17da333463bee4884a449a97d03c19b3f612e48f195d816","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 4724.79, \"stakeTime\": \"2022-07-02 01:32:45.486264\"}","type":"EIP-004","decimals":0},{"id":"bd6f5efcdc3c46cb55f5bb4d827191e33cbe172e0e1b581361993ab720827d7d","boxId":"a8efd99fb1d4c1d13844b0fea19c14d860ee21644dc8959457be7f8b6f06e311","emissionAmount":1,"name":"ClayTale \"Third Ergoversary\" #5","description":"Celebrate Ergo Third Anniversary by making Big Cake with Different delicious sweets | Featuring \"Mr Rokhto\"&\"Mr Finest\" | Original action figures are entirely handmade with plasticine and polymer clay . Artwork by @CryotoKG \n... Link : https://ibb.co/842s6Dm","type":"EIP-004","decimals":0},{"id":"49509f243427db4fe9df34b864817257bf8d90d819eb08ec29be7116cd61dc9b","boxId":"1017e5c3b130849bfdf6dbf3617220c339bd7a8432070bfc0881e3fb4ff61d3f","emissionAmount":1,"name":"ClayTale \"Third Ergoversary\" #4","description":"Celebrate Ergo Third Anniversary by making Big Cake with Different delicious sweets | Featuring \"Mr Cookireto\"&\"Mr Meloni\" | Original action figures are entirely handmade with plasticine and polymer clay . Artwork by @CryotoKG \n... Link : https://ibb.co/HgDg2Km","type":"EIP-004","decimals":0},{"id":"5470974620e2a30988eb33bf2fddcd0271825d02555ffddb33949094fb369d82","boxId":"573b7f22062175cbb15b0423c63e67a6dfbe4b50843e3e945089455d3ce8ad7e","emissionAmount":1,"name":"ClayTale \"Third Ergoversary\" #3","description":"Celebrate Ergo Third Anniversary by making Big Cake with Different delicious sweets | Featuring \"Germo Brown\"&\"Ben Humper\" | Original action figures are entirely handmade with plasticine and polymer clay . Artwork by @CryotoKG \n... Link : https://ibb.co/fxSYFXG","type":"EIP-004","decimals":0},{"id":"69fbf8421e854c4c1ab528222097a7237e4927f480e2ea98c110a4ca6e69d486","boxId":"715b38cd41928e06d4993d114be6010040d917a7a47104c9eb026176da99cbfc","emissionAmount":1,"name":"ClayTale \"Third Ergoversary\" #2","description":"Celebrate Ergo Third Anniversary by making Big Cake with Different delicious sweets | Featuring \"James The BFB\"&\"The Smoker\"&\"Merchant of Happiness\" | Original action figures are entirely handmade with plasticine and polymer clay . Artwork by @CryotoKG \n... Link : https://ibb.co/C9x7k4S","type":"EIP-004","decimals":0},{"id":"5dceaa926373fc0deff0907d49f8723e3a1d630c21716383be44f6d4f2fbcb43","boxId":"c593a507d67c46281ebd25fea67d1eddac9197bbc3f7cfb2580883655141c3cb","emissionAmount":1,"name":"ClayTale \"Third Ergoversary\" #1","description":"Celebrate Ergo Third Anniversary by making Big Cake with Different delicious sweets | Featuring \"Mr Bob Nipples\"&\"Mrs Zozeta\" | Original action figures are entirely handmade with plasticine and polymer clay . Artwork by @CryotoKG \n... Link : https://ibb.co/pQWXgBF","type":"EIP-004","decimals":0},{"id":"b95b332b53a131bbd0532ac71b99d9f0b651a1a2dbee06da279cc78682641829","boxId":"2591a22549d6dcb631f8c7508790ab89d0e3ae0c4e167b86edcb961d953e6b92","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 4166.7, \"stakeTime\": \"2022-07-01 22:53:54.902662\"}","type":"EIP-004","decimals":0},{"id":"a536438c53cef9fe9494b93ef0372b5bd60915202713694660d7eb118a70068e","boxId":"932f40881342b0e62c1908cd2de922ec3652b0ab544d81ffd0656d0469fe8463","emissionAmount":1,"name":"ERGO TOYS #45 - CREATURES SERIES","description":"30 FPS / 120 FRAMES GIF 1200x1100 pixels https://twitter.com/ERGODLIKE","type":"EIP-004","decimals":0},{"id":"6f02a921e30ee0d28bbfa6dbc793b3e984bd8f767098f60f7e29f6d661249ae9","boxId":"7fbe1bc555bcba773b41149acd2bf9315f4887fdf3f28293d9856c7a84269cc0","emissionAmount":1,"name":"Phase 2 NETA Emission Box NFT","description":"Token representing the Phase 2 NETA Emission Box","type":"EIP-004","decimals":0},{"id":"6092699304f8a394175a1a1125cdafec679afe9350e9552c82cd84ac3aa98b20","boxId":"6e86fc1d1efc9e44bb52fd47f61ae81bc967bcd2a9966ac413b4420c5e372cbd","emissionAmount":1,"name":"ergopad Stake Key","description":"{\"originalAmountStaked\": 35073.98, \"stakeTime\": \"2022-07-01 19:43:57.845628\"}","type":"EIP-004","decimals":0}],"total":46337} diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/AddressSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/AddressSpec.scala index 22f2647f..1e4ffb09 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/AddressSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/AddressSpec.scala @@ -28,16 +28,25 @@ class AddressSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyCh } property("Address fromMnemonic") { - val addr = Address.fromMnemonic(NetworkType.TESTNET, mnemonic, SecretString.empty()) + val addr = Address.fromMnemonic(NetworkType.TESTNET, mnemonic, SecretString.empty(), false) addr.toString shouldBe addrStr checkIsTestnetP2PKAddress(addr) - val addr2 = Address.fromMnemonic(NetworkType.MAINNET, mnemonic, SecretString.empty()) + val addr2 = Address.fromMnemonic(NetworkType.MAINNET, mnemonic, SecretString.empty(), false) addr2 shouldNot be (addr) addr2.toString shouldNot be (addrStr) val addr3 = Address.fromErgoTree(addr.getErgoAddress.script, NetworkType.TESTNET) addr3 shouldBe addr + + val addr4 = SigmaProp.createFromAddress(addr).toAddress(NetworkType.TESTNET) + addr4 shouldBe addr + + val addr5 = Address.fromSigmaBoolean(addr.getSigmaBoolean, NetworkType.MAINNET) + addr5 shouldBe addr2 + + val addr6 = new SigmaProp(ErgoValue.of(addr.getSigmaBoolean).getValue).toAddress(NetworkType.TESTNET) + addr6 shouldBe addr } property("Address from ErgoAddress") { @@ -69,12 +78,12 @@ class AddressSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyCh } property("Address createEip3Address") { - val addr = Address.fromMnemonic(NetworkType.MAINNET, mnemonic, SecretString.empty()) - val firstEip3Addr = Address.createEip3Address(0, NetworkType.MAINNET, mnemonic, SecretString.empty()) + val addr = Address.fromMnemonic(NetworkType.MAINNET, mnemonic, SecretString.empty(), false) + val firstEip3Addr = Address.createEip3Address(0, NetworkType.MAINNET, mnemonic, SecretString.empty(), false) firstEip3Addr.toString shouldBe firstEip3AddrStr addr.toString shouldNot be (firstEip3AddrStr) - val secondEip3Addr = Address.createEip3Address(1, NetworkType.MAINNET, mnemonic, SecretString.empty()) + val secondEip3Addr = Address.createEip3Address(1, NetworkType.MAINNET, mnemonic, SecretString.empty(), false) secondEip3Addr.toString shouldBe secondEip3AddrStr Address.fromPropositionBytes(NetworkType.MAINNET, addr.toPropositionBytes) shouldBe addr diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/ApiClientSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/ApiClientSpec.scala index d3c48d0e..fd9748da 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/ApiClientSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/ApiClientSpec.scala @@ -17,7 +17,7 @@ class ApiClientSpec with HttpClientTesting { val seed = SecretString.create("abc") - val masterKey = JavaHelpers.seedToMasterKey(seed) + val masterKey = JavaHelpers.seedToMasterKey(seed, null, false) implicit val vs = ValidationRules.currentSettings property("parse ErgoTree") { diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/AppkitProvingInterpreterSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/AppkitProvingInterpreterSpec.scala new file mode 100644 index 00000000..5a8b75ad --- /dev/null +++ b/appkit/src/test/scala/org/ergoplatform/appkit/AppkitProvingInterpreterSpec.scala @@ -0,0 +1,220 @@ +package org.ergoplatform.appkit + +import org.ergoplatform.appkit.JavaHelpers._ +import org.ergoplatform.{ErgoScriptPredef, ErgoBox, UnsignedErgoLikeTransaction} +import org.ergoplatform.appkit.impl.{BlockchainContextImpl, InputBoxImpl, UnsignedTransactionBuilderImpl, UnsignedTransactionImpl} +import org.ergoplatform.settings.ErgoAlgos +import sigmastate.helpers.NegativeTesting +import org.scalatest.{Matchers, PropSpec} +import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks +import sigmastate.TestsBase +import sigmastate.eval.Colls +import sigmastate.helpers.TestingHelpers.createBox + +import java.util +import java.util.Collections +import util.{List => JList} + +class AppkitProvingInterpreterSpec extends PropSpec + with Matchers + with ScalaCheckDrivenPropertyChecks + with AppkitTestingCommon + with HttpClientTesting + with NegativeTesting + with TestsBase { + + val oneErg = 1000L * 1000 * 1000 + + def createBoxOps(ctx: BlockchainContext, prover: ErgoProver, inputs: IndexedSeq[ErgoBox]) = { + val ops = new BoxOperations(ctx, Collections.singletonList(prover.getAddress), prover) { + override def loadTop(): util.List[InputBox] = { + val is = inputs.map(b => new InputBoxImpl(b): InputBox) + .convertTo[JList[InputBox]] + is + } + } + ops.withAmountToSpend(oneErg * 2) + } + + /** This method creates an UnsignedTransaction instance directly bypassing builders and + * their consistency logic. This allows to create invalid transactions for the tests + * below. + */ + def createUnsignedTransaction( + ctx: BlockchainContext, prover: ErgoProver, + inputs: IndexedSeq[ErgoBox], + outputs: IndexedSeq[ErgoBox], + tokensToBurn: IndexedSeq[ErgoToken] + ) = { + val txB = ctx.newTxBuilder().asInstanceOf[UnsignedTransactionBuilderImpl] + val stateContext = txB.createErgoLikeStateContext + val changeAddress = prover.getAddress.getErgoAddress + + val boxesToSpend = inputs + .map(b => new InputBoxImpl(b)) + .map(b => ExtendedInputBox(b.getErgoBox, b.getExtension)) + .convertTo[util.List[ExtendedInputBox]] + val boxesToSpendSeq = JavaHelpers.toIndexedSeq(boxesToSpend) + val tx = new UnsignedErgoLikeTransaction( + inputs = boxesToSpendSeq.map(_.toUnsignedInput), + dataInputs = IndexedSeq(), + outputCandidates = outputs + ) + val unsigned = new UnsignedTransactionImpl( + tx, boxesToSpend, new util.ArrayList[ErgoBox](), changeAddress, stateContext, + ctx.asInstanceOf[BlockchainContextImpl], tokensToBurn.convertTo[JList[ErgoToken]]) + unsigned + } + + property("rejecting transaction with unbalanced tokens") { + val ergoClient = createMockedErgoClient(MockData(Nil, Nil)) + ergoClient.execute { ctx: BlockchainContext => + val prover = ctx.newProverBuilder() + .withMnemonic(mnemonic, SecretString.empty(), false) + .build() + val tree1 = ErgoScriptPredef.TrueProp(ergoTreeHeaderInTests) + val tree2 = ErgoScriptPredef.FalseProp(ergoTreeHeaderInTests) + val token1 = (ErgoAlgos.hash("id1"), 10L) + val token2 = (ErgoAlgos.hash("id2"), 20L) + val ergoToken1 = Iso.isoErgoTokenToPair.from(token1) + val ergoToken2 = Iso.isoErgoTokenToPair.from(token2) + + val input1 = createBox(oneErg + Parameters.MinFee, tree1, additionalTokens = Seq(token1)) + val input2 = createBox(oneErg, tree2, additionalTokens = Seq(token2)) + + // successful reduction with balanced tokens + { + val ops = createBoxOps(ctx, prover, IndexedSeq(input1, input2)) + val tokens = new util.ArrayList[ErgoToken]() + tokens.add(ergoToken1) + tokens.add(ergoToken2) + val unsigned = ops + .withTokensToSpend(tokens) + .putToContractTxUnsigned(address.toErgoContract) + val reduced = prover.reduce(unsigned, 0) + reduced.getInputBoxesIds.size() shouldBe 2 + reduced.getOutputs.size() shouldBe 2 // output + feeOut + } + + // Transaction tries to burn tokens when no burning was requested + { + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1)) + val unsigned = createUnsignedTransaction(ctx, prover, IndexedSeq(input1, input2), IndexedSeq(output1), IndexedSeq.empty) + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]("Transaction tries to burn tokens when no burning was requested") + cond1(e) && e.tokensDiff.exists(t => t == (Colls.fromArray(token2._1), -token2._2)) + case _ => false + } + ) + } + + // Transaction tries to burn tokens when no burning was requested + { + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1, token2.copy(_2 = 10))) + val unsigned = createUnsignedTransaction(ctx, prover, IndexedSeq(input1, input2), IndexedSeq(output1), IndexedSeq.empty) + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]("Transaction tries to burn tokens when no burning was requested") + cond1(e) && e.tokensDiff.exists(t => t == (Colls.fromArray(token2._1), -10)) + case _ => false + } + ) + } + + // Transaction tries to burn tokens when no burning was requested + // Inputs: (note, same token in two boxes) + // Box1: Token1, Amount1 + // Box2: Token1. Amount2 + // + // Outputs: + // Box1: Token1, Amount1 + { + // another input with the same token as input1 + val input2_with_token1 = createBox(oneErg, tree2, additionalTokens = Seq(token1.copy(_2 = 20))) + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1)) + + val unsigned = createUnsignedTransaction(ctx, prover, + IndexedSeq(input1, input2_with_token1), + IndexedSeq(output1), tokensToBurn = IndexedSeq.empty) + + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]("Transaction tries to burn tokens when no burning was requested") + cond1(e) && e.tokensDiff.exists(t => t == (Colls.fromArray(token1._1), -20)) + case _ => false + } + ) + } + + // invalid burning even when burning was requested + { + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1, token2.copy(_2 = 10))) + val unsigned = createUnsignedTransaction(ctx, prover, + IndexedSeq(input1, input2), IndexedSeq(output1), + tokensToBurn = IndexedSeq(ergoToken1)) + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]( + "Transaction tries to burn tokens, but not how it was requested") + val ok = cond1(e) + val token2_BurningWasNotRequested = e.tokensDiff.exists(t => t == (Colls.fromArray(token2._1), 10)) + val token1_WasRequestedButNotBurned = e.tokensDiff.exists(t => t == (Colls.fromArray(token1._1), -10)) + ok && token2_BurningWasNotRequested && token1_WasRequestedButNotBurned + case _ => false + } + ) + } + + // attempt to mint more than 1 token + { + val input1 = createBox(oneErg, tree1) // no tokens + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1, token2)) + val unsigned = createUnsignedTransaction(ctx, prover, + IndexedSeq(input1), IndexedSeq(output1), tokensToBurn = IndexedSeq.empty) + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]( + "Only one token can be minted in a transaction") + val ok = cond1(e) + val token1_mint_attempted = e.tokensDiff.exists(t => t == (Colls.fromArray(token1._1), token1._2)) + val token2_mint_attempted = e.tokensDiff.exists(t => t == (Colls.fromArray(token2._1), token2._2)) + ok && token1_mint_attempted && token2_mint_attempted && e.tokensDiff.length == 2 + case _ => false + } + ) + } + + // attempt to mint 1 token but with invalid id + { + val input1 = createBox(oneErg, tree1) // no tokens + val output1 = createBox(oneErg * 2 + Parameters.MinFee, tree1, additionalTokens = Seq(token1)) + val unsigned = createUnsignedTransaction(ctx, prover, + IndexedSeq(input1), IndexedSeq(output1), tokensToBurn = IndexedSeq.empty) + assertExceptionThrown( + prover.reduce(unsigned, 0), + { + case e: TokenBalanceException => + val cond1 = exceptionLike[TokenBalanceException]( + "Cannot mint a token with invalid id") + val ok = cond1(e) + val token1_mint_attempted = e.tokensDiff.exists(t => t == (Colls.fromArray(token1._1), token1._2)) + ok && token1_mint_attempted && e.tokensDiff.length == 1 + case _ => false + } + ) + } + + } + } +} diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/Bip32SerializationSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/Bip32SerializationSpec.scala index b8d1c72c..381e3d21 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/Bip32SerializationSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/Bip32SerializationSpec.scala @@ -9,7 +9,7 @@ class Bip32SerializationSpec extends PropSpec with Matchers with ScalaCheckDrive with AppkitTesting { property("Serialization roundtrip") { - val masterKey = JavaHelpers.seedToMasterKey(mnemonic, SecretString.empty()) + val masterKey = JavaHelpers.seedToMasterKey(mnemonic, SecretString.empty(), false) val xpubString = Bip32Serialization.serializeExtendedPublicKeyToHex(masterKey, NetworkType.MAINNET) an[IllegalArgumentException] shouldBe thrownBy { diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/ChangeOutputSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/ChangeOutputSpec.scala index cedf4e7b..a405c070 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/ChangeOutputSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/ChangeOutputSpec.scala @@ -123,10 +123,10 @@ class ChangeOutputSpec extends PropSpec with Matchers ergoClient.execute { ctx: BlockchainContext => - val input0 = ctx.newTxBuilder.outBoxBuilder.registers( - ErgoValue.of(gY), ErgoValue.of(gXY) - ).value(30000000).contract(ctx.compileContract( - ConstantsBuilder.empty(), + val input0 = ctx.newTxBuilder.outBoxBuilder + .registers(ErgoValue.of(gY), ErgoValue.of(gXY)) + .value(30000000) + .contract(ctx.compileContract(ConstantsBuilder.empty(), """{ | val gY = SELF.R4[GroupElement].get | val gXY = SELF.R5[GroupElement].get @@ -146,7 +146,7 @@ class ChangeOutputSpec extends PropSpec with Matchers val txB = ctx.newTxBuilder().preHeader(ph) // for issuing token val tokenBox = txB.outBoxBuilder .value(15000000) // value of token box, doesn't really matter - .tokens(new ErgoToken(tokenId, tokenAmount)) // amount of token issuing + .tokens(new ErgoToken(tokenId, tokenAmount)) // mint a token with the given amount .contract(ctx.compileContract( // contract of the box containing tokens, just has to be spendable ConstantsBuilder.empty(), "{sigmaProp(1 < 2)}" diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/ErgoAuthSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/ErgoAuthSpec.scala index 8aafcdaf..27254c83 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/ErgoAuthSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/ErgoAuthSpec.scala @@ -25,7 +25,7 @@ class ErgoAuthSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyC val signature = new ColdErgoClient(address.getNetworkType, Parameters.ColdClientMaxBlockCost) .execute { ctx: BlockchainContext => - val prover = ctx.newProverBuilder().withMnemonic(mnemonic, SecretString.empty()).build() + val prover = ctx.newProverBuilder().withMnemonic(mnemonic, SecretString.empty(), false).build() prover.signMessage(SigmaProp.parseFromBytes(serializedSigmaBoolean), signedMessage.getBytes(StandardCharsets.UTF_8), HintsBag.empty) diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/MnemonicSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/MnemonicSpec.scala index e038a4b2..b3796172 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/MnemonicSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/MnemonicSpec.scala @@ -38,7 +38,7 @@ class MnemonicSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyC } property("serializeExtendedPublicKey") { - val masterKey = JavaHelpers.seedToMasterKey(SecretString.create("lens stadium egg cage hollow noble gate belt impulse vicious middle endless angry buzz crack"), SecretString.empty()) + val masterKey = JavaHelpers.seedToMasterKey(SecretString.create("lens stadium egg cage hollow noble gate belt impulse vicious middle endless angry buzz crack"), SecretString.empty(), false) Bip32Serialization.serializeExtendedPublicKeyToHex(masterKey, NetworkType.MAINNET) shouldBe "0488b21e04220c2217000000009216e49a70865823eff5381d6fd33ac96743af1f3051dc4cc8edd66a29a740860326cfc301b0c8d4d815ac721e0551304417e6133c2c9137f9f22c33895a3e1650" } diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/TxBuilderSpec.scala b/appkit/src/test/scala/org/ergoplatform/appkit/TxBuilderSpec.scala index 8e7ee8ea..21c84c74 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/TxBuilderSpec.scala +++ b/appkit/src/test/scala/org/ergoplatform/appkit/TxBuilderSpec.scala @@ -1,12 +1,18 @@ package org.ergoplatform.appkit -import org.ergoplatform.appkit.InputBoxesSelectionException.NotEnoughErgsException +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import org.ergoplatform.appkit.InputBoxesSelectionException.{InputBoxLimitExceededException, NotEnoughErgsException} +import org.ergoplatform.appkit.JavaHelpers._ +import org.ergoplatform.appkit.examples.RunMockedScala.data import org.ergoplatform.appkit.impl.{Eip4TokenBuilder, ErgoTreeContract} import org.ergoplatform.appkit.testing.AppkitTesting +import org.ergoplatform.explorer.client.model.{Items, TokenInfo} import org.ergoplatform.{ErgoBox, ErgoScriptPredef} import org.scalacheck.Gen import org.scalatest.{Matchers, PropSpec} import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks +import scalan.util.FileUtil import scorex.util.ModifierId import sigmastate.eval.CBigInt import sigmastate.helpers.NegativeTesting @@ -14,7 +20,10 @@ import sigmastate.interpreter.HintsBag import java.io.File import java.math.BigInteger +import java.util import java.util.Arrays +import java.util.function.Consumer +import scala.collection.JavaConversions class TxBuilderSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyChecks @@ -43,6 +52,13 @@ class TxBuilderSpec extends PropSpec with Matchers |}""".stripMargin) } + def loadStorageE2(): (SecretStorage, util.List[Address]) = { + val storage = SecretStorage.loadFrom("storage/E2.json") + storage.unlock("abc") + val senders = Arrays.asList(storage.getAddressFor(NetworkType.MAINNET)) + (storage, senders) + } + property("ContextVar id should be in range") { for (id <- 0 to Byte.MaxValue) { ContextVar.of(id.toByte, 10) @@ -63,7 +79,7 @@ class TxBuilderSpec extends PropSpec with Matchers property("Sign and Verify a message round trip") { forAll(Gen.alphaNumStr){ msg => - val ergoClient = createMockedErgoClient(MockData(Nil, Nil)) + val ergoClient = createMockedErgoClient(MockData(Nil, Nil)) ergoClient.execute { ctx: BlockchainContext => val proverA = BoxOperations.createProver(ctx, new File("storage/E2.json").getPath, "abc") @@ -155,7 +171,7 @@ class TxBuilderSpec extends PropSpec with Matchers signed.getOutputsToSpend.size() shouldBe 2 } } - + property("non-standard fee contract") { val ergoClient = createMockedErgoClient(MockData(Nil, Nil)) ergoClient.execute { ctx: BlockchainContext => @@ -205,7 +221,7 @@ class TxBuilderSpec extends PropSpec with Matchers assertExceptionThrown( ergoClient.execute { ctx: BlockchainContext => ctx.newProverBuilder() - .withMnemonic(mnemonic, SecretString.empty()) + .withMnemonic(mnemonic, SecretString.empty(), false) .withEip3Secret(0) .withEip3Secret(0) // attempt to add the same index .build() @@ -217,14 +233,14 @@ class TxBuilderSpec extends PropSpec with Matchers private def testEip3Address(ctx: BlockchainContext, index: Int): Address = { Address.createEip3Address(index, ctx.getNetworkType, - mnemonic, SecretString.empty()) + mnemonic, SecretString.empty(), false) } property("ErgoProverBuilder.withEip3Secret should pass secrets to the prover") { val ergoClient = createMockedErgoClient(MockData(Nil, Nil)) ergoClient.execute { ctx: BlockchainContext => val prover = ctx.newProverBuilder() - .withMnemonic(mnemonic, SecretString.empty()) + .withMnemonic(mnemonic, SecretString.empty(), false) .withEip3Secret(0) .withEip3Secret(1) .build() @@ -265,15 +281,12 @@ class TxBuilderSpec extends PropSpec with Matchers val ergoClient = createMockedErgoClient(data) val reducedTx: ReducedTransaction = ergoClient.execute { ctx: BlockchainContext => - val storage = SecretStorage.loadFrom("storage/E2.json") - storage.unlock("abc") - + val (_, senders) = loadStorageE2() val recipient = address + val pkContract = recipient.toErgoContract val amountToSend = 1000000 - val pkContract = recipient.toErgoContract - val senders = Arrays.asList(storage.getAddressFor(NetworkType.MAINNET)) val unsigned = BoxOperations.createForSenders(senders, ctx) .withAmountToSpend(amountToSend) .withMessage("Test message") @@ -337,18 +350,14 @@ class TxBuilderSpec extends PropSpec with Matchers a[NotEnoughErgsException] shouldBe thrownBy { ergoClient.execute { ctx: BlockchainContext => - val storage = SecretStorage.loadFrom("storage/E2.json") - storage.unlock("abc") - - val recipient = address + val (_, senders) = loadStorageE2() + val recipientContract = address.toErgoContract val amountToSend = 1000000 - val pkContract = recipient.toErgoContract - - val senders = Arrays.asList(storage.getAddressFor(NetworkType.MAINNET)) - val unsigned = BoxOperations.createForSenders(senders, ctx).withAmountToSpend(amountToSend) + val unsigned = BoxOperations.createForSenders(senders, ctx) + .withAmountToSpend(amountToSend) .withInputBoxesLoader(new ExplorerAndPoolUnspentBoxesLoader()) - .putToContractTxUnsigned(pkContract) + .putToContractTxUnsigned(recipientContract) val prover = ctx.newProverBuilder.build // prover without secrets val reduced = prover.reduce(unsigned, 0) @@ -363,16 +372,12 @@ class TxBuilderSpec extends PropSpec with Matchers val ergoClient = createMockedErgoClient(data) ergoClient.execute { ctx: BlockchainContext => - val storage = SecretStorage.loadFrom("storage/E2.json") - storage.unlock("abc") - + val (_, senders) = loadStorageE2() val recipient = address + val pkContract = recipient.toErgoContract // send 1 ERG val amountToSend = 1000L * 1000 * 1000 - val pkContract = recipient.toErgoContract - - val senders = Arrays.asList(storage.getAddressFor(NetworkType.MAINNET)) // first box: 1 ERG + tx fee + token that will cause a change val input1 = ctx.newTxBuilder.outBoxBuilder @@ -386,13 +391,80 @@ class TxBuilderSpec extends PropSpec with Matchers .contract(pkContract) .build().convertToInputWith(mockTxId, 1) - val operations = BoxOperations.createForSenders(senders, ctx).withAmountToSpend(amountToSend) + val operations = BoxOperations.createForSenders(senders, ctx) + .withAmountToSpend(amountToSend) .withTokensToSpend(Arrays.asList(new ErgoToken(mockTxId, 1))) .withInputBoxesLoader(new MockedBoxesLoader(Arrays.asList(input1, input2))) val inputsSelected = operations.loadTop() // both boxes should be selected inputsSelected.size() shouldBe 2 + + // if we restrict to a single box, we face InputBoxLimitExceededException + assertExceptionThrown( + operations.withMaxInputBoxesToSelect(1).loadTop(), + exceptionLike[InputBoxLimitExceededException]("could not cover 1000000 nanoERG") + ) + } + + } + + property("Test changebox token amount max 100") { + val ergoClient = createMockedErgoClient(data) + + val tokenList: Items[TokenInfo] = new Gson().fromJson(FileUtil.read(FileUtil.file(s"appkit/src/test/resources/tokens.json")), new TypeToken[Items[TokenInfo]]() {}.getType) + + ergoClient.execute { ctx: BlockchainContext => + val (storage, _) = loadStorageE2() + + val recipient = address + + // send 1 ERG + val amountToSend = 1000L * 1000 * 1000 + val pkContract = recipient.toErgoContract + + val senders = Arrays.asList(storage.getAddressFor(NetworkType.MAINNET)) + + val ergoTokens = tokenList.getItems + .convertTo[IndexedSeq[TokenInfo]] + .map { ti => new ErgoToken(ti.getId, ti.getEmissionAmount) } + + val tokenList1 = ergoTokens.take(150) + val tokenList2 = ergoTokens.takeRight(110) + // first box: 1 ERG + tx fee + token that will cause a change + val input1 = ctx.newTxBuilder.outBoxBuilder + .value(amountToSend + Parameters.MinFee) + .contract(pkContract) + .tokens(tokenList1:_*) + .build().convertToInputWith(mockTxId, 0) + // second box: enough ERG for the change box + val input2 = ctx.newTxBuilder.outBoxBuilder + .value(amountToSend + Parameters.MinFee) + .tokens(tokenList2:_*) + .contract(pkContract) + .build().convertToInputWith(mockTxId, 1) + + val operations = BoxOperations.createForSenders(senders, ctx) + .withAmountToSpend(amountToSend) + .withInputBoxesLoader(new MockedBoxesLoader(Arrays.asList(input1, input2))) + val unsigned = operations.putToContractTxUnsigned(pkContract) + + // all outputs should have 100 tokens at max, and it should contain all input tokens + unsigned.getOutputs.forEach { output: OutBox => + output.getTokens.size() <= 100 shouldBe true + + output.getTokens.forEach(new Consumer[ErgoToken] { + override def accept(outToken: ErgoToken): Unit = { + // we know that ergoTokens list does not contain multiple entries for a single token, so + // we can use this simplified check here + ergoTokens.count(_ == outToken) shouldBe 1 + } + }) + } + val outTokenNum = unsigned.getOutputs + .map(_.getTokens.size()) + .convertTo[IndexedSeq[Int]].sum + (tokenList1.length + tokenList2.length) shouldBe outTokenNum } } diff --git a/appkit/src/test/scala/org/ergoplatform/appkit/examples/ExampleScenarios.java b/appkit/src/test/scala/org/ergoplatform/appkit/examples/ExampleScenarios.java index 18ab4c9f..3a0f4039 100644 --- a/appkit/src/test/scala/org/ergoplatform/appkit/examples/ExampleScenarios.java +++ b/appkit/src/test/scala/org/ergoplatform/appkit/examples/ExampleScenarios.java @@ -81,7 +81,7 @@ public SignedTransaction prepareBox( .build()) .build(); ErgoProverBuilder proverB = _ctx.newProverBuilder(); - ErgoProver prover = proverB.withMnemonic(seedPhrase, null).build(); + ErgoProver prover = proverB.withMnemonic(seedPhrase, null, false).build(); SignedTransaction signed = prover.sign(tx); return signed; } diff --git a/build.sbt b/build.sbt index e0287684..f4b2e71b 100644 --- a/build.sbt +++ b/build.sbt @@ -126,8 +126,8 @@ assemblyMergeStrategy in assembly := { lazy val allConfigDependency = "compile->compile;test->test" -val sigmaStateVersion = "4.0.5" -val ergoWalletVersion = "4.0.27" +val sigmaStateVersion = "4.0.7" +val ergoWalletVersion = "4.0.104" lazy val sigmaState = ("org.scorexfoundation" %% "sigma-state" % sigmaStateVersion).force() .exclude("ch.qos.logback", "logback-classic") .exclude("org.scorexfoundation", "scrypto") diff --git a/common/src/main/java/org/ergoplatform/appkit/Address.java b/common/src/main/java/org/ergoplatform/appkit/Address.java index 48938b31..d269be8b 100644 --- a/common/src/main/java/org/ergoplatform/appkit/Address.java +++ b/common/src/main/java/org/ergoplatform/appkit/Address.java @@ -184,8 +184,8 @@ public static Address fromPropositionBytes(NetworkType networkType, byte[] propo ).toAddress(); } - public static Address fromMnemonic(NetworkType networkType, Mnemonic mnemonic) { - return fromMnemonic(networkType, mnemonic.getPhrase(), mnemonic.getPassword()); + public static Address fromMnemonic(NetworkType networkType, Mnemonic mnemonic, Boolean usePre1627KeyDerivation) { + return fromMnemonic(networkType, mnemonic.getPhrase(), mnemonic.getPassword(), usePre1627KeyDerivation); } /** @@ -197,10 +197,12 @@ public static Address fromMnemonic(NetworkType networkType, Mnemonic mnemonic) { * @param mnemonic mnemonic (e.g. 15 words) phrase * @param mnemonicPass optional (i.e. it can be empty) mnemonic password which is * necessary to know in order to restore the secrets + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be false for new + * wallets, and true for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) */ public static Address fromMnemonic( - NetworkType networkType, SecretString mnemonic, SecretString mnemonicPass) { - ExtendedSecretKey masterKey = JavaHelpers.seedToMasterKey(mnemonic, mnemonicPass); + NetworkType networkType, SecretString mnemonic, SecretString mnemonicPass, Boolean usePre1627KeyDerivation) { + ExtendedSecretKey masterKey = JavaHelpers.seedToMasterKey(mnemonic, mnemonicPass, usePre1627KeyDerivation); DLogProtocol.ProveDlog pk = masterKey.publicImage(); P2PKAddress p2pkAddress = JavaHelpers.createP2PKAddress(pk, networkType.networkPrefix); @@ -218,13 +220,16 @@ public static Address fromMnemonic( * @param mnemonic mnemonic (e.g. 15 words) phrase * @param mnemonicPass optional (i.e. it can be empty) mnemonic password which is * necessary to know in order to restore the secrets + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be false for new + * wallets, and true for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) */ public static Address createEip3Address( int index, NetworkType networkType, SecretString mnemonic, - SecretString mnemonicPass) { - ExtendedSecretKey rootSecret = JavaHelpers.seedToMasterKey(mnemonic, mnemonicPass); + SecretString mnemonicPass, + Boolean usePre1627KeyDerivation) { + ExtendedSecretKey rootSecret = JavaHelpers.seedToMasterKey(mnemonic, mnemonicPass, usePre1627KeyDerivation); // Let's use "m/44'/429'/0'/0/index" path (this path is compliant with EIP-3 which // is BIP-44 for Ergo) @@ -263,6 +268,11 @@ public static Address fromErgoTree(Values.ErgoTree ergoTree, NetworkType network return new Address(ergoAddress); } + public static Address fromSigmaBoolean(Values.SigmaBoolean sigmaBoolean, NetworkType networkType) { + Values.ErgoTree ergoTree = JavaHelpers$.MODULE$.toErgoTree(sigmaBoolean); + return fromErgoTree(ergoTree, networkType); + } + @Override public String toString() { return _address.toString(); diff --git a/common/src/main/java/org/ergoplatform/appkit/AppkitProvingInterpreter.scala b/common/src/main/java/org/ergoplatform/appkit/AppkitProvingInterpreter.scala index a7d1f6fe..627001a4 100644 --- a/common/src/main/java/org/ergoplatform/appkit/AppkitProvingInterpreter.scala +++ b/common/src/main/java/org/ergoplatform/appkit/AppkitProvingInterpreter.scala @@ -5,24 +5,24 @@ import org.ergoplatform.wallet.interpreter.ErgoInterpreter import sigmastate.basics.DLogProtocol.{ProveDlog, DLogProverInput} import java.util -import java.util.{List => JList} -import org.ergoplatform.ErgoBox.TokenId +import java.util.{Objects, List => JList} import org.ergoplatform.wallet.secrets.ExtendedSecretKey import sigmastate.basics.{SigmaProtocolCommonInput, DiffieHellmanTupleProverInput, SigmaProtocol, SigmaProtocolPrivateInput} import org.ergoplatform._ +import org.ergoplatform.appkit.JavaHelpers.{TokenColl, subtractTokenColls} import org.ergoplatform.utils.ArithUtils import org.ergoplatform.wallet.protocol.context.{ErgoLikeStateContext, ErgoLikeParameters, TransactionContext} -import scorex.crypto.authds.ADKey import sigmastate.Values.{SigmaBoolean, ErgoTree} import scala.util.Try -import sigmastate.eval.{IRContext, CompiletimeIRContext} -import sigmastate.interpreter.Interpreter.{ReductionResult, ScriptEnv, error} -import sigmastate.interpreter.{Interpreter, CostedProverResult, InterpreterContext, PrecompiledScriptProcessor, ContextExtension, ProverInterpreter, HintsBag} +import sigmastate.eval.CompiletimeIRContext +import sigmastate.interpreter.Interpreter.{ReductionResult, ScriptEnv} +import sigmastate.interpreter.{Interpreter, CostedProverResult, ContextExtension, ProverInterpreter, HintsBag} import sigmastate.lang.exceptions.CostLimitException import sigmastate.serialization.SigmaSerializer import sigmastate.utxo.CostTable -import sigmastate.utils.Helpers._ +import special.collection.ExtensionMethods.PairCollOps +import sigmastate.utils.Helpers._ // for Scala 2.11 import sigmastate.utils.{SigmaByteWriter, SigmaByteReader} import spire.syntax.all.cfor import scalan.util.Extensions.LongOps @@ -74,8 +74,13 @@ class AppkitProvingInterpreter( } /** Reduces and signs the given transaction. + * * @note requires `unsignedTx` and `boxesToSpend` have the same boxIds in the same order. - * @param baseCost the cost accumulated before this transaction + * @param boxesToSpend input boxes of the transaction + * @param dataBoxes data inputs of the transaction + * @param stateContext state context of the blockchain in which the transaction should be signed + * @param baseCost the cost accumulated before this transaction + * @param tokensToBurn requested tokens to be burnt in the transaction, if empty no burning allowed * @return a new signed transaction with all inputs signed and the cost of this transaction * The returned cost doesn't include `baseCost`. */ @@ -83,11 +88,12 @@ class AppkitProvingInterpreter( boxesToSpend: IndexedSeq[ExtendedInputBox], dataBoxes: IndexedSeq[ErgoBox], stateContext: ErgoLikeStateContext, - baseCost: Int): Try[(ErgoLikeTransaction, Int)] = Try { + baseCost: Int, + tokensToBurn: JList[ErgoToken]): Try[(ErgoLikeTransaction, Int)] = Try { val maxCost = params.maxBlockCost var currentCost: Long = baseCost - val (reducedTx, txCost) = reduceTransaction(unsignedTx, boxesToSpend, dataBoxes, stateContext, baseCost) + val (reducedTx, txCost) = reduceTransaction(unsignedTx, boxesToSpend, dataBoxes, stateContext, baseCost, tokensToBurn) currentCost = addCostLimited(currentCost, txCost, maxCost, msg = reducedTx.toString()) val (signedTx, cost) = signReduced(reducedTx, currentCost.toInt) @@ -95,24 +101,61 @@ class AppkitProvingInterpreter( } /** Reduce inputs of the given unsigned transaction to provable sigma propositions using - * the given context. See [[ReducedErgoLikeTransaction]] for details. - * - * @note requires `unsignedTx` and `boxesToSpend` have the same boxIds in the same order. - * @param baseCost the cost accumulated so far and before this operation - * @return a new reduced transaction with all inputs reduced and the cost of this transaction - * The returned cost doesn't include (so they need to be added back to get the total cost): - * 1) `baseCost` - * 2) reduction cost for each input. - */ + * the given context. See [[ReducedErgoLikeTransaction]] for details. + * + * @note requires `unsignedTx` and `boxesToSpend` have the same boxIds in the same order. + * @param boxesToSpend input boxes of the transaction + * @param dataBoxes data inputs of the transaction + * @param stateContext state context of the blockchain in which the transaction should be signed + * @param baseCost the cost accumulated so far and before this operation + * @param tokensToBurn requested tokens to be burnt in the transaction, if empty no burning allowed + * @return a new reduced transaction with all inputs reduced and the cost of this transaction + * The returned cost doesn't include (so they need to be added back to get the total cost): + * 1) `baseCost` + * 2) reduction cost for each input. + */ def reduceTransaction( unsignedTx: UnsignedErgoLikeTransaction, boxesToSpend: IndexedSeq[ExtendedInputBox], dataBoxes: IndexedSeq[ErgoBox], stateContext: ErgoLikeStateContext, - baseCost: Int): (ReducedErgoLikeTransaction, Int) = { + baseCost: Int, + tokensToBurn: JList[ErgoToken]): (ReducedErgoLikeTransaction, Int) = { if (unsignedTx.inputs.length != boxesToSpend.length) throw new Exception("Not enough boxes to spend") if (unsignedTx.dataInputs.length != dataBoxes.length) throw new Exception("Not enough data boxes") + val inputTokens = boxesToSpend.flatMap(_.box.additionalTokens.toArray) + val outputTokens = unsignedTx.outputCandidates.flatMap(_.additionalTokens.toArray) + val tokenDiff = JavaHelpers.subtractTokens(outputTokens, inputTokens) + if (tokenDiff.nonEmpty) { + val (toBurn, toMint) = tokenDiff.partition(_._2 < 0) // those with negative diff are to be burnt + if (toBurn.nonEmpty) { + if (!tokensToBurn.isEmpty) { + val requestedToBurn = isoTokensListToTokenColl.to(tokensToBurn) + val diff = JavaHelpers.subtractTokenColls( + reducedTokens = toBurn.mapSecond(v => -v), // make positive amounts + subtractedTokens = requestedToBurn + ) + if (diff.nonEmpty) { // empty diff would mean equality + throw TokenBalanceException( + "Transaction tries to burn tokens, but not how it was requested", diff) + } + } else { + throw TokenBalanceException( + "Transaction tries to burn tokens when no burning was requested", tokenDiff) + } + } + if (toMint.nonEmpty) { + if (toMint.length > 1) { + throw TokenBalanceException("Only one token can be minted in a transaction", toMint) + } + val isCorrectMintedTokenId = Objects.deepEquals(toMint(0)._1.toArray, boxesToSpend.head.box.id) + if (!isCorrectMintedTokenId) { + throw TokenBalanceException("Cannot mint a token with invalid id", toMint) + } + } + } + // Cost of transaction initialization: we should read and parse all inputs and data inputs, // and also iterate through all outputs to check rules val initialCost = ArithUtils.addExact( @@ -247,6 +290,14 @@ class AppkitProvingInterpreter( } +/** Thrown during transaction signing when inputs token are not balanced with output tokens. + * @param tokensDiff balance difference which caused the error + */ +case class TokenBalanceException( + message: String, + tokensDiff: TokenColl +) extends Exception(s"Input and output tokens are not balanced: $message") + /** Represents data necessary to sign an input of an unsigend transaction. * @param reductionResult result of reducing input script to a sigma proposition * @param extension context extensions (aka context variables) used by script and which diff --git a/common/src/main/java/org/ergoplatform/appkit/ErgoType.java b/common/src/main/java/org/ergoplatform/appkit/ErgoType.java index b4352b0e..479fc003 100644 --- a/common/src/main/java/org/ergoplatform/appkit/ErgoType.java +++ b/common/src/main/java/org/ergoplatform/appkit/ErgoType.java @@ -26,7 +26,7 @@ public class ErgoType { private static ErgoType _avlTree = new ErgoType(JavaHelpers.AvlTreeRType()); private static ErgoType _box = new ErgoType(JavaHelpers.BoxRType()); private static ErgoType
_header = new ErgoType(JavaHelpers.HeaderRType()); - private static ErgoType _preHeader = new ErgoType(JavaHelpers.PreHeaderRType()); + private static ErgoType _preHeader = new ErgoType(JavaHelpers.PreHeaderRType()); public RType getRType() { return _rtype; @@ -51,6 +51,11 @@ public boolean equals(Object obj) { return (obj instanceof ErgoType) && Objects.equals(_rtype, ((ErgoType)obj)._rtype); } + @Override + public String toString() { + return "ErgoType(" + _rtype.name() + ")"; + } + static public ErgoType byteType() { return _byte; } static public ErgoType shortType() { return _short; } @@ -75,7 +80,7 @@ public boolean equals(Object obj) { static public ErgoType
headerType() { return _header; } - static public ErgoType preHeaderType() { return _preHeader; } + static public ErgoType preHeaderType() { return _preHeader; } static public ErgoType> pairType(ErgoType tA, ErgoType tB) { return new ErgoType<>(RType.pairRType(tA._rtype, tB._rtype)); @@ -85,7 +90,7 @@ static public ErgoType> collType(ErgoType tItem) { return new ErgoType<>(JavaHelpers.collRType(tItem._rtype)); } - static public ErgoType> optionType(ErgoType tItem) { - return new ErgoType<>(RType.optionRType(tItem._rtype)); + static public ErgoType ofRType(RType rtype) { + return new ErgoType<>(rtype); } } diff --git a/common/src/main/java/org/ergoplatform/appkit/ErgoValue.java b/common/src/main/java/org/ergoplatform/appkit/ErgoValue.java index 81d418fe..dad25752 100644 --- a/common/src/main/java/org/ergoplatform/appkit/ErgoValue.java +++ b/common/src/main/java/org/ergoplatform/appkit/ErgoValue.java @@ -69,6 +69,11 @@ public boolean equals(Object obj) { return false; } + @Override + public String toString() { + return "ErgoValue(" + _value.toString() + ", " + _type.toString() + ")"; + } + static public ErgoValue of(byte value) { return new ErgoValue(Iso.jbyteToByte().to(Byte.valueOf(value)), ErgoType.byteType()); } @@ -114,7 +119,11 @@ static public ErgoValue of(AvlTreeData value) { } static public ErgoValue of(ErgoBox value) { - return new ErgoValue<>(JavaHelpers.SigmaDsl().Box(value), ErgoType.boxType()); + return of(JavaHelpers.SigmaDsl().Box(value)); + } + + static public ErgoValue of(Box value) { + return new ErgoValue<>(value, ErgoType.boxType()); } static public ErgoValue> of(byte[] arr) { @@ -136,6 +145,10 @@ static public ErgoValue> of(Coll coll, ErgoType tT) { return new ErgoValue<>(coll, ErgoType.collType(tT)); } + static public ErgoValue of(T value, ErgoType tT) { + return new ErgoValue<>(value, tT); + } + /** * Creates ErgoValue from hex encoded serialized bytes of Constant values. *

diff --git a/common/src/main/java/org/ergoplatform/appkit/InputBoxesSelectionException.java b/common/src/main/java/org/ergoplatform/appkit/InputBoxesSelectionException.java index ddb59bda..00d052ab 100644 --- a/common/src/main/java/org/ergoplatform/appkit/InputBoxesSelectionException.java +++ b/common/src/main/java/org/ergoplatform/appkit/InputBoxesSelectionException.java @@ -1,5 +1,6 @@ package org.ergoplatform.appkit; +import java.util.List; import java.util.Map; public class InputBoxesSelectionException extends RuntimeException { @@ -8,6 +9,24 @@ public InputBoxesSelectionException(String message) { super(message); } + /** + * Thrown when a max amount of input boxes is set to be found, but it does not cover + * the amount of ERG and/or tokens to send. + */ + public static class InputBoxLimitExceededException extends InputBoxesSelectionException { + + public final long remainingAmount; + public final List remainingTokens; + public final int boxLimit; + + public InputBoxLimitExceededException(String message, long remainingAmount, List remainingTokens, int boxLimit) { + super(message); + this.remainingAmount = remainingAmount; + this.remainingTokens = remainingTokens; + this.boxLimit = boxLimit; + } + } + /** * Thrown when a change box is needed, but ERG amount in all inboxes is not enough to create the * change box diff --git a/common/src/main/java/org/ergoplatform/appkit/JavaHelpers.scala b/common/src/main/java/org/ergoplatform/appkit/JavaHelpers.scala index bdf9873a..3ac40383 100644 --- a/common/src/main/java/org/ergoplatform/appkit/JavaHelpers.scala +++ b/common/src/main/java/org/ergoplatform/appkit/JavaHelpers.scala @@ -13,10 +13,9 @@ import sigmastate.Values.{Constant, ErgoTree, EvaluatedValue, SValue, SigmaBoole import sigmastate.serialization.{ErgoTreeSerializer, GroupElementSerializer, SigmaSerializer, ValueSerializer} import scorex.crypto.authds.ADKey import scorex.crypto.hash.Digest32 -import org.ergoplatform.wallet.mnemonic.{Mnemonic => WMnemonic} import org.ergoplatform.settings.ErgoAlgos import sigmastate.lang.Terms.ValueOps -import sigmastate.eval.{CHeader, CompiletimeIRContext, Evaluation, Colls, CostingSigmaDslBuilder, CPreHeader} +import sigmastate.eval.{CompiletimeIRContext, Evaluation, Colls, CostingSigmaDslBuilder, CPreHeader} import sigmastate.eval.Extensions._ import special.sigma.{AnyValue, AvlTree, Header, GroupElement} import java.util @@ -29,8 +28,8 @@ import java.util.{Map => JMap, List => JList} import sigmastate.utils.Helpers._ // don't remove, required for Scala 2.11 import org.ergoplatform.ErgoAddressEncoder.NetworkPrefix import org.ergoplatform.appkit.Iso.{isoErgoTokenToPair, JListToColl} -import org.ergoplatform.wallet.{Constants, TokensMap} -import org.ergoplatform.wallet.mnemonic.Mnemonic.{Pbkdf2KeyLength, Pbkdf2Iterations} +import org.ergoplatform.wallet.TokensMap +import org.ergoplatform.wallet.mnemonic.Mnemonic.{Pbkdf2Iterations, Pbkdf2KeyLength} import scorex.util.encode.Base16 import sigmastate.basics.DLogProtocol.ProveDlog import sigmastate.basics.{ProveDHTuple, DiffieHellmanTupleProverInput} @@ -40,6 +39,9 @@ import sigmastate.interpreter.ContextExtension import org.bouncycastle.crypto.digests.SHA512Digest import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator import org.bouncycastle.crypto.params.KeyParameter +import org.ergoplatform.appkit.JavaHelpers.{TokenColl, TokenIdRType} +import sigmastate.eval.Colls.outerJoin +import special.collection.ExtensionMethods.PairCollOps /** Type-class of isomorphisms between types. * Isomorphism between two types `A` and `B` essentially say that both types @@ -57,6 +59,7 @@ abstract class Iso[A, B] { def to(a: A): B def from(b: B): A def andThen[C](iso: Iso[B,C]): Iso[A,C] = ComposeIso(iso, this) + def inverse: Iso[B, A] = InverseIso(this) } final case class InverseIso[A,B](iso: Iso[A,B]) extends Iso[B,A] { override def to(a: B): A = iso.from(a) @@ -182,10 +185,18 @@ object Iso extends LowPriorityIsos { } val isoTokensListToPairsColl: Iso[JList[ErgoToken], Coll[(TokenId, Long)]] = { - implicit val TokenIdRType: RType[TokenId] = RType.arrayRType[Byte].asInstanceOf[RType[TokenId]] JListToColl(isoErgoTokenToPair, RType[(TokenId, Long)]) } + val isoTokensListToTokenColl: Iso[JList[ErgoToken], TokenColl] = new Iso[JList[ErgoToken], TokenColl] { + override def to(ts: JList[ErgoToken]): TokenColl = + isoTokensListToPairsColl.to(ts).mapFirst(Colls.fromArray(_)) + + override def from(ts: TokenColl): JList[ErgoToken] = { + isoTokensListToPairsColl.from(ts.mapFirst(id => Digest32 @@ id.toArray)) + } + } + val isoSigmaBooleanToByteArray: Iso[SigmaBoolean, Array[Byte]] = new Iso[SigmaBoolean, Array[Byte]] { override def to(a: SigmaBoolean): Array[Byte] = { val w = SigmaSerializer.startWriter() @@ -341,6 +352,8 @@ object JavaHelpers { } } + def toErgoTree(sigmaBoolean: SigmaBoolean): ErgoTree = ErgoTree.fromSigmaBoolean(sigmaBoolean) + def getStateDigest(tree: AvlTree): Array[Byte] = { tree.digest.toArray } @@ -412,10 +425,18 @@ object JavaHelpers { if (secretString == null || secretString.isEmpty) None else Some(secretString) } - def seedToMasterKey(seedPhrase: SecretString, pass: SecretString = null): ExtendedSecretKey = { + /** + * Create an extended secret key from mnemonic + * + * @param seedPhrase secret seed phrase to be used in prover for generating proofs. + * @param pass password to protect secret seed phrase. + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be false for new + * wallets, and true for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) + */ + def seedToMasterKey(seedPhrase: SecretString, pass: SecretString = null, usePre1627KeyDerivation: java.lang.Boolean): ExtendedSecretKey = { val passOpt = if (pass == null || pass.isEmpty()) None else Some(pass.toStringUnsecure) val seed = mnemonicToSeed(seedPhrase.toStringUnsecure, passOpt) - val masterKey = ExtendedSecretKey.deriveMasterKey(seed) + val masterKey = ExtendedSecretKey.deriveMasterKey(seed, usePre1627KeyDerivation) masterKey } @@ -524,6 +545,68 @@ object JavaHelpers { val firstPath = org.ergoplatform.wallet.Constants.eip3DerivationPath DerivationPath(firstPath.decodedPath.dropRight(1), firstPath.publicBranch) } + + /** Type synonym for a collection of tokens represented using Coll */ + type TokenColl = Coll[(Coll[Byte], Long)] + + /** Ensures that all tokens have strictly positive value. + * @throws IllegalArgumentException when any token have value <= 0 + * @return the original `tokens` collection (passes the argument through to the result) + */ + def checkAllTokensPositive(tokens: TokenColl): TokenColl = { + val invalidTokens = tokens.filter(_._2 <= 0) + require(invalidTokens.isEmpty, s"All token values should be > 0: ") + tokens + } + + /** Compute the difference between `reducedTokens` collection and `subtractedTokens` collection. + * It can be thought as `reducedTokens - subtractedTokens` operation. + * + * Each collection can have many `(tokenId, amount)` pairs with the same `tokenId`. + * The method works by first combining all the pairs with the same tokenId and then + * computing the difference. + * The resulting collection contain a single pair for each tokenId and those token ids + * form a subset of tokens from the argument collections. + * + * One concrete use case to think of is `subtractTokenColls(outputTokens, inputTokens)`. + * In this case the resulting collection of (tokenId, amount) pairs can be interpreted as: + * - when `amount < 0` then it is to be burnt + * - when `amount > 0` then it is to be minted + * + * @param reducedTokens the tokens to be subracted from + * @param subtractedTokens the tokens which amounts will be subtracted from the + * corresponding tokens from `reducedTokens` + * @return the differences between token amounts (matched by token ids) + */ + def subtractTokenColls( + reducedTokens: TokenColl, + subtractedTokens: TokenColl + ): TokenColl = { + val reduced = checkAllTokensPositive(reducedTokens) + .sumByKey(Colls.Monoids.longPlusMonoid) // summation with overflow checking + val subtracted = checkAllTokensPositive(subtractedTokens) + .sumByKey(Colls.Monoids.longPlusMonoid) // summation with overflow checking + val tokensDiff = outerJoin(subtracted, reduced)( + { case (_, sV) => -sV }, // for each token missing in reduced: amount to burn + { case (_, rV) => rV }, // for each token missing in subtracted: amount to mint + { case (_, (sV, rV)) => rV - sV } // for tokens both in subtracted and reduced: balance change + ) + tokensDiff.filter(_._2 != 0) // return only unbalanced tokens + } + + /** Compute the difference between `reducedTokens` collection and `subtractedTokens` + * collection. + * @see subtractTokenColls for details + */ + def subtractTokens( + reducedTokens: IndexedSeq[(TokenId, Long)], + subtractedTokens: IndexedSeq[(TokenId, Long)] + ): TokenColl = { + subtractTokenColls( + reducedTokens = Colls.fromItems(reducedTokens:_*).mapFirst(Colls.fromArray(_)), + subtractedTokens = Colls.fromItems(subtractedTokens:_*).mapFirst(Colls.fromArray(_)) + ) + } } diff --git a/common/src/main/java/org/ergoplatform/appkit/SecretStorage.java b/common/src/main/java/org/ergoplatform/appkit/SecretStorage.java index 4a06cc72..87a8286a 100644 --- a/common/src/main/java/org/ergoplatform/appkit/SecretStorage.java +++ b/common/src/main/java/org/ergoplatform/appkit/SecretStorage.java @@ -60,8 +60,15 @@ public void unlock(String encryptionPass) { unlock(SecretString.create(encryptionPass)); } + /** + * Initializes storage with the seed derived from an existing mnemonic phrase. + * @param mnemonic - mnemonic phase + * @param encryptionPass - encryption password + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be false for new + * wallets, and true for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) + */ public static SecretStorage createFromMnemonicIn( - String secretDir, Mnemonic mnemonic, SecretString encryptionPassword) { + String secretDir, Mnemonic mnemonic, SecretString encryptionPassword, Boolean usePre1627KeyDerivation) { SecretStorageSettings settings = new SecretStorageSettings(secretDir, DEFAULT_SETTINGS); SecretString password = mnemonic.getPassword(); @@ -71,14 +78,14 @@ public static SecretStorage createFromMnemonicIn( JavaHelpers.secretStringToOption(password != null ? password.toInterface4JSecretString() : null), encryptionPassword.toInterface4JSecretString(), - settings); + settings, usePre1627KeyDerivation); return new SecretStorage(jsonStorage); } public static SecretStorage createFromMnemonicIn( - String secretDir, Mnemonic mnemonic, String encryptionPassword) { - return createFromMnemonicIn(secretDir, mnemonic, SecretString.create(encryptionPassword)); + String secretDir, Mnemonic mnemonic, String encryptionPassword, Boolean usePre1627KeyDerivation) { + return createFromMnemonicIn(secretDir, mnemonic, SecretString.create(encryptionPassword), usePre1627KeyDerivation); } public static SecretStorage loadFrom(String storageFileName) { diff --git a/common/src/main/java/org/ergoplatform/appkit/SigmaProp.java b/common/src/main/java/org/ergoplatform/appkit/SigmaProp.java index 65053d42..e907c39b 100644 --- a/common/src/main/java/org/ergoplatform/appkit/SigmaProp.java +++ b/common/src/main/java/org/ergoplatform/appkit/SigmaProp.java @@ -12,6 +12,10 @@ public SigmaProp(Values.SigmaBoolean sigmaBoolean) { this.sigmaBoolean = sigmaBoolean; } + public SigmaProp(special.sigma.SigmaProp sigmaProp) { + this(JavaHelpers.SigmaDsl().toSigmaBoolean(sigmaProp)); + } + public Values.SigmaBoolean getSigmaBoolean() { return sigmaBoolean; } @@ -23,6 +27,10 @@ public byte[] toBytes() { return Iso.isoSigmaBooleanToByteArray().to(sigmaBoolean); } + public Address toAddress(NetworkType networkType) { + return Address.fromSigmaBoolean(sigmaBoolean, networkType); + } + /** * @return SigmaProp equal to the one that was serialized with {@link #toBytes()} */ diff --git a/common/src/main/java/org/ergoplatform/appkit/scalaapi/ErgoValueBuilder.scala b/common/src/main/java/org/ergoplatform/appkit/scalaapi/ErgoValueBuilder.scala new file mode 100644 index 00000000..5c4281c1 --- /dev/null +++ b/common/src/main/java/org/ergoplatform/appkit/scalaapi/ErgoValueBuilder.scala @@ -0,0 +1,22 @@ +package org.ergoplatform.appkit.scalaapi + +import org.ergoplatform.appkit.ErgoValue + +/** Helper builder to easily construct ErgoValues. */ +object ErgoValueBuilder { + /** Given a value of Scala type supported by ErgoScript (and ErgoTree) this method + * constructs ErgoValue of the required Java type. + * + * @param value a value of Scala type such as `Coll[(Byte, Coll[Int])]` + * @param iso an isomorphism that projects he given Scala type S to the + * corresponding Java type J. When type S is known to the compiler, then + * iso instance can be synthesized by the Scala compiler and the type J is + * inferred. + * @return ErgoValue instance of the Java type J which corresponds to the + * Scala type S. + */ + def buildFor[S, J](value: S)(implicit iso: Iso[S, J]): ErgoValue[J] = { + val jvalue = iso.toJava(value) + ErgoValue.of(jvalue, iso.javaType) + } +} diff --git a/common/src/main/java/org/ergoplatform/appkit/scalaapi/Iso.scala b/common/src/main/java/org/ergoplatform/appkit/scalaapi/Iso.scala new file mode 100644 index 00000000..14001baf --- /dev/null +++ b/common/src/main/java/org/ergoplatform/appkit/scalaapi/Iso.scala @@ -0,0 +1,121 @@ +package org.ergoplatform.appkit.scalaapi + +import org.ergoplatform.appkit.ErgoType +import org.ergoplatform.appkit.scalaapi.Iso.IdentityIso +import special.collection.Coll +import special.sigma +import special.sigma.{Header, Box, SigmaProp, GroupElement, AvlTree, PreHeader} + +/** Isomorphism between Scala type S and Java type J. + * Note, each conversion function is actually type cast of the argument to the resulting + * type, thus, no conversion actually done. This is true even for primitive types where + * implicit conversion from scala.Predef are used (see Predef.byte2Byte). + */ +abstract class Iso[S, J] { + /** Scala type descriptor */ + def scalaType: ErgoType[S] + + /** Java type descriptor */ + def javaType: ErgoType[J] + + /** Conversion from Scala to Java value. */ + def toJava(x: S): J + + /** Conversion from Java to Scala value. */ + def toScala(y: J): S +} + +abstract class IsoLowPriority { + /** This is fallback implicits which are used only when other more specific iso cannot be + * used in implicit search. (the trick used across Scala libraries) + */ + implicit val unitIso: Iso[Unit, Unit] = new IdentityIso[Unit]() + implicit val bigIntIso: Iso[sigma.BigInt, sigma.BigInt] = new IdentityIso[sigma.BigInt]() + implicit val groupElementIso: Iso[GroupElement, GroupElement] = new IdentityIso[GroupElement]() + implicit val SigmaPropIso: Iso[SigmaProp, SigmaProp] = new IdentityIso[SigmaProp]() + implicit val AvlTreeIso: Iso[AvlTree, AvlTree] = new IdentityIso[AvlTree]() + implicit val isoIso: Iso[Box, Box] = new IdentityIso[Box]() + implicit val HeaderIso: Iso[Header, Header] = new IdentityIso[Header]() + implicit val PreHeaderIso: Iso[PreHeader, PreHeader] = new IdentityIso[PreHeader]()(preHeaderType) +} + +object Iso extends IsoLowPriority { + + /** Any type is isomorphic to itself, provided there is ErgoType descriptor. + * Given descriptor of type A, constructs identity Iso. + */ + class IdentityIso[A](implicit tA: ErgoType[A]) extends Iso[A, A] { + override def scalaType: ErgoType[A] = tA + override def javaType: ErgoType[A] = tA + override def toJava(x: A): A = x + override def toScala(y: A): A = y + } + + /** Iso implementation for primitive types like Byte, Short, etc. (see below) */ + class PrimIso[S, J]( + implicit to: S => J, from: J => S, + val scalaType: ErgoType[S], val javaType: ErgoType[J] + ) extends Iso[S, J] { + override def toJava(x: S): J = to(x) + override def toScala(y: J): S = from(y) + } + + /** Iso implementation for pair (scala.Tuple2) type + * @param isoA Iso instance between first components + * @param isoB Iso instance between second components + */ + class PairIso[SA, SB, JA, JB]( + isoA: Iso[SA, JA], + isoB: Iso[SB, JB] + ) extends Iso[(SA, SB), (JA, JB)] { + override val scalaType: ErgoType[(SA, SB)] = ErgoType.pairType(isoA.scalaType, isoB.scalaType) + + override val javaType: ErgoType[(JA, JB)] = ErgoType.pairType(isoA.javaType, isoB.javaType) + + /** The implementation is based on the fact that SA and SB have exactly the same + * runtime JVM types, but different in Java and Scala languages, so compilers treat + * them as different types. + */ + override def toJava(x: (SA, SB)): (JA, JB) = x.asInstanceOf[(JA, JB)] + + override def toScala(y: (JA, JB)): (SA, SB) = y.asInstanceOf[(SA, SB)] + } + + class CollIso[S, J](isoElem: Iso[S, J]) extends Iso[Coll[S], Coll[J]] { + override val scalaType: ErgoType[Coll[S]] = ErgoType.collType(isoElem.scalaType) + + override val javaType: ErgoType[Coll[J]] = ErgoType.collType(isoElem.javaType) + + /** The implementation is based on the fact that SA and SB have exactly the same + * runtime JVM types, but different in Java and Scala languages, so compilers treat + * them as different types. + */ + override def toJava(x: Coll[S]): Coll[J] = x.asInstanceOf[Coll[J]] + + override def toScala(y: Coll[J]): Coll[S] = y.asInstanceOf[Coll[S]] + } + + /** Iso instance between scala.Byte and java.lang.Byte */ + implicit val isoByte: Iso[scala.Byte, java.lang.Byte] = new PrimIso[scala.Byte, java.lang.Byte]() + + /** Iso instance between scala.Short and java.lang.Short */ + implicit val isoShort: Iso[scala.Short, java.lang.Short] = new PrimIso[scala.Short, java.lang.Short]() + + /** Iso instance between scala.Int and java.lang.Int */ + implicit val isoInt: Iso[scala.Int, java.lang.Integer] = new PrimIso[scala.Int, java.lang.Integer]() + + /** Iso instance between scala.Long and java.lang.Long */ + implicit val isoLong: Iso[scala.Long, java.lang.Long] = new PrimIso[scala.Long, java.lang.Long]() + + /** Iso instance between scala.Boolean and java.lang.Boolean */ + implicit val isoBoolean: Iso[scala.Boolean, java.lang.Boolean] = new PrimIso[scala.Boolean, java.lang.Boolean]() + + /** Given a pair of isos constructs an Iso instance between Scala and Java pairs. */ + implicit def isoPair[SA, SB, JA, JB] + (implicit isoA: Iso[SA, JA], isoB: Iso[SB, JB]): Iso[(SA, SB), (JA, JB)] = + new PairIso[SA, SB, JA, JB](isoA, isoB) + + /** Given an iso for elements constructs an Iso instance between Coll of Scala and Coll of Java types. */ + implicit def isoColl[S, J](implicit isoElem: Iso[S, J]): Iso[Coll[S], Coll[J]] = + new CollIso[S, J](isoElem) +} diff --git a/common/src/main/java/org/ergoplatform/appkit/scalaapi/package.scala b/common/src/main/java/org/ergoplatform/appkit/scalaapi/package.scala new file mode 100644 index 00000000..32ca22a2 --- /dev/null +++ b/common/src/main/java/org/ergoplatform/appkit/scalaapi/package.scala @@ -0,0 +1,39 @@ +package org.ergoplatform.appkit + +import scalan.RType +import special.sigma +import special.sigma.{Header, Box, GroupElement, AvlTree, PreHeader} + +import java.lang.{Boolean => JBoolean, Short => JShort, Integer => JInt, Long => JLong, Byte => JByte} + +package object scalaapi { + + /** Global instances of ErgoType which are used whenever implicit parameter is needed in + * Scala code. + * + * For Java types. + */ + implicit val byteType: ErgoType[JByte] = ErgoType.byteType() + implicit val shortType: ErgoType[JShort] = ErgoType.shortType() + implicit val intType: ErgoType[JInt] = ErgoType.integerType() + implicit val longType: ErgoType[JLong] = ErgoType.longType() + implicit val booleanType: ErgoType[JBoolean] = ErgoType.booleanType() + + /** For Scala types. */ + implicit val scalaByteType: ErgoType[Byte] = ErgoType.ofRType(RType.ByteType) + implicit val scalaShortType: ErgoType[Short] = ErgoType.ofRType(RType.ShortType) + implicit val scalaIntType: ErgoType[Int] = ErgoType.ofRType(RType.IntType) + implicit val scalaLongType: ErgoType[Long] = ErgoType.ofRType(RType.LongType) + implicit val scalaBooleanType: ErgoType[Boolean] = ErgoType.ofRType(RType.BooleanType) + + /** For type which are the same in Scala and Java */ + implicit val unitType: ErgoType[Unit] = ErgoType.unitType() + implicit val bigIntType: ErgoType[sigma.BigInt] = ErgoType.bigIntType() + implicit val groupElementType: ErgoType[GroupElement] = ErgoType.groupElementType() + implicit val sigmaPropType: ErgoType[sigma.SigmaProp] = ErgoType.sigmaPropType() + implicit val avlTreeType: ErgoType[AvlTree] = ErgoType.avlTreeType() + implicit val boxType: ErgoType[Box] = ErgoType.boxType() + implicit val headerType: ErgoType[Header] = ErgoType.headerType() + implicit val preHeaderType: ErgoType[sigma.PreHeader] = ErgoType.preHeaderType() + +} diff --git a/common/src/test/scala/org/ergoplatform/appkit/AppkitTestingCommon.scala b/common/src/test/scala/org/ergoplatform/appkit/AppkitTestingCommon.scala index 5512797f..f1c32f30 100644 --- a/common/src/test/scala/org/ergoplatform/appkit/AppkitTestingCommon.scala +++ b/common/src/test/scala/org/ergoplatform/appkit/AppkitTestingCommon.scala @@ -1,5 +1,8 @@ package org.ergoplatform.appkit +import scalan.RType +import sigmastate.eval.SigmaDsl + trait AppkitTestingCommon { /** The mnemonic used in tests and test vectors. */ val mnemonic = SecretString.create("slow silly start wash bundle suffer bulb ancient height spin express remind today effort helmet") @@ -22,5 +25,9 @@ trait AppkitTestingCommon { /** The address which corresponds to master key of the `mnemonic`. */ val address = Address.fromMnemonic( NetworkType.MAINNET, - Mnemonic.create(mnemonic, SecretString.empty())) + Mnemonic.create(mnemonic, SecretString.empty()), + false) + + /** Helper method to construct a collection from items. */ + def Coll[T](items: T*)(implicit cT: RType[T]) = SigmaDsl.Colls.fromItems(items:_*) } diff --git a/common/src/test/scala/org/ergoplatform/appkit/ErgoValueSpec.scala b/common/src/test/scala/org/ergoplatform/appkit/ErgoValueSpec.scala index ee1aa70f..3e63ca46 100644 --- a/common/src/test/scala/org/ergoplatform/appkit/ErgoValueSpec.scala +++ b/common/src/test/scala/org/ergoplatform/appkit/ErgoValueSpec.scala @@ -1,21 +1,14 @@ package org.ergoplatform.appkit -import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks -import org.scalatest.{Matchers, PropSpec} -import scalan.RType import scorex.util.encode.Base16 import sigmastate._ import sigmastate.Values.Constant -import sigmastate.eval.SigmaDsl import sigmastate.serialization.ValueSerializer import sigmastate.serialization.generators.ObjectGenerators import JavaHelpers._ import special.collection.Coll -class ErgoValueSpec extends PropSpec with Matchers with ScalaCheckDrivenPropertyChecks - with AppkitTestingCommon with ObjectGenerators { - - def Coll[T](items: T*)(implicit cT: RType[T]) = SigmaDsl.Colls.fromItems(items:_*) +class ErgoValueSpec extends TestingBase with AppkitTestingCommon with ObjectGenerators { def constToHex[T <: SType](c: Constant[T]): String = { val bytes = ValueSerializer.serialize(c) diff --git a/common/src/test/scala/org/ergoplatform/appkit/SecretStorageSpec.scala b/common/src/test/scala/org/ergoplatform/appkit/SecretStorageSpec.scala index 0bac80b1..f0c8a24d 100644 --- a/common/src/test/scala/org/ergoplatform/appkit/SecretStorageSpec.scala +++ b/common/src/test/scala/org/ergoplatform/appkit/SecretStorageSpec.scala @@ -21,10 +21,10 @@ class SecretStorageSpec extends PropSpec with Matchers with ScalaCheckDrivenProp withNewStorageFor(mnemonicWithPassword, encryptionPass) { storage => storage.unlock(encryptionPass) storage.isLocked shouldBe false - val addr = Address.fromMnemonic(NetworkType.TESTNET, mnemonicWithPassword) + val addr = Address.fromMnemonic(NetworkType.TESTNET, mnemonicWithPassword, false) val secret = storage.getSecret() secret should not be(null) - val expSecret = JavaHelpers.seedToMasterKey(mnemonicWithPassword.getPhrase, mnemonicWithPassword.getPassword) + val expSecret = JavaHelpers.seedToMasterKey(mnemonicWithPassword.getPhrase, mnemonicWithPassword.getPassword, false) expSecret shouldBe secret storage.getAddressFor(NetworkType.TESTNET) shouldBe addr } @@ -56,7 +56,7 @@ class SecretStorageSpec extends PropSpec with Matchers with ScalaCheckDrivenProp def withNewStorageFor(mnemonic: Mnemonic, encryptionPass: String)(block: SecretStorage => Unit): Unit = { withTempDir { dir => val dirPath = dir.getPath - val storage = SecretStorage.createFromMnemonicIn(dirPath, mnemonic, encryptionPass) + val storage = SecretStorage.createFromMnemonicIn(dirPath, mnemonic, encryptionPass, false) try { block(storage) } diff --git a/common/src/test/scala/org/ergoplatform/appkit/TestingBase.scala b/common/src/test/scala/org/ergoplatform/appkit/TestingBase.scala new file mode 100644 index 00000000..6de0a13f --- /dev/null +++ b/common/src/test/scala/org/ergoplatform/appkit/TestingBase.scala @@ -0,0 +1,6 @@ +package org.ergoplatform.appkit + +import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks +import org.scalatest.{Matchers, PropSpec} + +trait TestingBase extends PropSpec with Matchers with ScalaCheckDrivenPropertyChecks diff --git a/common/src/test/scala/org/ergoplatform/appkit/scalaapi/ErgoValueBuilderSpec.scala b/common/src/test/scala/org/ergoplatform/appkit/scalaapi/ErgoValueBuilderSpec.scala new file mode 100644 index 00000000..82b6ff02 --- /dev/null +++ b/common/src/test/scala/org/ergoplatform/appkit/scalaapi/ErgoValueBuilderSpec.scala @@ -0,0 +1,85 @@ +package org.ergoplatform.appkit.scalaapi + +import org.ergoplatform.appkit.{BoxAttachment, BoxAttachmentGeneric, ErgoValue, TestingBase, ErgoType, AppkitTestingCommon} +import scalan.RType +import sigmastate.eval.SigmaDsl +import special.collection.Coll +import special.sigma.Box + +import java.lang.{Boolean => JBoolean, Short => JShort, Integer => JInt, Long => JLong, Byte => JByte} +import java.math.BigInteger + +class ErgoValueBuilderSpec extends TestingBase with AppkitTestingCommon { + + property("buildFor") { + val vByte = ErgoValueBuilder.buildFor(10.toByte) + val jByte = ErgoValue.of(10.toByte) + vByte shouldBe jByte + + val vShort = ErgoValueBuilder.buildFor(10.toShort) + val jShort = ErgoValue.of(10.toShort) + vShort shouldBe jShort + + val vInt: ErgoValue[JInt] = ErgoValueBuilder.buildFor(10) + val jInt = ErgoValue.of(10) + vInt shouldBe jInt + + val vLong = ErgoValueBuilder.buildFor(10L) + val jLong = ErgoValue.of(10L) + vLong shouldBe jLong + + val vBoolean: ErgoValue[JBoolean] = ErgoValueBuilder.buildFor(true) + val jBoolean = ErgoValue.of(true) + vBoolean shouldBe jBoolean + + val vPair = ErgoValueBuilder.buildFor((10, 10L)) + val jPair = ErgoValue.pairOf(jInt, jLong) + vPair shouldBe jPair + + val vCollInt = ErgoValueBuilder.buildFor(Coll(10, 20)) + val jCollInt = ErgoValue.of(Coll(10, 20).asInstanceOf[Coll[Integer]], ErgoType.integerType()) + vCollInt shouldBe jCollInt + + val vCollPair = ErgoValueBuilder.buildFor(Coll((10, 10L), (20, 20L))) + val jCollPair = ErgoValue.of( + Coll((10, 10L), (20, 20L)).asInstanceOf[Coll[(Integer, java.lang.Long)]], + ErgoType.pairType(ErgoType.integerType(), ErgoType.longType()) + ) + vCollPair shouldBe jCollPair + } + + + property("buildFor for identity isos") { + val vBox = ErgoValueBuilder.buildFor(null: Box) + val jBox = ErgoValue.of(null: Box) + vBox shouldBe jBox + val vCollBigInt = ErgoValueBuilder.buildFor(Coll(SigmaDsl.BigInt(BigInteger.ONE))) + val jCollBigInt = ErgoValue.of(Coll(SigmaDsl.BigInt(BigInteger.ONE)), ErgoType.bigIntType()) + vCollBigInt shouldBe jCollBigInt + } + + property("buildFor some complex type") { + val x: ErgoValue[Coll[(Coll[(JByte, JLong)], Coll[JShort])]] = ErgoValueBuilder.buildFor( + Coll( + (Coll((1.toByte, 10L), (2.toByte, 20L)), Coll[Short](1, 2, 3)), + (Coll((1.toByte, 10L), (2.toByte, 20L)), Coll[Short](1, 2, 3)) + ) + ) + x should not be null + + // check that type descriptor constructed via Iso is correct + val xRT = x.getType.getRType + xRT.tItem.tFst.tItem.tFst shouldBe RType.ByteType + xRT.tItem.tFst.tItem.tSnd shouldBe RType.LongType + xRT.tItem.tSnd.tItem shouldBe RType.ShortType + } + + property("Use ErgoValueBuilder in Appkit API") { + // attachment format is (Coll[0x50, 0x52, 0x50], Tuple2(Int, Coll[Byte]) + val bytes = Coll[Byte](1, 2, 3) + val ergoValue = ErgoValueBuilder.buildFor( + (Coll[Byte](0x50, 0x52, 0x50), (BoxAttachment.Type.PLAIN_TEXT.toTypeRawValue, bytes))) + val backFromValue: BoxAttachment = BoxAttachmentGeneric.createFromErgoValue(ergoValue) + backFromValue should not be null + } +} diff --git a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/NodeInfo.java b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/NodeInfo.java index 70266d9c..8d8ba8d8 100755 --- a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/NodeInfo.java +++ b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/NodeInfo.java @@ -130,6 +130,9 @@ public StateTypeEnum read(final JsonReader jsonReader) throws IOException { @SerializedName("genesisBlockId") private String genesisBlockId = null; + @SerializedName("restApiUrl") + private String restApiUrl = null; + @SerializedName("parameters") private Parameters parameters = null; @@ -492,7 +495,15 @@ public void setGenesisBlockId(String genesisBlockId) { this.genesisBlockId = genesisBlockId; } - public NodeInfo parameters(Parameters parameters) { + public String getRestApiUrl() { + return restApiUrl; + } + + public void setRestApiUrl(String restApiUrl) { + this.restApiUrl = restApiUrl; + } + + public NodeInfo parameters(Parameters parameters) { this.parameters = parameters; return this; } @@ -539,12 +550,13 @@ public boolean equals(java.lang.Object o) { Objects.equals(this.headersScore, nodeInfo.headersScore) && Objects.equals(this.fullBlocksScore, nodeInfo.fullBlocksScore) && Objects.equals(this.genesisBlockId, nodeInfo.genesisBlockId) && + Objects.equals(this.restApiUrl, nodeInfo.restApiUrl) && Objects.equals(this.parameters, nodeInfo.parameters); } @Override public int hashCode() { - return Objects.hash(name, appVersion, fullHeight, headersHeight, bestFullHeaderId, previousFullHeaderId, bestHeaderId, stateRoot, stateType, stateVersion, isMining, peersCount, unconfirmedCount, difficulty, currentTime, launchTime, headersScore, fullBlocksScore, genesisBlockId, parameters); + return Objects.hash(name, appVersion, fullHeight, headersHeight, bestFullHeaderId, previousFullHeaderId, bestHeaderId, stateRoot, stateType, stateVersion, isMining, peersCount, unconfirmedCount, difficulty, currentTime, launchTime, headersScore, fullBlocksScore, genesisBlockId, restApiUrl, parameters); } @@ -572,6 +584,7 @@ public String toString() { sb.append(" headersScore: ").append(toIndentedString(headersScore)).append("\n"); sb.append(" fullBlocksScore: ").append(toIndentedString(fullBlocksScore)).append("\n"); sb.append(" genesisBlockId: ").append(toIndentedString(genesisBlockId)).append("\n"); + sb.append(" restApiUrl: ").append(toIndentedString(restApiUrl)).append("\n"); sb.append(" parameters: ").append(toIndentedString(parameters)).append("\n"); sb.append("}"); return sb.toString(); diff --git a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/Peer.java b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/Peer.java index 05d761ae..55d053f5 100755 --- a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/Peer.java +++ b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/Peer.java @@ -33,8 +33,14 @@ public class Peer { @SerializedName("name") private String name = null; - @SerializedName("lastSeen") - private Integer lastSeen = null; + @SerializedName("restApiUrl") + private String restApiUrl = null; + + @SerializedName("lastMessage") + private Long lastMessage = null; + + @SerializedName("lastHandshake") + private Long lastHandshake = null; /** * Gets or Sets connectionType @@ -116,25 +122,31 @@ public void setName(String name) { this.name = name; } - public Peer lastSeen(Integer lastSeen) { - this.lastSeen = lastSeen; - return this; - } + public String getRestApiUrl() { + return restApiUrl; + } - /** - * Get lastSeen - * @return lastSeen - **/ - @Schema(description = "") - public Integer getLastSeen() { - return lastSeen; - } + public void setRestApiUrl(String restApiUrl) { + this.restApiUrl = restApiUrl; + } - public void setLastSeen(Integer lastSeen) { - this.lastSeen = lastSeen; - } + public Long getLastMessage() { + return lastMessage; + } + + public void setLastMessage(Long lastMessage) { + this.lastMessage = lastMessage; + } + + public Long getLastHandshake() { + return lastHandshake; + } + + public void setLastHandshake(Long lastHandshake) { + this.lastHandshake = lastHandshake; + } - public Peer connectionType(ConnectionTypeEnum connectionType) { + public Peer connectionType(ConnectionTypeEnum connectionType) { this.connectionType = connectionType; return this; } @@ -164,13 +176,15 @@ public boolean equals(java.lang.Object o) { Peer peer = (Peer) o; return Objects.equals(this.address, peer.address) && Objects.equals(this.name, peer.name) && - Objects.equals(this.lastSeen, peer.lastSeen) && + Objects.equals(this.lastHandshake, peer.lastHandshake) && + Objects.equals(this.lastMessage, peer.lastMessage) && + Objects.equals(this.restApiUrl, peer.restApiUrl) && Objects.equals(this.connectionType, peer.connectionType); } @Override public int hashCode() { - return Objects.hash(address, name, lastSeen, connectionType); + return Objects.hash(address, name, lastHandshake, lastMessage, restApiUrl, connectionType); } @@ -181,7 +195,9 @@ public String toString() { sb.append(" address: ").append(toIndentedString(address)).append("\n"); sb.append(" name: ").append(toIndentedString(name)).append("\n"); - sb.append(" lastSeen: ").append(toIndentedString(lastSeen)).append("\n"); + sb.append(" lastMessage: ").append(toIndentedString(lastMessage)).append("\n"); + sb.append(" lastHandshake: ").append(toIndentedString(lastHandshake)).append("\n"); + sb.append(" restApiUrl: ").append(toIndentedString(restApiUrl)).append("\n"); sb.append(" connectionType: ").append(toIndentedString(connectionType)).append("\n"); sb.append("}"); return sb.toString(); diff --git a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/TransactionsApi.java b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/TransactionsApi.java index 7ae09e26..3d097ff1 100755 --- a/java-client-generated/src/main/java/org/ergoplatform/restapi/client/TransactionsApi.java +++ b/java-client-generated/src/main/java/org/ergoplatform/restapi/client/TransactionsApi.java @@ -37,7 +37,7 @@ Call checkTransaction( * @return Call<Integer> */ @GET("transactions/waitTime") - Call getExpectedWaitTime( + Call getExpectedWaitTime( @retrofit2.http.Query("fee") Integer fee , @retrofit2.http.Query("txSize") Integer txSize ); diff --git a/java-client-generated/src/test/java/org/ergoplatform/explorer/client/DefaultApiTest.java b/java-client-generated/src/test/java/org/ergoplatform/explorer/client/DefaultApiTest.java index 197644c1..cb555efc 100644 --- a/java-client-generated/src/test/java/org/ergoplatform/explorer/client/DefaultApiTest.java +++ b/java-client-generated/src/test/java/org/ergoplatform/explorer/client/DefaultApiTest.java @@ -21,6 +21,9 @@ import java.io.IOException; import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; /** * API tests for DefaultApi @@ -30,7 +33,12 @@ public class DefaultApiTest extends ApiTestBase { @Before public void setup() { - api = new ExplorerApiClient("https://api.ergoplatform.com") + int timeout = 180; + ExplorerApiClient apiClient = new ExplorerApiClient("https://api.ergoplatform.com"); + apiClient.configureFromOkClientBuilder(new OkHttpClient.Builder().connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS)); + api = apiClient .createService(DefaultApi.class); } @@ -266,7 +274,7 @@ public void postApiV1BoxesSearchTest() throws IOException { HashMap regs = new HashMap<>(); regs.put("R4", "{\"serializedValue\": \"0702472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347\"}"); BoxQuery body = new BoxQuery() - .registers(regs); + .registers(regs); Integer offset = 0; Integer limit = 10; // TODO: clarify how to use this method diff --git a/java-client-generated/src/test/java/org/ergoplatform/restapi/client/TransactionsApiTest.java b/java-client-generated/src/test/java/org/ergoplatform/restapi/client/TransactionsApiTest.java index ba1a0c3e..9f7a08c9 100644 --- a/java-client-generated/src/test/java/org/ergoplatform/restapi/client/TransactionsApiTest.java +++ b/java-client-generated/src/test/java/org/ergoplatform/restapi/client/TransactionsApiTest.java @@ -46,9 +46,9 @@ public void checkTransactionTest() throws IOException { public void getExpectedWaitTimeTest() throws IOException { Integer fee = 1000000; Integer txSize = 1000; - Integer response = api.getExpectedWaitTime(fee, txSize).execute().body(); + Long response = api.getExpectedWaitTime(fee, txSize).execute().body(); assertNotNull(response); - assertTrue(response == 0); + //assertTrue(response == 0); } /** diff --git a/lib-api/src/main/java/org/ergoplatform/appkit/BoxOperations.java b/lib-api/src/main/java/org/ergoplatform/appkit/BoxOperations.java index d1b203fa..18b3fd24 100644 --- a/lib-api/src/main/java/org/ergoplatform/appkit/BoxOperations.java +++ b/lib-api/src/main/java/org/ergoplatform/appkit/BoxOperations.java @@ -28,10 +28,11 @@ public class BoxOperations { private long feeAmount = MinFee; private IUnspentBoxesLoader inputBoxesLoader = new ExplorerApiUnspentLoader(); private BoxAttachment attachment; + private int maxInputBoxesToSelect = 0; private static final long CHANGE_BOX_NANOERG = MinFee; - private BoxOperations(BlockchainContext ctx, List

senders, @Nullable ErgoProver senderProver) { + BoxOperations(BlockchainContext ctx, List
senders, @Nullable ErgoProver senderProver) { this.ctx = ctx; this.senders = senders; this.senderProver = senderProver; @@ -115,6 +116,23 @@ public BoxOperations withAttachment(@Nullable BoxAttachment attachment) { return this; } + public int getMaxInputBoxesToSelect() { + return maxInputBoxesToSelect; + } + + /** + * @param maxInputBoxesToSelect if set greater than 0, {@link #loadTop()} will only select + * up to this number of input boxes to satisfy ERG and token amount + * needed and throws an {@link org.ergoplatform.appkit.InputBoxesSelectionException.InputBoxLimitExceededException} + * otherwise + * if set to <= 0 (or not set), there is no input box restriction + * checked by loadTop. + */ + public BoxOperations withMaxInputBoxesToSelect(int maxInputBoxesToSelect) { + this.maxInputBoxesToSelect = maxInputBoxesToSelect; + return this; + } + /** * @param message message to be set for outboxes as {@link BoxAttachmentPlainText} */ @@ -171,10 +189,11 @@ public List getTokensToSpend() { public long getFeeAmount() { return feeAmount; } + @Deprecated - public static ErgoProver createProver(BlockchainContext ctx, Mnemonic mnemonic) { + public static ErgoProver createProver(BlockchainContext ctx, Mnemonic mnemonic, Boolean usePre1627KeyDerivation) { ErgoProver prover = ctx.newProverBuilder() - .withMnemonic(mnemonic.getPhrase(), mnemonic.getPassword()) + .withMnemonic(mnemonic.getPhrase(), mnemonic.getPassword(), usePre1627KeyDerivation) .build(); return prover; } @@ -214,6 +233,10 @@ public String send(Address recipient) { * list. * The list is then used to select covering boxes. * + * The method respects a max amount of boxes to be selected set by {@link #withMaxInputBoxesToSelect(int)}. + * If this limit is exceeded, a {@link org.ergoplatform.appkit.InputBoxesSelectionException.InputBoxLimitExceededException} + * is thrown and no further boxes are loaded. + * * @return a list of boxes covering the given amount */ public List loadTop() { @@ -230,7 +253,9 @@ public List loadTop() { inputBoxesLoader.prepareForAddress(sender); CoveringBoxes addressUnspentBoxes = getCoveringBoxesFor(remainingAmount, remainingTokens, changeBoxConsidered, - page -> inputBoxesLoader.loadBoxesPage(ctx, sender, page)); + page -> inputBoxesLoader.loadBoxesPage(ctx, sender, page), + (maxInputBoxesToSelect <= 0) ? 0 : Math.max(1, maxInputBoxesToSelect - unspentBoxes.size()) + ); // when a change box needed it needs some extra nanoergs to be sent if (!changeBoxConsidered && addressUnspentBoxes.isChangeBoxNeeded()) { @@ -378,6 +403,14 @@ public static CoveringBoxes getCoveringBoxesFor(long amountToSpend, List tokensToSpend, boolean changeBoxConsidered, Function> inputBoxesLoader) { + return getCoveringBoxesFor(amountToSpend, tokensToSpend, changeBoxConsidered, inputBoxesLoader, 0); + } + + private static CoveringBoxes getCoveringBoxesFor(long amountToSpend, + List tokensToSpend, + boolean changeBoxConsidered, + Function> inputBoxesLoader, + int maxBoxesToSelect) { SelectTokensHelper tokensRemaining = new SelectTokensHelper(tokensToSpend); Preconditions.checkArgument(amountToSpend > 0 || !tokensRemaining.areTokensCovered(), "amountToSpend or tokens to spend should be > 0"); @@ -406,6 +439,18 @@ public static CoveringBoxes getCoveringBoxesFor(long amountToSpend, } if (remainingAmountToCover <= 0 && tokensRemaining.areTokensCovered()) return new CoveringBoxes(amountToSpend, selectedCoveringBoxes, tokensToSpend, changeBoxConsidered); + + // check the maxBoxToSelect restriction, if it is set + else if (maxBoxesToSelect > 0 && selectedCoveringBoxes.size() >= maxBoxesToSelect) { + List remainingTokenList = tokensRemaining.getRemainingTokenList(); + throw new InputBoxesSelectionException.InputBoxLimitExceededException( + "Input box limit exceeded, could not cover " + remainingAmountToCover + + " nanoERG and " + remainingTokenList.size() + " tokens.", + remainingAmountToCover, + remainingTokenList, + maxBoxesToSelect + ); + } } } // this chunk is not enough, go to the next (if any) diff --git a/lib-api/src/main/java/org/ergoplatform/appkit/BoxSelectorsJavaHelpers.scala b/lib-api/src/main/java/org/ergoplatform/appkit/BoxSelectorsJavaHelpers.scala index d506b83f..762fd7d5 100644 --- a/lib-api/src/main/java/org/ergoplatform/appkit/BoxSelectorsJavaHelpers.scala +++ b/lib-api/src/main/java/org/ergoplatform/appkit/BoxSelectorsJavaHelpers.scala @@ -32,7 +32,7 @@ object BoxSelectorsJavaHelpers { val inputBoxes = unspentBoxes.convertTo[IndexedSeq[InputBox]] .map(InputBoxWrapper.apply).toIterator val targetAssets = tokensToSpend.convertTo[mutable.LinkedHashMap[ModifierId, Long]].toMap - val foundBoxes: IndexedSeq[InputBox] = DefaultBoxSelector.select(inputBoxes, amountToSpend, targetAssets) match { + val foundBoxes: IndexedSeq[InputBox] = new DefaultBoxSelector(None).select(inputBoxes, amountToSpend, targetAssets) match { case Left(err: NotEnoughCoinsForChangeBoxesError) => throw new InputBoxesSelectionException.NotEnoughCoinsForChangeException(err.message) case Left(err: NotEnoughErgsError) => { diff --git a/lib-api/src/main/java/org/ergoplatform/appkit/ErgoProverBuilder.java b/lib-api/src/main/java/org/ergoplatform/appkit/ErgoProverBuilder.java index 6121a549..3f87e4cf 100644 --- a/lib-api/src/main/java/org/ergoplatform/appkit/ErgoProverBuilder.java +++ b/lib-api/src/main/java/org/ergoplatform/appkit/ErgoProverBuilder.java @@ -13,16 +13,20 @@ public interface ErgoProverBuilder { * * @param mnemonicPhrase secret seed phrase to be used in prover for generating proofs. * @param mnemonicPass password to protect secret seed phrase. + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be false for new + * wallets, and true for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) */ - ErgoProverBuilder withMnemonic(SecretString mnemonicPhrase, SecretString mnemonicPass); + ErgoProverBuilder withMnemonic(SecretString mnemonicPhrase, SecretString mnemonicPass, Boolean usePre1627KeyDerivation); /** * Configure this builder to use the given mnemonic when building a new prover. * * @param mnemonic {@link Mnemonic} instance containing secret seed phrase to be used in prover for * generating proofs. + * @param usePre1627KeyDerivation use incorrect(previous) BIP32 derivation, expected to be true for new + * wallets, and false for old pre-1627 wallets (see https://github.com/ergoplatform/ergo/issues/1627 for details) */ - ErgoProverBuilder withMnemonic(Mnemonic mnemonic); + ErgoProverBuilder withMnemonic(Mnemonic mnemonic, Boolean usePre1627KeyDerivation); /** * Configure this builder to derive the new EIP-3 secret key with the given index. diff --git a/lib-api/src/main/java/org/ergoplatform/appkit/UnsignedTransaction.java b/lib-api/src/main/java/org/ergoplatform/appkit/UnsignedTransaction.java index b0edbdac..a9c8bceb 100644 --- a/lib-api/src/main/java/org/ergoplatform/appkit/UnsignedTransaction.java +++ b/lib-api/src/main/java/org/ergoplatform/appkit/UnsignedTransaction.java @@ -2,12 +2,9 @@ import org.ergoplatform.ErgoAddress; +import javax.annotation.Nonnull; import java.util.List; -import org.ergoplatform.ErgoBox; -import org.ergoplatform.UnsignedErgoLikeTransaction; -import org.ergoplatform.wallet.protocol.context.ErgoLikeStateContext; - /** * This interface is used to represent unsigned transactions after they are * built using {@link UnsignedTransactionBuilder}. @@ -31,4 +28,13 @@ public interface UnsignedTransaction extends Transaction { * Returns the change address associated with this unsigned transaction */ ErgoAddress getChangeAddress(); + + /** + * The list of tokens requested (in builders) for burning in this transaction when + * it will be executed on blockchain. + * + * Returns empty list when no burning was explicitly requested (which is by default). + */ + @Nonnull + List getTokensToBurn(); } diff --git a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverBuilderImpl.scala b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverBuilderImpl.scala index a14db610..3e8f5fbe 100644 --- a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverBuilderImpl.scala +++ b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverBuilderImpl.scala @@ -20,13 +20,14 @@ class ErgoProverBuilderImpl(_ctx: BlockchainContextBase) extends ErgoProverBuild private val _dLogSecrets = new util.ArrayList[DLogProtocol.DLogProverInput] override def withMnemonic(mnemonicPhrase: SecretString, - mnemonicPass: SecretString): ErgoProverBuilder = { - _masterKey = JavaHelpers.seedToMasterKey(mnemonicPhrase, mnemonicPass) + mnemonicPass: SecretString, + usePre1627KeyDerivation: java.lang.Boolean): ErgoProverBuilder = { + _masterKey = JavaHelpers.seedToMasterKey(mnemonicPhrase, mnemonicPass, usePre1627KeyDerivation) this } - override def withMnemonic(mnemonic: Mnemonic): ErgoProverBuilder = - withMnemonic(mnemonic.getPhrase, mnemonic.getPassword) + override def withMnemonic(mnemonic: Mnemonic, usePre1627KeyDerivation: java.lang.Boolean): ErgoProverBuilder = + withMnemonic(mnemonic.getPhrase, mnemonic.getPassword, usePre1627KeyDerivation) override def withEip3Secret(index: Int): ErgoProverBuilder = { require(_masterKey != null, s"Mnemonic is not specified, use withMnemonic method.") diff --git a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverImpl.scala b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverImpl.scala index 70c0e284..ae13977f 100644 --- a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverImpl.scala +++ b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/ErgoProverImpl.scala @@ -43,7 +43,12 @@ class ErgoProverImpl(_ctx: BlockchainContextBase, val txImpl = tx.asInstanceOf[UnsignedTransactionImpl] val boxesToSpend = JavaHelpers.toIndexedSeq(txImpl.getBoxesToSpend) val dataBoxes = JavaHelpers.toIndexedSeq(txImpl.getDataBoxes) - val (signed, cost) = _prover.sign(txImpl.getTx, boxesToSpend, dataBoxes, txImpl.getStateContext, baseCost).getOrThrow + val (signed, cost) = _prover.sign( + unsignedTx = txImpl.getTx, + boxesToSpend = boxesToSpend, + dataBoxes = dataBoxes, + stateContext = txImpl.getStateContext, + baseCost = baseCost, txImpl.getTokensToBurn).getOrThrow new SignedTransactionImpl(_ctx, signed, cost) } @@ -55,7 +60,13 @@ class ErgoProverImpl(_ctx: BlockchainContextBase, val txImpl = tx.asInstanceOf[UnsignedTransactionImpl] val boxesToSpend = JavaHelpers.toIndexedSeq(txImpl.getBoxesToSpend) val dataBoxes = JavaHelpers.toIndexedSeq(txImpl.getDataBoxes) - val (reduced, cost) = _prover.reduceTransaction(txImpl.getTx, boxesToSpend, dataBoxes, txImpl.getStateContext, baseCost) + val (reduced, cost) = _prover.reduceTransaction( + unsignedTx = txImpl.getTx, + boxesToSpend = boxesToSpend, + dataBoxes = dataBoxes, + stateContext = txImpl.getStateContext, + baseCost = baseCost, + tokensToBurn = txImpl.getTokensToBurn) new ReducedTransactionImpl(_ctx, reduced, cost) } diff --git a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/PreHeaderBuilderImpl.java b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/PreHeaderBuilderImpl.java index 70f53a6f..8d47655f 100644 --- a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/PreHeaderBuilderImpl.java +++ b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/PreHeaderBuilderImpl.java @@ -69,7 +69,7 @@ public PreHeader build() { BlockHeader h = _ctx.getHeaders().get(0); byte version = _version == null ? h.getVersion() : _version; Coll parentId = _parentId == null ? (Coll)(Object)h.getParentId() : _parentId; - long timestamp = _timestamp == null ? h.getTimestamp() : _timestamp; + long timestamp = _timestamp == null ? Math.max(h.getTimestamp(), System.currentTimeMillis()) : _timestamp; long nBits = _nBits == null ? h.getNBits() : _nBits; int height = _height == null ? h.getHeight() : _height; GroupElement minerPk = _minerPk == null ? h.getMinerPk() : _minerPk; diff --git a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionBuilderImpl.scala b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionBuilderImpl.scala index 3b4649e6..68f996de 100644 --- a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionBuilderImpl.scala +++ b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionBuilderImpl.scala @@ -6,6 +6,7 @@ import org.ergoplatform.appkit.{Iso, _} import org.ergoplatform.wallet.protocol.context.ErgoLikeStateContext import org.ergoplatform.wallet.transactions.TransactionBuilder import org.ergoplatform.wallet.boxes.DefaultBoxSelector +import org.ergoplatform.wallet.boxes.BoxSelector import special.collection.Coll import special.sigma.Header @@ -116,8 +117,9 @@ class UnsignedTransactionBuilderImpl(val _ctx: BlockchainContextImpl) extends Un val outputCandidatesSeq = JavaHelpers.toIndexedSeq(outputCandidates) val boxesToSpendSeq = JavaHelpers.toIndexedSeq(boxesToSpend) val inputBoxesSeq = boxesToSpendSeq.map(eb => eb.box) + val requestedToBurn = _tokensToBurn.getOrElse(new ArrayList[ErgoToken]) val burnTokens = JavaHelpers.createTokensMap( - Iso.isoJListErgoTokenToMapPair.to(_tokensToBurn.getOrElse(new ArrayList[ErgoToken]))) + Iso.isoJListErgoTokenToMapPair.to(requestedToBurn)) val rewardDelay = if (_ctx.getNetworkType == NetworkType.MAINNET) Parameters.MinerRewardDelay_Mainnet else @@ -129,7 +131,7 @@ class UnsignedTransactionBuilderImpl(val _ctx: BlockchainContextImpl) extends Un changeAddress = changeAddress, minChangeValue = MinChangeValue, minerRewardDelay = rewardDelay, burnTokens = burnTokens, - boxSelector = DefaultBoxSelector).get + boxSelector = new DefaultBoxSelector(None)).get // the method above don't accept ContextExtension along with inputs, thus, after the // transaction has been built we need to zip with the extensions that have been @@ -140,10 +142,10 @@ class UnsignedTransactionBuilderImpl(val _ctx: BlockchainContextImpl) extends Un ) val stateContext = createErgoLikeStateContext - new UnsignedTransactionImpl(txWithExtensions, boxesToSpend, dataInputBoxes, changeAddress, stateContext, _ctx) + new UnsignedTransactionImpl(txWithExtensions, boxesToSpend, dataInputBoxes, changeAddress, stateContext, _ctx, requestedToBurn) } - private def createErgoLikeStateContext: ErgoLikeStateContext = new ErgoLikeStateContext() { + private[appkit] def createErgoLikeStateContext: ErgoLikeStateContext = new ErgoLikeStateContext() { private val _allHeaders = Colls.fromArray(JavaConversions.asScalaIterator( _ctx.getHeaders.iterator).map(h => ScalaBridge.toSigmaHeader(h)).toArray) diff --git a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionImpl.java b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionImpl.java index 87ac27ce..9159f2bf 100644 --- a/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionImpl.java +++ b/lib-impl/src/main/java/org/ergoplatform/appkit/impl/UnsignedTransactionImpl.java @@ -4,11 +4,7 @@ import org.ergoplatform.ErgoBox; import org.ergoplatform.ErgoBoxCandidate; import org.ergoplatform.UnsignedErgoLikeTransaction; -import org.ergoplatform.appkit.ErgoId; -import org.ergoplatform.appkit.ExtendedInputBox; -import org.ergoplatform.appkit.InputBox; -import org.ergoplatform.appkit.OutBox; -import org.ergoplatform.appkit.UnsignedTransaction; +import org.ergoplatform.appkit.*; import org.ergoplatform.wallet.protocol.context.ErgoLikeStateContext; import java.util.ArrayList; @@ -16,10 +12,13 @@ import scala.collection.JavaConversions; +import javax.annotation.Nonnull; + public class UnsignedTransactionImpl implements UnsignedTransaction { private final UnsignedErgoLikeTransaction _tx; private List _boxesToSpend; private List _dataBoxes; + private List _tokensToBurn; private List _outputs; private ErgoAddress _changeAddress; private ErgoLikeStateContext _stateContext; @@ -28,10 +27,13 @@ public class UnsignedTransactionImpl implements UnsignedTransaction { public UnsignedTransactionImpl( UnsignedErgoLikeTransaction tx, List boxesToSpend, - List dataBoxes, ErgoAddress changeAddress, ErgoLikeStateContext stateContext, BlockchainContextImpl ctx) { + List dataBoxes, ErgoAddress changeAddress, + ErgoLikeStateContext stateContext, BlockchainContextImpl ctx, + List tokensToBurn) { _tx = tx; _boxesToSpend = boxesToSpend; _dataBoxes = dataBoxes; + _tokensToBurn = tokensToBurn; _outputs = JavaConversions.seqAsJavaList(_tx.outputs()); _changeAddress = changeAddress; _stateContext = stateContext; @@ -99,4 +101,9 @@ public List getDataInputs() { public ErgoAddress getChangeAddress() { return _changeAddress; } + + @Override + public @Nonnull List getTokensToBurn() { + return _tokensToBurn; + } }