From f485d3a2cce93b715d0157fef1eac57ad4c2c759 Mon Sep 17 00:00:00 2001 From: gfanton Date: Sun, 8 Sep 2024 02:37:01 +0000 Subject: [PATCH] chore: update test4.gno.land backup --- test4.gno.land/README.md | 22 +- test4.gno.land/backup_1349370-1381001.jsonl | 28 ++ .../varmeta/dns/grc721:1325930/basic_nft.gno | 378 ++++++++++++++++++ .../p/varmeta/dns/grc721:1325930/errors.gno | 22 + .../dns/grc721:1325930/grc721_metadata.gno | 95 +++++ .../dns/grc721:1325930/grc721_royalty.gno | 78 ++++ .../p/varmeta/dns/grc721:1325930/igrc721.gno | 39 ++ .../dns/grc721:1325930/igrc721_metadata.gno | 38 ++ .../dns/grc721:1325930/igrc721_royalty.gno | 16 + .../dns/grc721:1325930/pkg_metadata.json | 1 + .../p/varmeta/dns/grc721:1325930/util.gno | 18 + test4.gno.land/metadata.json | 2 +- 12 files changed, 725 insertions(+), 12 deletions(-) create mode 100755 test4.gno.land/backup_1349370-1381001.jsonl create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/basic_nft.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/errors.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_metadata.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_royalty.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_metadata.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_royalty.gno create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/pkg_metadata.json create mode 100644 test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/util.gno diff --git a/test4.gno.land/README.md b/test4.gno.land/README.md index ea617abd..17b639cd 100644 --- a/test4.gno.land/README.md +++ b/test4.gno.land/README.md @@ -2,7 +2,7 @@ ## TXs ``` -19064 +19092 ``` ## addpkgs @@ -11,23 +11,23 @@ ## top realm calls ``` - 3919 "gno.land/r/demo/wugnot" + 3957 "gno.land/r/demo/wugnot" 1142 "gno.land/r/gnoswap/gns" + 767 "gno.land/r/gnoswap/v2/gns" 764 "gno.land/r/gnoswap/router" 755 "gno.land/r/gnoswap/position" - 750 "gno.land/r/gnoswap/v2/gns" 654 "gno.land/r/gnoswap/gnft" - 579 "gno.land/r/onbloc/usdc" - 565 "gno.land/r/gnoswap/v2/router" - 491 "gno.land/r/onbloc/foo" - 459 "gno.land/r/gnoswap/v2/position" - 335 "gno.land/r/gnoswap/v2/staker" - 321 "gno.land/r/gnoswap/v2/gnft" + 580 "gno.land/r/onbloc/usdc" + 579 "gno.land/r/gnoswap/v2/router" + 502 "gno.land/r/onbloc/foo" + 473 "gno.land/r/gnoswap/v2/position" + 342 "gno.land/r/gnoswap/v2/staker" + 327 "gno.land/r/gnoswap/v2/gnft" 320 "gno.land/r/gnoswap/staker" - 308 "gno.land/r/onbloc/bar" + 312 "gno.land/r/onbloc/bar" 241 "gno.land/r/onbloc/baz" 201 "gno.land/r/flippando/flippando" - 126 "gno.land/r/onbloc/obl" + 132 "gno.land/r/onbloc/obl" 112 "gno.land/r/gnoswap/pool" 107 "gno.land/r/g17ernafy6ctpcz6uepfsq2js8x2vz0wladh5yc3/zentasktic_core" 92 "gno.land/r/gov/dao" diff --git a/test4.gno.land/backup_1349370-1381001.jsonl b/test4.gno.land/backup_1349370-1381001.jsonl new file mode 100755 index 00000000..b60e0dc7 --- /dev/null +++ b/test4.gno.land/backup_1349370-1381001.jsonl @@ -0,0 +1,28 @@ +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","10000000"]},{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"10000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"CreateExternalIncentive","args":["gno.land/r/demo/wugnot:gno.land/r/onbloc/usdc:3000","gnot","10000000","1725753600","1733529600"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwtX3SwmymfTyTeeti8mLbp/Ni+BDjinvKEZ0OxmIsD4"},"signature":"yISdgJkAXoCcV/BC+2lfmHSEH3w4DpU7prgy5Iz+3yVi1yv4ay72Qkd+v2jrqxiCmNk45pBRac3XpvRaM4MGSw=="}],"memo":""},"blockNum":"1359196"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","send":"10000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/gnoswap/v2/gns","10000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/gnoswap/v2/gns:3000","100","10005920"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwtX3SwmymfTyTeeti8mLbp/Ni+BDjinvKEZ0OxmIsD4"},"signature":"5wj2kqhFx9XRtTxZ7hIhm/aOjCIWiKSTF5JYbVFFA5ZnXG7icC7nyob4OsooG1pA9te5lf/2Jt9bWC8cnp3seg=="}],"memo":""},"blockNum":"1359253"} +{"tx":{"msg":[{"@type":"/bank.MsgSend","from_address":"g1njagaeg7e398hze39ygfgvc4gwsh6lkz7dwnuz","to_address":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","amount":"15000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"As2VmUYjIs+Q+esyTyrgv8nQpAtImqdkUUKCpJYzNQ4a"},"signature":"3E4ex0UuPORih4biJI5tP3XqaWSH5j778J3EgDkskf4KKUOAKN7921GiEtB2IGd6vzpaRaOz1UdIGBBs5jD6lg=="}],"memo":""},"blockNum":"1365345"} +{"tx":{"msg":[{"@type":"/bank.MsgSend","from_address":"g1njagaeg7e398hze39ygfgvc4gwsh6lkz7dwnuz","to_address":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","amount":"15000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"As2VmUYjIs+Q+esyTyrgv8nQpAtImqdkUUKCpJYzNQ4a"},"signature":"gAhLIyjWTzDOouVGfR1Bpa64JxRlW8E1u9bWMKx8kQFS9QnlaAJzVgJrXuu2aHcmuFmP+amOd/bVV2F/Pv6RpA=="}],"memo":""},"blockNum":"1365351"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"7500000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/gnoswap/v2/gns","7500000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/gnoswap/v2/gns:3000","100","7504436"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"1LTSMFdX03qS3yewQCxWVTyFbAWVJjRHbQaXsG277kBwVu4wECEgwmI7MuCBAKV5m68dwKt4yC+aBjm4TT/GtA=="}],"memo":""},"blockNum":"1365697"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"5000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/onbloc/obl","5000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/onbloc/baz:3000*POOL*gno.land/r/onbloc/baz:gno.land/r/onbloc/usdc:3000*POOL*gno.land/r/onbloc/usdc:gno.land/r/onbloc/obl:3000","100","12010982"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"ICXIqL2sjmxHh14Xe1BiJPMlKBSeDq1lYWxli/5mx9FG59AmTg71lI3HhARw8EvHFLnhFpR76k1kw/4hQOSHbw=="}],"memo":""},"blockNum":"1365706"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/onbloc/obl","gnot","20000000","EXACT_IN","gno.land/r/onbloc/obl:gno.land/r/onbloc/foo:3000*POOL*gno.land/r/onbloc/foo:gno.land/r/demo/wugnot:3000","100","8324611"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"dlRhZ890OoY7klULUBQb79GyN9kGPN3hZRL8AnOV4MVT/iI1t5qeaWymnuflvyEcAvZHrEvnpCXLjY/6p8pFwA=="}],"memo":""},"blockNum":"1365714"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/onbloc/foo","gno.land/r/onbloc/obl","5000000","EXACT_IN","gno.land/r/onbloc/foo:gno.land/r/demo/wugnot:3000*POOL*gno.land/r/demo/wugnot:gno.land/r/onbloc/usdc:3000*POOL*gno.land/r/onbloc/usdc:gno.land/r/onbloc/obl:3000","100","5490755"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"pTlctRHoQZXEYmaKN5C5V6mM129zUs/BscmXf+/CZe10KtOLPDqyP6+VHkQ/weVPK6Z07vCstOGUkLOskg8a8A=="}],"memo":""},"blockNum":"1365736"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/obl","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/onbloc/obl","gnot","10000000","EXACT_IN","gno.land/r/onbloc/obl:gno.land/r/onbloc/foo:3000*POOL*gno.land/r/onbloc/foo:gno.land/r/demo/wugnot:3000","100","4162252"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"eWJ3QbhE6GoJfuiLF4C1DZQzG6YFH1NqbiqcwPKJRZ9A2eIVnQQZCcW/r10OXaBZ5pJ55t5YVfnJ7gKMjAEbYA=="}],"memo":""},"blockNum":"1365746"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["65"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"CollectReward","args":["65","true"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["99"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"CollectReward","args":["99","true"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["101"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"CollectReward","args":["101","true"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["126"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["147"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"f5p0KY5Q8w7C6opPe1n4MECxeUw0HOMc+vNckj1PT8p5JJq4WTDBXuXWwimUIIJZJgeP8U+r0wmbHsKjq+0nRg=="}],"memo":""},"blockNum":"1365753"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","5000000"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","5064187"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1vsm68lq9cpn7x507s6gh59anmx86kxfhzyszu2","5000000"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"5000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/position","func":"Mint","args":["gnot","gno.land/r/gnoswap/v2/gns","3000","-6840","7020","5000000","5064187","4975000","5038866","7282571140","g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"SetTokenURILast","args":null}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"97PA8lCFzPQE4s005hBPfSB8pKpWt90nLa+FuMf9vvpQEG4nkFRsISfFU1refksST9jzEyG0FjMmrNtAp+EYCg=="}],"memo":""},"blockNum":"1365759"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","147"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"StakeToken","args":["147"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"hM3PiAIOu1WT4A7+sSNgvqIsgtMbWRBM3ycFX9mulVxCfn5mVQXJ1cUdaFDs1zWZWj2OoHXvot/9qKbeb06tUQ=="}],"memo":""},"blockNum":"1365767"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["56"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["134"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["139"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"OK1wansTHrISCKniCKMCHHFWXHh9dJhkabruQpeDFuI9QxarAqX0lqtJak4vPVuHDo2Z5Qr/fNAjJVXgcximPA=="}],"memo":""},"blockNum":"1365774"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","139"]},{"@type":"/vm.m_call","caller":"g1n9n6t76ec46zgcqejkmwhlswt82r3a580lskj8","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"StakeToken","args":["139"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ag77S86k6lyPZlTewqaST1Uu0FGsatZ5Qy18kma5b5PB"},"signature":"csOTrqK6yjqCDrP9ycPzj66qLCVx3Zdl/RxBIiPNdHw/oTHX9EjfQw5ZnsIhllyco1vFAFlrBHr6DWxC7FOaFA=="}],"memo":""},"blockNum":"1365781"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"1000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/gnoswap/v2/gns","1000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/gnoswap/v2/gns:3000","100","1000590"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkV8iBO1O0beH6awpjq1LfePULXIHW9N7+SyaXXeE9nc"},"signature":"TvUsZQEQ/jba6zBJ9RHM7JisCMbw9O/HS+ByH7fT0QsJfUqqZQyvmrHxbKIIO83jxRifm/QcVjLJlqgiJXii2g=="}],"memo":""},"blockNum":"1368497"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/onbloc/usdc","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/gnoswap/v2/gns","gno.land/r/onbloc/usdc","1320000","EXACT_IN","gno.land/r/gnoswap/v2/gns:gno.land/r/onbloc/usdc:3000","100","1317067"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkV8iBO1O0beH6awpjq1LfePULXIHW9N7+SyaXXeE9nc"},"signature":"vYk0xqr6puwx92shbkZffZH31nKlV8jInEEmWjIi2y0xU/JCwE43Ak/aTEjHtJwECpd8XyaGqM4q6fWLcmjcbw=="}],"memo":""},"blockNum":"1368529"} +{"tx":{"msg":[{"@type":"/bank.MsgSend","from_address":"g1njagaeg7e398hze39ygfgvc4gwsh6lkz7dwnuz","to_address":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","amount":"15000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"As2VmUYjIs+Q+esyTyrgv8nQpAtImqdkUUKCpJYzNQ4a"},"signature":"PxjR4asBVgOcnpqxqlO9/YAToIWK3Quckt37YZWXgnRjcyGNqkhsVE2gGzJvApQzlU+kdfzQn38/GNF6o9VXtQ=="}],"memo":""},"blockNum":"1372042"} +{"tx":{"msg":[{"@type":"/bank.MsgSend","from_address":"g1njagaeg7e398hze39ygfgvc4gwsh6lkz7dwnuz","to_address":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","amount":"15000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"As2VmUYjIs+Q+esyTyrgv8nQpAtImqdkUUKCpJYzNQ4a"},"signature":"8+8rxVeGs23knQpJshLbf80qMWWjv5ueT0zHbpl6/hEvGTl4iZCa3kMJVh2cAWttnpBC8RSM36iLU8ITyFOqyQ=="}],"memo":""},"blockNum":"1372054"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"12000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/gnoswap/v2/gns","12000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/gnoswap/v2/gns:3000","100","12007091"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"YoH4jkImmP0JXDc8fDq263kMKaQ+yP55MQ2ZNqyiGWJIyNjYHYULuHoUZDb9ppNzFLel6M+sMxlbrVIAADiAZA=="}],"memo":""},"blockNum":"1373064"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"5000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/onbloc/foo","5000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/onbloc/usdc:3000*POOL*gno.land/r/onbloc/usdc:gno.land/r/onbloc/obl:3000*POOL*gno.land/r/onbloc/obl:gno.land/r/onbloc/foo:3000","100","10943973"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"LWus7a0KmJeXixD8REkIsEB9F/DLM8h0jBzBzYSYnLc1fMgYYCsDwKBayxpdW7keDDb4FJUscTckbBk/UPJQsw=="}],"memo":""},"blockNum":"1373070"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/bar","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"15000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gnot","gno.land/r/onbloc/bar","15000000","EXACT_IN","gno.land/r/demo/wugnot:gno.land/r/onbloc/baz:3000*POOL*gno.land/r/onbloc/baz:gno.land/r/onbloc/bar:3000","100","291404198"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"5YGVCGbL4wPhHCs29dUBRmCrm16NDCGBDRROHakA/CUwhV0m87QWRx9hx0XAQiqv8Sl8gW5qWnn7oZFIibb72g=="}],"memo":""},"blockNum":"1373083"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/bar","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/bar","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/onbloc/bar","gno.land/r/gnoswap/v2/gns","100000000","EXACT_IN","gno.land/r/onbloc/bar:gno.land/r/onbloc/baz:3000*POOL*gno.land/r/onbloc/baz:gno.land/r/demo/wugnot:3000*POOL*gno.land/r/demo/wugnot:gno.land/r/gnoswap/v2/gns:3000,gno.land/r/onbloc/bar:gno.land/r/demo/wugnot:3000*POOL*gno.land/r/demo/wugnot:gno.land/r/onbloc/usdc:3000*POOL*gno.land/r/onbloc/usdc:gno.land/r/gnoswap/v2/gns:3000","85,15","5869274"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"Cb5sg73ucRAnUnPzEeZs7YnyNEQOCfKLhDQ71JDqE9Vte8Pe/ZD6L7+1jJhwse2lf8nHtQhaET/lOaCp9rUwnA=="}],"memo":""},"blockNum":"1373109"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/gnoswap/v2/gns","gno.land/r/onbloc/foo","10000000","EXACT_IN","gno.land/r/gnoswap/v2/gns:gno.land/r/onbloc/usdc:3000*POOL*gno.land/r/onbloc/usdc:gno.land/r/onbloc/obl:3000*POOL*gno.land/r/onbloc/obl:gno.land/r/onbloc/foo:3000","100","21715946"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"1IQ4OTt5TtkeLW5tm30tvmitp2ZsP4BG5cgpvSFia3N+msxzrUAwiS3zDRQ5nZR5H1xqcdMgGrSq8JtzontFEQ=="}],"memo":""},"blockNum":"1373126"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","20000000"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/bar","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","178184133"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1vsm68lq9cpn7x507s6gh59anmx86kxfhzyszu2","20000000"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"20000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/position","func":"Mint","args":["gnot","gno.land/r/onbloc/bar","3000","15000","28860","20000000","178184133","19900000","177293212","7282571140","g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"SetTokenURILast","args":null}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"3uHy+IDxnNaQ93l/hGEttTuCt8h3ASdD9bjLc6K/ucRf+jwyQ3xelZBZEtm6iDDEIigbPMK1OANI8c1U37DmzA=="}],"memo":""},"blockNum":"1373147"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["39"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["136"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/position","func":"CollectFee","args":["153"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"Y4G7Hy0dkubOyaIPOSjb9bxXYCx6aTbh8DY2hFnhPWZpnAnEyJyu4l7s2BOm9yyTia2kOMHJ65hHwIKM6xlJcw=="}],"memo":""},"blockNum":"1373159"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","15000000"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/onbloc/foo","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","32611659"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1vsm68lq9cpn7x507s6gh59anmx86kxfhzyszu2","15000000"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"15000000ugnot","pkg_path":"gno.land/r/gnoswap/v2/position","func":"Mint","args":["gnot","gno.land/r/onbloc/foo","3000","840","14700","15000000","32611659","14925000","32448601","7282571140","g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"SetTokenURILast","args":null}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"jVfO4o8z8uNPxB7J1liHtjHQLtrMCTXpKYqlc7gnTCMzI4MQU8qXrh2NQu7pxcXP63Ra4j/dOV6MWlffhyTdpQ=="}],"memo":""},"blockNum":"1373174"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/gnft","func":"Approve","args":["g14fclvfqynndp0l6kpyxkpgn4sljw9rr96hz46l","167"]},{"@type":"/vm.m_call","caller":"g1s9u2nxwg2qftvxszqq2gdkzqmr6pmvav4q4lkc","send":"","pkg_path":"gno.land/r/gnoswap/v2/staker","func":"StakeToken","args":["167"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBLYKtI5YjFhkkspn0XG82pSc4nulX2VLybSaJsrccb"},"signature":"sjGLhuJDE5CH/nNgoroygAebVvwXW8+nVvL46C7zW0hmu1zgEzdsdmM+5F+7hdjYzGIU3SZCUXOtktNOHCq7Ug=="}],"memo":""},"blockNum":"1373188"} +{"tx":{"msg":[{"@type":"/vm.m_call","caller":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g126swhfaq2vyvvjywevhgw7lv9hg8qan93dasu8","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","send":"","pkg_path":"gno.land/r/gnoswap/v2/gns","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Approve","args":["g1cnz5gm2l09pm2k6rknjjar9a2w53fdhk4yjzy5","18446744073709551615"]},{"@type":"/vm.m_call","caller":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","send":"","pkg_path":"gno.land/r/gnoswap/v2/router","func":"SwapRoute","args":["gno.land/r/gnoswap/v2/gns","gnot","1000000000","EXACT_IN","gno.land/r/gnoswap/v2/gns:gno.land/r/demo/wugnot:3000","100","980537094"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0REeqvgrSR/YAi3wOjOOV+87fR/8+0N+eVmwzLfEiq"},"signature":"XO+gAHddajbDXe5e15o/zJtFKujZr2yIIzKoMspP6VwM88++/jV/24jzauF4RgV9EqQcdQxtzvWNXAX7uCac0g=="}],"memo":""},"blockNum":"1377310"} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/basic_nft.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/basic_nft.gno new file mode 100644 index 00000000..bec7338d --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/basic_nft.gno @@ -0,0 +1,378 @@ +package grc721 + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ufmt" +) + +type basicNFT struct { + name string + symbol string + owners avl.Tree // tokenId -> OwnerAddress + balances avl.Tree // OwnerAddress -> TokenCount + tokenApprovals avl.Tree // TokenId -> ApprovedAddress + tokenURIs avl.Tree // TokenId -> URIs + operatorApprovals avl.Tree // "OwnerAddress:OperatorAddress" -> bool +} + +// Returns new basic NFT +func NewBasicNFT(name string, symbol string) *basicNFT { + return &basicNFT{ + name: name, + symbol: symbol, + + owners: avl.Tree{}, + balances: avl.Tree{}, + tokenApprovals: avl.Tree{}, + tokenURIs: avl.Tree{}, + operatorApprovals: avl.Tree{}, + } +} + +func (s *basicNFT) Name() string { return s.name } +func (s *basicNFT) Symbol() string { return s.symbol } +func (s *basicNFT) TokenCount() uint64 { return uint64(s.owners.Size()) } + +// BalanceOf returns balance of input address +func (s *basicNFT) BalanceOf(addr std.Address) (uint64, error) { + if err := isValidAddress(addr); err != nil { + return 0, err + } + + balance, found := s.balances.Get(addr.String()) + if !found { + return 0, nil + } + + return balance.(uint64), nil +} + +// OwnerOf returns owner of input token id +func (s *basicNFT) OwnerOf(tid TokenID) (std.Address, error) { + owner, found := s.owners.Get(string(tid)) + if !found { + return "", ErrInvalidTokenId + } + + return owner.(std.Address), nil +} + +// TokenURI returns the URI of input token id +func (s *basicNFT) TokenURI(tid TokenID) (string, error) { + uri, found := s.tokenURIs.Get(string(tid)) + if !found { + return "", ErrInvalidTokenId + } + + return uri.(string), nil +} + +func (s *basicNFT) SetTokenURI(tid TokenID, tURI TokenURI) (bool, error) { + // check for invalid TokenID + if !s.exists(tid) { + return false, ErrInvalidTokenId + } + + // check for the right owner + owner, err := s.OwnerOf(tid) + if err != nil { + return false, err + } + caller := std.PrevRealm().Addr() + if caller != owner { + return false, ErrCallerIsNotOwner + } + s.tokenURIs.Set(string(tid), string(tURI)) + return true, nil +} + +// IsApprovedForAll returns true if operator is approved for all by the owner. +// Otherwise, returns false +func (s *basicNFT) IsApprovedForAll(owner, operator std.Address) bool { + key := owner.String() + ":" + operator.String() + _, found := s.operatorApprovals.Get(key) + if !found { + return false + } + + return true +} + +// Approve approves the input address for particular token +func (s *basicNFT) Approve(to std.Address, tid TokenID) error { + if err := isValidAddress(to); err != nil { + return err + } + + owner, err := s.OwnerOf(tid) + if err != nil { + return err + } + if owner == to { + return ErrApprovalToCurrentOwner + } + + caller := std.PrevRealm().Addr() + if caller != owner && !s.IsApprovedForAll(owner, caller) { + return ErrCallerIsNotOwnerOrApproved + } + + s.tokenApprovals.Set(string(tid), to.String()) + event := ApprovalEvent{owner, to, tid} + emit(&event) + + return nil +} + +// GetApproved return the approved address for token +func (s *basicNFT) GetApproved(tid TokenID) (std.Address, error) { + addr, found := s.tokenApprovals.Get(string(tid)) + if !found { + return zeroAddress, ErrTokenIdNotHasApproved + } + + return std.Address(addr.(string)), nil +} + +// SetApprovalForAll can approve the operator to operate on all tokens +func (s *basicNFT) SetApprovalForAll(operator std.Address, approved bool) error { + if err := isValidAddress(operator); err != nil { + return ErrInvalidAddress + } + + caller := std.PrevRealm().Addr() + return s.setApprovalForAll(caller, operator, approved) +} + +// Safely transfers `tokenId` token from `from` to `to`, checking that +// contract recipients are aware of the GRC721 protocol to prevent +// tokens from being forever locked. +func (s *basicNFT) SafeTransferFrom(from, to std.Address, tid TokenID) error { + caller := std.PrevRealm().Addr() + if !s.isApprovedOrOwner(caller, tid) { + return ErrCallerIsNotOwnerOrApproved + } + + err := s.transfer(from, to, tid) + if err != nil { + return err + } + + if !s.checkOnGRC721Received(from, to, tid) { + return ErrTransferToNonGRC721Receiver + } + + return nil +} + +// Transfers `tokenId` token from `from` to `to`. +func (s *basicNFT) TransferFrom(from, to std.Address, tid TokenID) error { + caller := std.PrevRealm().Addr() + if !s.isApprovedOrOwner(caller, tid) { + return ErrCallerIsNotOwnerOrApproved + } + + err := s.transfer(from, to, tid) + if err != nil { + return err + } + + return nil +} + +// Mints `tokenId` and transfers it to `to`. +func (s *basicNFT) Mint(to std.Address, tid TokenID) error { + return s.mint(to, tid) +} + +// Mints `tokenId` and transfers it to `to`. Also checks that +// contract recipients are using GRC721 protocol +func (s *basicNFT) SafeMint(to std.Address, tid TokenID) error { + err := s.mint(to, tid) + if err != nil { + return err + } + + if !s.checkOnGRC721Received(zeroAddress, to, tid) { + return ErrTransferToNonGRC721Receiver + } + + return nil +} + +func (s *basicNFT) Burn(tid TokenID) error { + owner, err := s.OwnerOf(tid) + if err != nil { + return err + } + + s.beforeTokenTransfer(owner, zeroAddress, tid, 1) + + s.tokenApprovals.Remove(string(tid)) + balance, err := s.BalanceOf(owner) + if err != nil { + return err + } + balance -= 1 + s.balances.Set(owner.String(), balance) + s.owners.Remove(string(tid)) + + event := TransferEvent{owner, zeroAddress, tid} + emit(&event) + + s.afterTokenTransfer(owner, zeroAddress, tid, 1) + + return nil +} + +/* Helper methods */ + +// Helper for SetApprovalForAll() +func (s *basicNFT) setApprovalForAll(owner, operator std.Address, approved bool) error { + if owner == operator { + return ErrApprovalToCurrentOwner + } + + key := owner.String() + ":" + operator.String() + s.operatorApprovals.Set(key, approved) + + event := ApprovalForAllEvent{owner, operator, approved} + emit(&event) + + return nil +} + +// Helper for TransferFrom() and SafeTransferFrom() +func (s *basicNFT) transfer(from, to std.Address, tid TokenID) error { + if err := isValidAddress(from); err != nil { + return ErrInvalidAddress + } + if err := isValidAddress(to); err != nil { + return ErrInvalidAddress + } + + if from == to { + return ErrCannotTransferToSelf + } + + owner, err := s.OwnerOf(tid) + if err != nil { + return err + } + if owner != from { + return ErrTransferFromIncorrectOwner + } + + s.beforeTokenTransfer(from, to, tid, 1) + + // Check that tokenId was not transferred by `beforeTokenTransfer` + owner, err = s.OwnerOf(tid) + if err != nil { + return err + } + if owner != from { + return ErrTransferFromIncorrectOwner + } + + s.tokenApprovals.Remove(string(tid)) + fromBalance, err := s.BalanceOf(from) + if err != nil { + return err + } + toBalance, err := s.BalanceOf(to) + if err != nil { + return err + } + fromBalance -= 1 + toBalance += 1 + s.balances.Set(from.String(), fromBalance) + s.balances.Set(to.String(), toBalance) + s.owners.Set(string(tid), to) + + event := TransferEvent{from, to, tid} + emit(&event) + + s.afterTokenTransfer(from, to, tid, 1) + + return nil +} + +// Helper for Mint() and SafeMint() +func (s *basicNFT) mint(to std.Address, tid TokenID) error { + if err := isValidAddress(to); err != nil { + return err + } + + if s.exists(tid) { + return ErrTokenIdAlreadyExists + } + + s.beforeTokenTransfer(zeroAddress, to, tid, 1) + + // Check that tokenId was not minted by `beforeTokenTransfer` + if s.exists(tid) { + return ErrTokenIdAlreadyExists + } + + toBalance, err := s.BalanceOf(to) + if err != nil { + return err + } + toBalance += 1 + s.balances.Set(to.String(), toBalance) + s.owners.Set(string(tid), to) + + event := TransferEvent{zeroAddress, to, tid} + emit(&event) + + s.afterTokenTransfer(zeroAddress, to, tid, 1) + + return nil +} + +func (s *basicNFT) isApprovedOrOwner(addr std.Address, tid TokenID) bool { + owner, found := s.owners.Get(string(tid)) + if !found { + return false + } + + if addr == owner.(std.Address) || s.IsApprovedForAll(owner.(std.Address), addr) { + return true + } + + _, err := s.GetApproved(tid) + if err != nil { + return false + } + + return true +} + +// Checks if token id already exists +func (s *basicNFT) exists(tid TokenID) bool { + _, found := s.owners.Get(string(tid)) + return found +} + +func (s *basicNFT) beforeTokenTransfer(from, to std.Address, firstTokenId TokenID, batchSize uint64) { + // TODO: Implementation +} + +func (s *basicNFT) afterTokenTransfer(from, to std.Address, firstTokenId TokenID, batchSize uint64) { + // TODO: Implementation +} + +func (s *basicNFT) checkOnGRC721Received(from, to std.Address, tid TokenID) bool { + // TODO: Implementation + return true +} + +func (s *basicNFT) RenderHome() (str string) { + str += ufmt.Sprintf("# %s ($%s)\n\n", s.name, s.symbol) + str += ufmt.Sprintf("* **Total supply**: %d\n", s.TokenCount()) + str += ufmt.Sprintf("* **Known accounts**: %d\n", s.balances.Size()) + + return +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/errors.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/errors.gno new file mode 100644 index 00000000..2d512db3 --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/errors.gno @@ -0,0 +1,22 @@ +package grc721 + +import "errors" + +var ( + ErrInvalidTokenId = errors.New("invalid token id") + ErrInvalidAddress = errors.New("invalid address") + ErrTokenIdNotHasApproved = errors.New("token id not approved for anyone") + ErrApprovalToCurrentOwner = errors.New("approval to current owner") + ErrCallerIsNotOwner = errors.New("caller is not token owner") + ErrCallerNotApprovedForAll = errors.New("caller is not approved for all") + ErrCannotTransferToSelf = errors.New("cannot send transfer to self") + ErrTransferFromIncorrectOwner = errors.New("transfer from incorrect owner") + ErrTransferToNonGRC721Receiver = errors.New("transfer to non GRC721Receiver implementer") + ErrCallerIsNotOwnerOrApproved = errors.New("caller is not token owner or approved") + ErrTokenIdAlreadyExists = errors.New("token id already exists") + + // ERC721Royalty + ErrInvalidRoyaltyPercentage = errors.New("invalid royalty percentage") + ErrInvalidRoyaltyPaymentAddress = errors.New("invalid royalty paymentAddress") + ErrCannotCalculateRoyaltyAmount = errors.New("cannot calculate royalty amount") +) diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_metadata.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_metadata.gno new file mode 100644 index 00000000..360f73ed --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_metadata.gno @@ -0,0 +1,95 @@ +package grc721 + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// metadataNFT represents an NFT with metadata extensions. +type metadataNFT struct { + *basicNFT // Embedded basicNFT struct for basic NFT functionality + extensions *avl.Tree // AVL tree for storing metadata extensions +} + +// Ensure that metadataNFT implements the IGRC721MetadataOnchain interface. +var _ IGRC721MetadataOnchain = (*metadataNFT)(nil) + +// NewNFTWithMetadata creates a new basic NFT with metadata extensions. +func NewNFTWithMetadata(name string, symbol string) *metadataNFT { + // Create a new basic NFT + nft := NewBasicNFT(name, symbol) + + // Return a metadataNFT with basicNFT embedded and an empty AVL tree for extensions + return &metadataNFT{ + basicNFT: nft, + extensions: avl.NewTree(), + } +} + +// SetTokenMetadata sets metadata for a given token ID. +func (s *metadataNFT) SetTokenMetadata(tid TokenID, metadata Metadata) error { + // Check if the caller is the owner of the token + owner, err := s.basicNFT.OwnerOf(tid) + if err != nil { + return err + } + caller := std.PrevRealm().Addr() + if caller != owner { + return ErrCallerIsNotOwner + } + + // Set the metadata for the token ID in the extensions AVL tree + s.extensions.Set(string(tid), metadata) + return nil +} + +// TokenMetadata retrieves metadata for a given token ID. +func (s *metadataNFT) TokenMetadata(tid TokenID) (Metadata, error) { + // Retrieve metadata from the extensions AVL tree + metadata, found := s.extensions.Get(string(tid)) + if !found { + return Metadata{}, ErrInvalidTokenId + } + + return metadata.(Metadata), nil +} + +// mint mints a new token and assigns it to the specified address. +func (s *metadataNFT) mint(to std.Address, tid TokenID) error { + // Check if the address is valid + if err := isValidAddress(to); err != nil { + return err + } + + // Check if the token ID already exists + if s.basicNFT.exists(tid) { + return ErrTokenIdAlreadyExists + } + + s.basicNFT.beforeTokenTransfer(zeroAddress, to, tid, 1) + + // Check if the token ID was minted by beforeTokenTransfer + if s.basicNFT.exists(tid) { + return ErrTokenIdAlreadyExists + } + + // Increment balance of the recipient address + toBalance, err := s.basicNFT.BalanceOf(to) + if err != nil { + return err + } + toBalance += 1 + s.basicNFT.balances.Set(to.String(), toBalance) + + // Set owner of the token ID to the recipient address + s.basicNFT.owners.Set(string(tid), to) + + // Emit transfer event + event := TransferEvent{zeroAddress, to, tid} + emit(&event) + + s.basicNFT.afterTokenTransfer(zeroAddress, to, tid, 1) + + return nil +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_royalty.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_royalty.gno new file mode 100644 index 00000000..9831c709 --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/grc721_royalty.gno @@ -0,0 +1,78 @@ +package grc721 + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// royaltyNFT represents a non-fungible token (NFT) with royalty functionality. +type royaltyNFT struct { + *metadataNFT // Embedding metadataNFT for NFT functionality + tokenRoyaltyInfo *avl.Tree // AVL tree to store royalty information for each token + maxRoyaltyPercentage uint64 // maxRoyaltyPercentage represents the maximum royalty percentage that can be charged every sale +} + +// Ensure that royaltyNFT implements the IGRC2981 interface. +var _ IGRC2981 = (*royaltyNFT)(nil) + +// NewNFTWithRoyalty creates a new royalty NFT with the specified name, symbol, and royalty calculator. +func NewNFTWithRoyalty(name string, symbol string) *royaltyNFT { + // Create a new NFT with metadata + nft := NewNFTWithMetadata(name, symbol) + + return &royaltyNFT{ + metadataNFT: nft, + tokenRoyaltyInfo: avl.NewTree(), + maxRoyaltyPercentage: 100, + } +} + +// SetTokenRoyalty sets the royalty information for a specific token ID. +func (r *royaltyNFT) SetTokenRoyalty(tid TokenID, royaltyInfo RoyaltyInfo) error { + // Validate the payment address + if err := isValidAddress(royaltyInfo.PaymentAddress); err != nil { + return ErrInvalidRoyaltyPaymentAddress + } + + // Check if royalty percentage exceeds maxRoyaltyPercentage + if royaltyInfo.Percentage > r.maxRoyaltyPercentage { + return ErrInvalidRoyaltyPercentage + } + + // Check if the caller is the owner of the token + owner, err := r.metadataNFT.OwnerOf(tid) + if err != nil { + return err + } + caller := std.PrevRealm().Addr() + if caller != owner { + return ErrCallerIsNotOwner + } + + // Set royalty information for the token + r.tokenRoyaltyInfo.Set(string(tid), royaltyInfo) + + return nil +} + +// RoyaltyInfo returns the royalty information for the given token ID and sale price. +func (r *royaltyNFT) RoyaltyInfo(tid TokenID, salePrice uint64) (std.Address, uint64, error) { + // Retrieve royalty information for the token + val, found := r.tokenRoyaltyInfo.Get(string(tid)) + if !found { + return "", 0, ErrInvalidTokenId + } + + royaltyInfo := val.(RoyaltyInfo) + + // Calculate royalty amount + royaltyAmount, _ := r.calculateRoyaltyAmount(salePrice, royaltyInfo.Percentage) + + return royaltyInfo.PaymentAddress, royaltyAmount, nil +} + +func (r *royaltyNFT) calculateRoyaltyAmount(salePrice, percentage uint64) (uint64, error) { + royaltyAmount := (salePrice * percentage) / 100 + return royaltyAmount, nil +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721.gno new file mode 100644 index 00000000..ece48f8e --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721.gno @@ -0,0 +1,39 @@ +package grc721 + +import "std" + +type IGRC721 interface { + BalanceOf(owner std.Address) (uint64, error) + OwnerOf(tid TokenID) (std.Address, error) + SetTokenURI(tid TokenID, tURI TokenURI) (bool, error) + SafeTransferFrom(from, to std.Address, tid TokenID) error + TransferFrom(from, to std.Address, tid TokenID) error + Approve(approved std.Address, tid TokenID) error + SetApprovalForAll(operator std.Address, approved bool) error + GetApproved(tid TokenID) (std.Address, error) + IsApprovedForAll(owner, operator std.Address) bool + Mint(to std.Address, tid TokenID) error +} + +type ( + TokenID string + TokenURI string +) + +type TransferEvent struct { + From std.Address + To std.Address + TokenID TokenID +} + +type ApprovalEvent struct { + Owner std.Address + Approved std.Address + TokenID TokenID +} + +type ApprovalForAllEvent struct { + Owner std.Address + Operator std.Address + Approved bool +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_metadata.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_metadata.gno new file mode 100644 index 00000000..8a2be1ff --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_metadata.gno @@ -0,0 +1,38 @@ +package grc721 + +// IGRC721CollectionMetadata describes basic information about an NFT collection. +type IGRC721CollectionMetadata interface { + Name() string // Name returns the name of the collection. + Symbol() string // Symbol returns the symbol of the collection. +} + +// IGRC721Metadata follows the Ethereum standard +type IGRC721Metadata interface { + IGRC721CollectionMetadata + TokenURI(tid TokenID) (string, error) // TokenURI returns the URI of a specific token. +} + +// IGRC721Metadata follows the OpenSea metadata standard +type IGRC721MetadataOnchain interface { + IGRC721CollectionMetadata + TokenMetadata(tid TokenID) (Metadata, error) +} + +type Trait struct { + DisplayType string + TraitType string + Value string +} + +// see: https://docs.opensea.io/docs/metadata-standards +type Metadata struct { + Image string // URL to the image of the item. Can be any type of image (including SVGs, which will be cached into PNGs by OpenSea), IPFS or Arweave URLs or paths. We recommend using a minimum 3000 x 3000 image. + ImageData string // Raw SVG image data, if you want to generate images on the fly (not recommended). Only use this if you're not including the image parameter. + ExternalURL string // URL that will appear below the asset's image on OpenSea and will allow users to leave OpenSea and view the item on your site. + Description string // Human-readable description of the item. Markdown is supported. + Name string // Name of the item. + Attributes []Trait // Attributes for the item, which will show up on the OpenSea page for the item. + BackgroundColor string // Background color of the item on OpenSea. Must be a six-character hexadecimal without a pre-pended # + AnimationURL string // URL to a multimedia attachment for the item. Supported file extensions: GLTF, GLB, WEBM, MP4, M4V, OGV, OGG, MP3, WAV, OGA, HTML (for rich experiences and interactive NFTs using JavaScript canvas, WebGL, etc.). Scripts and relative paths within the HTML page are now supported. Access to browser extensions is not supported. + YoutubeURL string // URL to a YouTube video (only used if animation_url is not provided). +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_royalty.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_royalty.gno new file mode 100644 index 00000000..c4603d63 --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/igrc721_royalty.gno @@ -0,0 +1,16 @@ +package grc721 + +import "std" + +// IGRC2981 follows the Ethereum standard +type IGRC2981 interface { + // RoyaltyInfo retrieves royalty information for a tokenID and salePrice. + // It returns the payment address, royalty amount, and an error if any. + RoyaltyInfo(tokenID TokenID, salePrice uint64) (std.Address, uint64, error) +} + +// RoyaltyInfo represents royalty information for a token. +type RoyaltyInfo struct { + PaymentAddress std.Address // PaymentAddress is the address where royalty payment should be sent. + Percentage uint64 // Percentage is the royalty percentage. It indicates the percentage of royalty to be paid for each sale. For example : Percentage = 10 => 10% +} diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/pkg_metadata.json b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/pkg_metadata.json new file mode 100644 index 00000000..f7c3b6e7 --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","deposit":""} \ No newline at end of file diff --git a/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/util.gno b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/util.gno new file mode 100644 index 00000000..bb6bf24d --- /dev/null +++ b/test4.gno.land/extracted/p/varmeta/dns/grc721:1325930/util.gno @@ -0,0 +1,18 @@ +package grc721 + +import ( + "std" +) + +var zeroAddress = std.Address("") + +func isValidAddress(addr std.Address) error { + if !addr.IsValid() { + return ErrInvalidAddress + } + return nil +} + +func emit(event interface{}) { + // TODO: setup a pubsub system here? +} diff --git a/test4.gno.land/metadata.json b/test4.gno.land/metadata.json index b92dc1ff..515e8212 100644 --- a/test4.gno.land/metadata.json +++ b/test4.gno.land/metadata.json @@ -1,3 +1,3 @@ { - "latest_block_height": 1349370 + "latest_block_height": 1381001 }